UNION 类型 text 和 bigint 无法匹配
Posted
技术标签:
【中文标题】UNION 类型 text 和 bigint 无法匹配【英文标题】:UNION types text and bigint cannot be matched 【发布时间】:2020-09-21 17:34:40 【问题描述】:我正在运行一个复杂的存储过程,当我有 3 个联合时出现错误,但有 2 个联合没有错误。如果我删除前两个工会中的任何一个,它就会运行良好。如果我将其中一个 NULL 设为 0,它运行良好。错误是“UNION 类型文本和 bigint 无法匹配”
```lang-sql
SELECT NULL AS total_time_spent
FROM tbl1
GROUP BY student_id
UNION ALL
SELECT NULL AS total_time_spent
FROM tbl2
GROUP BY student_id
UNION ALL
SELECT sum(cast(("value" ->> 'seconds') AS integer)) AS total_time_spent
FROM tbl3
GROUP BY student_id
```
我已经尝试过对总和结果或总和输入进行各种类型的转换。我从中提取的 json 是 NULL、[] 或类似的东西:
["date": "2020-09-17", "seconds": 458]
【问题讨论】:
将您的null
值转换为 bigint
:select null::bigint as total_time_spent. . .
要查看为什么会出现该错误,请尝试以下查询:with input as (select null as total_time_spent) select pg_typeof(total_time_spent) from input;
它返回 text
这不会导致值为0?太棒了!
没有。对于实际的null
值,没有插值或假设另一个值。问题是没有上下文的null
被假定为null::text
。因此,union
中的第一个 select
将该列定义为 null
,当您的第三个 select
在该列中放入 bigint
值时,这会导致 union
失败。
我之前确实尝试过投射它,但我认为它返回零。再次感谢您的帮助。
【参考方案1】:
根据 SQL 标准,NULL 值存在于每个数据类型中,但缺少显式类型转换,第一个子查询将数据类型解析为 text
(早期版本的 PostgreSQL 会在这里使用 unknown
,但我们不希望在查询结果中出现这种数据类型)。
错误消息是type resolution rules for UNION
in PostgreSQL 的结果。
使用显式类型大小写来避免问题:
SELECT CAST(NULL AS bigint) FROM ...
UNION ...
【讨论】:
每天学习新东西!这有助于解决我的问题。以上是关于UNION 类型 text 和 bigint 无法匹配的主要内容,如果未能解决你的问题,请参考以下文章
TINYINT,SMALLINT,MEDIUMINT,INT,INTEGER,BIGINT;text,longtext,mediumtext,ENUM,SET等字段类型区别
无法使用 typeorm (NestJS) 在 SQL Server 中插入 bigint
使用 UNION 时无法识别 json[] 类型的相等运算符