Questions tagged «cast»

3
PostgreSQL使用count()确定百分比(广播问题)
我正在尝试运行以下查询,以提供patients表中具有该refinst列值的行的百分比。我一直得到0的结果。 select (count (refinst) / (select count(*) from patients) * 100) as "Formula" from patients; 该表有15556行,并select count(refinst) from patients告诉我其中的1446 行在该refinst列中有一个值。我想从查询中获得的响应为30.62(1446/15556*100=30.62XXXXX,四舍五入为两位小数)。 我很确定它与计数结果的数据类型有关(我假设的是整数)。如果我将整数除以整数并且结果小于0,则将其截断为0正确吗?如果是这样,有人可以告诉我如何将计数结果转换为2位小数的数字,以便结果也将四舍五入到2位小数吗? 我敢肯定,与多个count语句相比,有一种更好的方法来编写此代码。我正在寻找一种更处理器有效的方法来特别编写此查询。
19 postgresql  count  cast 

1
如何将ctid分解为页码和行号?
表格中的每一行都有一个系统列 ctid,其类型tid表示该行的物理位置: create table t(id serial); insert into t default values; insert into t default values; select ctid , id from t; ctid | ID :---- | -: (0,1)| 1个 (0,2)| 2 dbfiddle 在这里 是什么让刚刚页面数从最好的方式ctid在最适合的类型(例如integer,bigint或numeric(1000,0))? 我能想到的唯一方法是非常丑陋。

1
在SQL Server中本地解码Base64字符串
我varchar在SQL Server的表中有一列,其中包含一个base64编码的文本字符串,我想将其解码为等效的纯文本 SQL Server是否有任何本机功能来处理此类事件? 一个示例base64字符串: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== 解码为: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

1
在PostgreSQL中查询JSONB
我有一个表,persons其中包含两列,一个id和一个基于JSONB的data列(此表仅出于演示目的而制作,可以与PostgreSQL的JSON支持一起使用)。 现在,假设它包含两个记录: 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } 现在,假设我想获得每个25岁以上的人的名字。我尝试过的是: select data->'name' as name from persons where data->'age' > 25 不幸的是,这会导致错误。我可以使用->>代替来解决它->,但是比较不会再按预期进行,因为不是比较数字,而是将它们表示为字符串: select data->'name' as name from persons where data->>'age' > '25' 然后,我发现实际上可以使用->和强制转换为解决此问题int: select data->'name' as name from persons where cast(data->'age' as int) > …

1
使用类型修饰符的数据类型的结果令人惊讶
在讨论此问题的递归CTE解决方案时: 获取每个ID的最后5个不同的值 @ypercube偶然发现了一个令人惊讶的异常,这使我们研究了类型修饰符的处理。我们发现了令人惊讶的行为。 1.类型转换在某些情况下保留类型修饰符 即使指示不要这样做。最基本的例子: SELECT 'vc8'::varchar(8)::varchar varchar至少我会期望(没有修饰符)。但是结果是varchar(8)(带有修饰符)。在下面的小提琴中有许多相关案例。 2.数组串联在某些情况下会丢失类型修饰符 不需要,因此在另一侧犯了错误: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 第一个表达式产生varchar(8)[]预期的效果。 但是第二个,在连接另一个之后,varchar(8)会减少到varchar[](无修饰符)。array_append()以下小提琴中的示例提供类似的行为。 在大多数情况下,所有这些都无关紧要。Postgres不会丢失数据,并且当分配给列时,无论如何该值都被强制为正确的类型。但是,在相反方向上的错误最终导致一个令人惊讶的异常: 3.递归CTE要求数据类型完全匹配 给出此简化表: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); 尽管此rCTE适用于该varchar列vc,但不适用于该varchar(8)列vc8: WITH RECURSIVE cte AS ( …

1
为什么需要将NULL强制转换为列类型?
我有一个帮助程序,它为我生成一些代码以进行批量更新并生成如下所示的SQL: (活动字段和核心字段均为类型boolean) UPDATE fields as t set "active" = new_values."active","core" = new_values."core" FROM (values (true,NULL,3419), (false,NULL,3420) ) as new_values("active","core","id") WHERE new_values.id = t.id; 但是,它失败了: ERROR: column "core" is of type boolean but expression is of type text 我可以通过添加::booleannull 来使其正常工作,但这似乎很奇怪,为什么将NULL视为类型TEXT? 同样,转换起来有点棘手,因为它需要大量的代码重做才能知道它应该将NULL转换为哪种类型(列和值的列表当前是从一个简单的JSON对象数组自动生成的) 。 为什么这是必需的,并且有一个更优雅的解决方案,不需要生成的代码知道NULL的类型? 如果相关,我正在使用Node.JS上的续集来执行此操作,但在Postgres命令行客户端中也得到了相同的结果。
10 postgresql  null  cast 

2
一字节的“ char”类型在PostgreSQL中如何工作?
我经常看到人们在谈论"char"。我没用过 在文档中定义为 类型“ char”(请注意引号)与char(1)的不同之处在于,它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。 并进一步, "char" 1 byte single-byte internal type 那么,如果它是一个字节,则域是什么,您将如何使用它?它是签名的还是未签名的?在@Erwin Brandstetter的这篇文章中,他对此进行了阐述,但我仍然感到困惑。他正在使用ascii()和chr(),并提供了 SELECT i , chr(i)::"char" AS i_encoded , ascii(chr(i)::"char") AS i_decoded FROM generate_series(1,256) i; 这在10到11之间确实很奇怪。 i | i_encoded | i_decoded -----+-----------+----------- ... 8 | \x08 | 8 9 | | 9 10 | +| 10 | | -- …

2
为什么在BIGINT col上进行此搜索具有额外的常量扫描,计算标量和嵌套循环运算符?
当我查看某些查询的实际执行计划时,我注意到WHERE子句中使用的文字常量显示为计算标量和常量扫描的嵌套链。 要重现此,我使用下表 CREATE TABLE Table1 ( [col1] [bigint] NOT NULL, [col2] [varchar](50) NULL, [col3] [char](200) NULL ) CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC) 其中包含一些数据: INSERT INTO Table1(col1) VALUES (1),(2),(3), (-9223372036854775808), (9223372036854775807), (2147483647),(-2147483648) 当我运行以下(废话)查询时: SELECT a.col1, a.col2 FROM Table1 a, Table1 b WHERE b.col1 > 2147483648 我看到它将在Index Seek和标量计算(根据常量)的结果中进行嵌套循环绘制。 请注意,文字大于maxint。它确实有助于写作CAST(2147483648 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.