【问题标题】:PostgreSQL Like query for jsonb column dataPostgreSQL Like 查询 jsonb 列数据
【发布时间】:2020-07-23 05:33:07
【问题描述】:

这里的列 details_js 是 jsonb 类型,我想检查 json 是否包含某些字符串。 下面的查询我做错了什么?

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

【问题讨论】:

  • 我看到它正在使用以下 details_js::text ...但是如果 json 很大,这是正确的方法吗?或任何其他有效的解决方案,如果有的话。

标签: postgresql sql-like jsonb


【解决方案1】:

details_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")'

【讨论】:

  • jsonb_each_text 不适用于任意嵌套的数据。为 JSON 路径 +1!
  • @Bergi:鉴于问题包含->,我怀疑是否存在“任意嵌套数据”,但是是的,这无法处理。但 JSON 路径表达式也不会。
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 2020-10-19
    • 1970-01-01
    • 2020-04-11
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2014-10-02
    相关资源
    最近更新 更多