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 值转换为 bigintselect 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

PostgreSQL 修改字段类型从int到bigint

使用 UNION 时无法识别 json[] 类型的相等运算符

MySQL中数字类型的最大值 - int无法储存11位手机号码 - bigint, int, tinyint

MySQL中数字类型的最大值 - int无法储存11位手机号码 - bigint, int, tinyint