簡體   English   中英

如何通過 PostgreSQL 中 JSON 數組中的多屬性過濾對象元素?

[英]How can I filter object elements by multi-attributes in JSON Array in PostgreSQL?

我想通過其多屬性過濾數組中的 JSON 對象。 以下是示例數據和基本過濾器:

with data (id, extra_info) as (
values 
  (1, '[{"name": "class", "value": 3}, {"name": "dept", "value": "No. 2"}, {"name": "batch", "value": 20070102}]'::jsonb), 
  (2, '[{"name": "class", "value": 2}, {"name": "dept", "value": "No. 3"}, {"name": "batch", "value": 20081123}]'::jsonb), 
  (3, '[{"name": "class", "value": 3}, {"name": "dept", "value": "No. 1"}]'::jsonb) 
)
select *
from data
where extra_info @> '[{"name": "class", "value": 3}]'::Jsonb and 
      extra_info @> '[{"name": "batch", "value": 20070102}]'::Jsonb

JSON 數組中的所有對象都具有相同的結構。 但是現在我想獲取帶有 "name"="class" 和 "value" > 2 的 JSON 對象,我該怎么做呢? “值”屬性可以是字符串、整數、浮點數和布爾值。 謝謝!

您可以在子查詢中使用jsonb_array_elements

select d.* from data d where exists (select 1 from jsonb_array_elements(d.extra_info) v 
where ((v.value -> 'name')::text = '"class"' and (v.value -> 'value')::text::int > 2) or ((v.value -> 'name')::text = '"batch"' and (v.value -> 'value')::text::int > 20071010))

見小提琴

您可以使用 JSON 路徑表達式:

and extra_info @? '$[*] ? (@.name == "class" && @.value > 2)'

請注意,如果 value 不是 JSON 中的數字(如示例數據中所示),這將不起作用

測試值是布爾值或字符串。 號碼很簡單。

WITH data (
    id,
    extra_info
) AS (
    VALUES (1, '[{"name": "class", "value": 3}, {"name": "dept", "value": "No. 2"}, {"name": "batch", "value": "test_str"}]'::jsonb),
        (2, '[{"name": "class", "value": true}, {"name": "dept", "value": "No. 3"}, {"name": "batch", "value": 20081123}]'::jsonb),
        (3, '[{"name": "class", "value": 3}, {"name": "dept", "value": "No. 1"}]'::jsonb))
SELECT
    *
FROM
    data
WHERE
    jsonb_path_exists(extra_info, '$[*] ? (@.name == $var1 && @.value == $var2)', vars => '{"var1": "class", "var2": true}')
        OR jsonb_path_exists(extra_info, '$[*] ? (@.name == $var1 && @.value == $var2)', vars => '{"var1": "batch", "var2": "test_str"}');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM