【问题标题】:COALESCE types text and integer cannot be matcheCOALESCE 类型文本和整数无法匹配
【发布时间】:2021-05-20 03:29:51
【问题描述】:

基本上我有一个列 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_indexzone_index的null为0,我该如何设置默认值

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

我明白了

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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我不认识你的表或数据,但显然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 表达式的所有分支始终必须具有相同的类型。

    【讨论】:

    • 有没有办法使用 CAST 将字符串值转换为整数?我也尝试过,但遇到了语法问题。
    • THEN COALESCE(data->>'zone_index'::int, 0) 这样做会给出无效的输入语法
    【解决方案2】:

    添加 nullif 函数调用以将 JSON null 转换为 SQL NULL:

    coalesce(
       CAST(
          nullif(data->>'zone_index', 'null') AS integer
       ),
       0
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多