基本上我有一个基于它的值的列 item_importance 我想返回一个输出 zone_index
CASE
WHEN item_importance in ('kvi', 'super_kvi')
THEN
data->>'zone_index'
WHEN item_importance in ('non_kvi_1', 'non_kvi_2')
THEN
data->>'zone_price_diff_non_kvi'
END as zone_index
以下查询有效,但在输出中,如果 data->>'zone_index'
或 data- >>'zone_price_diff_non_kvi'
为空,则返回空。如果 zone_index
我试过COALESCE(data->>'zone_index', 0)
我明白
<块引用>错误:无法匹配 COALESCE 类型的文本和整数 第 9 行:COALESCE(data->>'zone_index', 0)
答案 0 :(得分:0)
我不了解您的表或数据,但显然 CASE
表达式的分支之一是输出文本值。因此,将该值合并为整数 0
是没有意义的。尝试改用 '0'
(或任何文本值):
CASE WHEN item_importance IN ('kvi', 'super_kvi')
THEN COALESCE(data->>'zone_index', '0') -- or any text literal value
WHEN item_importance IN ('non_kvi_1', 'non_kvi_2')
THEN data->>'zone_price_diff_non_kvi'
END as zone_index
编辑:
如果您确定 data->>'zone_index'
总是一个整数,您也可以使用:
COALESCE(CAST(data->>'zone_index' AS int), 0)
但是 CASE
表达式的另一个分支也需要转换为整数。作为一般规则,CASE
表达式的所有分支必须始终具有相同的类型。
答案 1 :(得分:0)
添加 nullif
函数调用以将 JSON null
转换为 SQL NULL:
coalesce(
CAST(
nullif(data->>'zone_index', 'null') AS integer
),
0
)