首页 > 解决方案 > 使用动态生成的值检查 postgres json 中是否存在键

问题描述

我想检查我的 json 数据类型中的键,其中键是一周的数字。基本上,我使用这个函数来获取下周的数字:extract(week FROM current_date) + 1

现在我想使用返回的值来检查这个键是否存在于我的对象中,如果不存在则返回一个空对象:

SELECT dv.unitid as id,
              CASE
                WHEN dv.internaldata IS NULL THEN '{}'
                WHEN dv.internaldata::json->'officePlan' IS NULL THEN '{}'
                ELSE dv.internaldata::json->'officePlan'-> extract(week FROM current_date) + 1
              END as officeplan,

甚至可以这样做吗?还有另一种更好的方法吗?

标签: sqljsonpostgresql

解决方案


您需要将结果转换为extract文本值

SELECT dv.unitid as id,
       CASE
         WHEN dv.internaldata IS NULL THEN '{}'
         WHEN dv.internaldata::json -> 'officePlan' IS NULL THEN '{}'
         ELSE dv.internaldata::json -> 'officePlan' -> (extract(week FROM current_date) + 1)::text
       END as officeplan,

但是您实际上并不需要 case 表达式开始,您可以使用coalesce()

coalesce(dv.internaldata -> 'officePlan' -> (extract(week FROM current_date) + 1)::text, '{}')

推荐阅读