COALESCE 类型文本和整数不能匹配

时间:2021-05-20 03:29:51

标签: sql postgresql

基本上我有一个基于它的值的列 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

的 null 为 0,如何设置默认值

我试过COALESCE(data->>'zone_index', 0)

我明白

<块引用>

错误:无法匹配 COALESCE 类型的文本和整数 第 9 行:COALESCE(data->>'zone_index', 0)

2 个答案:

答案 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
)
相关问题