在CASE语句中避免PostgreSQL类型评估

时间:2018-12-27 10:52:31

标签: sql json postgresql types jsonb

如果此列是jsonb,我想选择列键值。 如果不是jsonb,我只想选择该列。

代码如下:

typedef struct my_struct_optional_name {
    uint32_t ui32_1;
    uint32_t ui32_2;
    char char_1;
    // compiler inserts padding unless #pragma pack is in effect
    uint64_t ui64_1;
} my_struct_t;
my_struct_t *my_struct = aligned_alloc(64, sizeof(my_struct_t));

它不起作用,因为仍会以某种方式为非JSONB类型的列评估SELECT CASE WHEN (pg_typeof(mycolumn)::text LIKE 'jsonb') THEN mycolumn->>'mykey' ELSE mycolumn END FROM mytable;

  

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

     

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

有没有一种方法可以使PostgreSQL类型检查接受此语句,或者还有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

通常,您可以通过将查询结果转换为text来完成此操作:

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