PostgreSQL JSONB查询:用jsonb_path_exists匹配不同类型值
解决PostgreSQL JSONB非字符串元素的正则匹配问题
你可以通过类型转换将JSONB中的非字符串值转为文本后再进行正则匹配,PostgreSQL的JSON路径表达式支持用::text实现这种转换,替代你设想的@.toString()写法。
修改后的测试语句
把原测试语句里的@改为@::text,就能匹配整数类型的344了:
SELECT jsonb_path_exists('{"data": {"foo1": 344, "foo2": "Tata"}}', '$.data.** ? (@::text like_regex "(?i)344.*")');
执行这条语句会返回true,符合预期。
适配你的业务查询
针对你的mytable查询,只需要把JSON路径里的@替换为@::text即可,修改后的SQL如下:
SELECT id FROM mytable WHERE jsonb_path_exists(properties, '$.data.** ? (@::text like_regex "(?i)Foo.*")');
这样不管properties里的元素是字符串、整数还是其他可转为文本的JSON类型,都会被转为文本后参与正则匹配。
内容的提问来源于stack exchange,提问作者Basile Lamarque
相关产品推荐
相关产品推荐

