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
相关产品推荐
相关产品推荐

