如何在Rails中用where子句查询jsonb列非空enqueued_at记录
修复方法及正确查询方式
你的错误根源有两点:一是JSON语法不符合PostgreSQL要求(JSON中空值的正确写法是null而非nil);二是原查询逻辑不准确(@>操作符用于检查JSON是否包含指定结构,反向排除的逻辑无法精准筛选出enqueued_at值不为null的记录)。以下是几种正确实现方式:
方式一:直接判断字段值非空(推荐)
使用->>操作符将JSONB字段的指定键值转为文本类型,再判断是否非空:
TimeBox.where("job_metadata ->> 'enqueued_at' IS NOT NULL")
方式二:同时检查键存在且值非空
如果需要确保enqueued_at键存在且值不为null,可结合?操作符做键存在校验:
TimeBox.where("job_metadata ? 'enqueued_at' AND job_metadata -> 'enqueued_at' IS NOT NULL")
方式三:使用Arel(Rails原生安全写法)
TimeBox.where(Arel.sql("job_metadata ->> 'enqueued_at' IS NOT NULL"))
操作符说明
->>:将JSONB键值转为字符串类型,适合直接做非空判断->:保留JSONB原生类型,用于判断JSON格式的null值?:检查JSONB字段是否包含指定键
内容的提问来源于stack exchange,提问作者jansha
相关产品推荐
相关产品推荐

