Postgres JSONB 多属性匹配
Postgres JSONB multiple attribute matches
假设我有一个像这样的 JSONB 对象:
{"First":"Joe", "Last":"Smith", "Age": "29", "cat":"meow"}
如果我只搜索:
,我希望能够找到这个 JSONB 对象
{"First":"Joe", "Age":"29"}
我用一个属性尝试了这个并且成功了:
SELECT * FROM mytable WHERE name @> lower('{"First": "Joe"}')::jsonb
我用两个属性试过了,但没用:
SELECT * FROM mytable WHERE name @> lower('{"First": "Joe", "Last":"Smith"}')::jsonb
我错过了什么?我根据文档认为这应该有效
去掉lower()
,@>
就是case-sensitive。
SELECT * FROM mytable WHERE name @> '{"First": "Joe", "Last":"Smith"}'::jsonb
如果要使其成为 case-insensitive 搜索,请在 JSON 的文本值上使用 lower()
并将所有属性以小写形式匹配(或者可以应用 lower()
也是)
SELECT * FROM mytable WHERE lower(name::text)::jsonb
@> '{"first": "joe", "last":"smith"}'::jsonb
假设我有一个像这样的 JSONB 对象:
{"First":"Joe", "Last":"Smith", "Age": "29", "cat":"meow"}
如果我只搜索:
,我希望能够找到这个 JSONB 对象{"First":"Joe", "Age":"29"}
我用一个属性尝试了这个并且成功了:
SELECT * FROM mytable WHERE name @> lower('{"First": "Joe"}')::jsonb
我用两个属性试过了,但没用:
SELECT * FROM mytable WHERE name @> lower('{"First": "Joe", "Last":"Smith"}')::jsonb
我错过了什么?我根据文档认为这应该有效
去掉lower()
,@>
就是case-sensitive。
SELECT * FROM mytable WHERE name @> '{"First": "Joe", "Last":"Smith"}'::jsonb
如果要使其成为 case-insensitive 搜索,请在 JSON 的文本值上使用 lower()
并将所有属性以小写形式匹配(或者可以应用 lower()
也是)
SELECT * FROM mytable WHERE lower(name::text)::jsonb
@> '{"first": "joe", "last":"smith"}'::jsonb