【发布时间】:2016-10-22 14:08:46
【问题描述】:
我正在尝试在名为 data_filters 的 jsonb 列中查询包含键 ['kommune'、'fylke'、'år'] 的行。
据我所知,postgres 只有这个运算符?&,它为我提供了所有具有所有这些键的行,但是我不想要也具有(例如)键“爱好”的行。到目前为止,我正在使用这个:
select * from main_dataitem
where array['fylke', 'kommune', 'år'] @> ARRAY(select jsonb_object_keys(data_filters))
and ARRAY(select jsonb_object_keys(data_filters)) @> array['fylke', 'kommune', 'år'];
但这似乎不是一个最佳解决方案,有没有人有更好的方法来查询这个?
为了清楚起见,这并没有给出想要的结果,因为它匹配包含指定键和任意键(我没有指定)的行:
select * from main_dataitem where data_filters ?& array['fylke', 'kommune', 'år'];
【问题讨论】:
-
要获得有序数组,您可以使用
array(select x from jsonb_object_keys(data_filters) as a(x) order by x)并将其与仅使用=的有序常量数组进行比较。 -
在这种情况下我将不得不对两个数组进行排序,不是吗?这也更快吗?
-
1) 是的,两个数组都应该排序 (
array[1,2] != array[2,1]) 2) 试试看。 IMO 它应该更快,但我不喜欢将结构化数据存储为 JSON,所以我在使用它方面没有太多经验。
标签: postgresql jsonb