You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:21:29