为简单起见,table
的一行如下所示:
key: "z06khw1bwi886r18k1m7d66bi67yqlns",
reference_keys: {
"KEY": "1x6t4y",
"CODE": "IT137-521e9204-ABC-TESTE"
"NAME": "A"
},
我有一个像这样的jsonb对象{"KEY": "1x6t4y", "CODE": "IT137-521e9204-ABC-TESTE", "NAME": "A"}
,我想在任何键的值中搜索查询。如果我的查询类似于'521e9204',我希望它返回reference_keys在任何值中具有'521e9204'的行。基本上,在这种情况下,键不重要。
注意:列reference_keys
和jsonb对象,总是一个一维数组。
我试过这样的查询:
SELECT * FROM table
LEFT JOIN jsonb_each_text(table.reference_keys) AS j(k, value) ON true
WHERE j.value LIKE '%521e9204%'
问题是它重复行,对于json中的每个键,它弄乱了返回的项。
我也想过这样做:
SELECT DISTINCT jsonb_object_keys(reference_keys) from table;
,然后使用如下查询:
SELECT * FROM table
WHERE reference_keys->>'CODE' like '%521e9204%'
这似乎可以工作,但我真的不想依赖于这个解决方案。
您可以将JOIN重写为EXISTS条件,以避免重复:
SELECT t.*
FROM the_table t
WHERE EXISTS (select *
from jsonb_each_text(t.reference_keys) AS j(k, value)
WHERE j.value LIKE '%521e9204%');
如果你使用的是Postgres 12或更高版本,你也可以使用JSON路径查询:
where jsonb_path_exists(reference_keys, 'strict $.** ? (@ like_regex "521e9204")')