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

Jooq 3.18+Postgres14中如何对JSONB数组首元素做忽略大小写相等匹配?

解决方案

方法一:使用->>操作符提取文本(推荐)

Jooq中可以通过JSONB.get(int index, SQLDataType<VARCHAR>)生成Postgres的->>操作符,直接提取JSONB数组元素的纯文本值(不带双引号),再调用equalIgnoreCase实现忽略大小写的精确匹配:

MY_TABLE.MY_JSONB_COLUMN.get(0, SQLDataType.VARCHAR).equalIgnoreCase("a")

生成的原生SQL:

lower("my_schema"."my_table"."my_jsonb_column"->>0) = lower('a')

这种方式避免了多余的CAST操作,因为->>返回的本身是纯文本类型,直接与目标值做忽略大小写比对即可。

方法二:手动构造LOWER比较逻辑

如果需要更直观的逻辑控制,可以手动调用LOWER函数实现相同效果:

DSL.lower(MY_TABLE.MY_JSONB_COLUMN.get(0, SQLDataType.VARCHAR))
    .eq(DSL.lower(DSL.val("a")))

生成的SQL与方法一完全一致,效果等价。

方法三:用ILIKE做精确匹配

利用Postgres的ILIKE特性,直接指定无通配符的匹配条件,同样能实现忽略大小写的精确匹配:

MY_TABLE.MY_JSONB_COLUMN.get(0, SQLDataType.VARCHAR).ilike("a")

生成的原生SQL:

"my_schema"."my_table"."my_jsonb_column"->>0 ILIKE 'a'

原方法失效原因

你之前使用jsonbGetElement生成的是->操作符,返回的是JSONB类型的原始值(比如"A"),CAST成varchar时会保留双引号,最终得到'"A"'。LOWER转换后变成'"a"',与lower('a')的'a'不相等,因此无法匹配到结果。而->>操作符直接返回去掉引号的纯文本'A',LOWER后就能正确匹配'a'。

内容的提问来源于stack exchange,提问作者Sigurd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:20