UNION 类型 text 和 bigint 无法匹配

Ste*_*ane 3 postgresql union-all

我正在运行一个复杂的存储过程,当我有 3 个联合时出现错误,但有 2 个联合没有错误。如果我删除前两个工会中的任何一个,它运行良好。如果我将其中一个 NULL 设为 0,则它运行良好。错误是“UNION 类型 text 和 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
```
Run Code Online (Sandbox Code Playgroud)

我已经尝试过对总和结果或总和输入进行各种类型的转换。我从中提取的 json 是 NULL、[] 或类似的东西:

[{"date": "2020-09-17", "seconds": 458}]
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 12

根据 SQL 标准,NULL 值存在于每种数据类型中,但缺少显式类型转换,第一个子查询将数据类型解析为 to text(早期版本的 PostgreSQL 会在unknown这里使用,但我们不想要这种数据类型在查询结果中)。

错误消息是PostgreSQL 中类型解析规则UNION的结果。

使用显式类型大小写来避免这个问题:

SELECT CAST(NULL AS bigint) FROM ...
UNION ...
Run Code Online (Sandbox Code Playgroud)

  • 每天学习新东西!这有助于解决我的问题。 (2认同)