jsonb列数据的类PostgreSQL查询

jsonb列数据的类PostgreSQL查询,postgresql,sql-like,jsonb,Postgresql,Sql Like,Jsonb,这里的列details\u js是jsonb类型,我想检查json是否包含某些字符串。 下面的问题我做错了什么 select * from emp_details where details_js->'$.*' like '%somestring%' 您应该使用运算符。此运算符确保结果为文本格式 postgres=# select (jsonb '{"a":"AHOJ","b":"NAZDAR"}')-&

这里的列details\u js是jsonb类型,我想检查json是否包含某些字符串。 下面的问题我做错了什么

select * 
from emp_details 
where details_js->'$.*' like '%somestring%'

您应该使用运算符。此运算符确保结果为文本格式

postgres=# select (jsonb '{"a":"AHOJ","b":"NAZDAR"}')->'b' like '%NAZ%';
ERROR:  operator does not exist: jsonb ~~ unknown
LINE 1: select (jsonb '{"a":"AHOJ","b":"NAZDAR"}')->'b' like '%NAZ%'...
                                                    ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
postgres=# select (jsonb '{"a":"AHOJ","b":"NAZDAR"}')->>'b' like '%NAZ%';
┌──────────┐
│ ?column? │
╞══════════╡
│ t        │
└──────────┘
(1 row)

details\u js->'$.'
不起作用,它会逐字检查是否有带有
'$.'

要做到这一点,您需要取消JSON值中的所有元素的测试,例如,使用EXISTS条件:

select d.*
from emp_details d
where exists (select *
              from jsonb_each_text(d.details_js) as x(ky,value)
              where value like '%somestring%');
如果您使用的是Postgres 12,则可以使用JSON路径表达式:

select *
from emp_details
where details_js @? '$.* ? (@ like_regex ".*somestring.*" flag "i")'

我看到它正在处理以下详细信息。\u js::text。。。但如果json很大,这种方法正确吗?或者任何其他有效的解决方案,如果有的话。
jsonb\u每个文本
都不能处理任意嵌套的数据+但是JSON路径为1@Bergi:考虑到问题包含
->
的事实,我怀疑是否存在“任意嵌套的数据”,但是的,这不会处理它。但JSON路径表达式也不会。