PostgreSQL JSON 类似查询

113

我有一个名为 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列的属性/特性,因此您需要提取其值进行比较:data ->> 'title'data #>> ARRAY['title'] - pozs
4个回答

154
如果数据列是文本类型,则在转换时使用->>
select * from module_data where data::json->>'title' like '%Board%'

如果它已经是Json格式:

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

太棒了,谢谢。这是我第一次使用jsonb,所以我非常感谢这个提示。 - adviner
8
提醒阅读此答案的人:使用查询参数来避免 SQL 注入。 - baijum
1
@baijum 什么是查询参数? - jayarjo

90

1
这也将搜索键,因此在使用时要小心。只有在可以保证键不会有搜索词的情况下才使用此功能。 - user961954
如果您只想在值上搜索而不是在键上搜索,可以尝试以下内容:select * from table_name where array_to_string( array(select value from jsonb_each_text( )), ' ') like '%Something%' - jlfenaux
2
如此之好,适用于快速调试。 - Peter F

16

另一个选项是将该列转换为文本类型,这可能对其他人有足够的帮助。例如:

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

请注意,这将在整个json中进行搜索,只有在您可以保证其他字段不会出现问题的情况下才应使用。


1
这也将搜索键,因此在使用时要小心。只有在您可以保证键不会有搜索词的情况下才使用此功能。 - user961954
2
我需要搜索完美的键,所以这对我来说非常好 :) - Titozzz
这对于一次性搜索来说非常好。+1 - Shautieh

2
我认为它应该是这样的。
select * from module_data where data->>'$."title"' like '%Board%'

然后它才对我起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接