【发布时间】: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失败。 -
我之前确实尝试过投射它,但我认为它返回零。再次感谢您的帮助。
标签: postgresql union-all