【问题标题】:UNION types text and bigint cannot be matchedUNION 类型 text 和 bigint 无法匹配
【发布时间】: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 失败。
  • 我之前确实尝试过投射它,但我认为它返回零。再次感谢您的帮助。

标签: postgresql union-all


【解决方案1】:

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

错误消息是type resolution rules for UNION in PostgreSQL 的结果。

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

SELECT CAST(NULL AS bigint) FROM ...
UNION ...

【讨论】:

  • 每天学习新东西!这有助于解决我的问题。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多