【问题标题】:Avoid PostgreSQL type evaluation in CASE statements避免在 CASE 语句中进行 PostgreSQL 类型评估
【发布时间】:2018-12-27 10:52:31
【问题描述】:

如果此列是 jsonb,我想选择一个列键值。 如果不是jsonb,我想简单地选择列。

代码如下:

SELECT 
    CASE WHEN (pg_typeof(mycolumn)::text LIKE 'jsonb') 
        THEN mycolumn->>'mykey' 
        ELSE mycolumn 
    END
FROM mytable;

它不起作用,因为不知何故,mycolumn->>'mykey' 仍会针对非 JSONB 类型的列进行评估。

错误:运算符不存在:[...] ->> 未知

提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

有没有办法让PostgreSQL类型检查接受这个语句,或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: sql json postgresql types jsonb


    【解决方案1】:

    一般情况下,您可以通过将查询结果转换为text 来做到这一点:

    SELECT 
        CASE WHEN (pg_typeof(mycolumn)::text LIKE 'jsonb') 
            THEN (mycolumn::text::jsonb)->>'mykey' 
            ELSE mycolumn::text 
        END
    FROM mytable;
    

    【讨论】:

    • 好的,谢谢。顺便说一句,我的列不能(例如时间戳记)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2014-06-13
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多