【问题标题】:Postgresql json like queryPostgresql json 类似查询
【发布时间】:2017-08-12 14:26:23
【问题描述】:

我有一个名为 module_data 的表。目前它有三行条目:

                id                               data
0ab5203b-9157-4934-8aba-1512afb0abd0 {"title":"Board of Supervisors Meeting","id":"1i3Ytw1mw98"}
7ee33a18-63da-4432-8967-bde5a44347a0 {"title":"Board of Supervisors Meeting","id":"4-dNAg2mn6o"}
8d71ca35-74eb-4751-b635-114bf04843f1 {"title":"COPD 101", "id":"l9O0jCR-sxg"}

列数据的数据类型是jsonb。我正在尝试使用like 运算符查询它。类似于以下内容:

SELECT * FROM module_data WHERE title LIKE '%Board%';

我一直在查看jsonb 支持,但似乎没有like 运算符。如果有人有任何建议。

【问题讨论】:

  • like 运算符存在,但 title 列不存在。它是data 列的属性/属性,因此you'll need to extract it's value 对其进行比较:data ->> 'title'data #>> ARRAY['title']

标签: postgresql jsonb


【解决方案1】:

如果数据列是文本类型,则在转换时使用->>

select * from module_data where data::json->>'title' like '%Board%'

如果已经是json:

select * from module_data where data->>'title' like '%Board%'

【讨论】:

  • 太棒了,谢谢。这是我第一次使用 jsonb,所以我真的很感激这个提示
  • 提醒看答案的人:使用查询参数避免SQL注入。
  • @baijum 什么是查询参数?
【解决方案2】:

我发现以下对于 jsonb 类型的列更直接、更容易:

select * from table_name
where 
column_name::text like '%Something%'

找到一篇关于更多示例和实现的好文章: https://www.compose.com/articles/faster-operations-with-the-jsonb-data-type-in-postgresql/

希望对你有帮助!

【讨论】:

  • 这也会搜索键,所以使用它时要小心。仅当您可以保证键没有搜索词时才使用此选项。
  • 如果你想只搜索值而不是键,你可以尝试 select * from table_name where array_to_string( array(select value from jsonb_each_text( )), ' ') like ' %Something%'
  • 快速调试好很多
【解决方案3】:

对于找到此页面的其他人来说可能足够的另一个选项是将列转换为文本类型。例如

select * from module_data where data::text like '%Board%'

但请注意,这将搜索整个 json,并且只有在您可以保证其他字段不会有问题时才应该使用。

【讨论】:

  • 这也会搜索键,所以使用它时要小心。仅当您可以保证键没有搜索词时才使用此选项。
  • 我需要搜索非常适合我的键 :)
【解决方案4】:

我觉得应该是这样的

select * from module_data where data->>'$."title"' like '%Board%'

那么只有它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2016-03-22
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多