对于每个键,检查一个json值是否在另一个JSON的json值中

时间:2018-11-27 14:32:36

标签: sql json postgresql compare

在postgres中使用SQL,我想知道一个JSON是否在另一个JSON中。

例如:

json_1 = {"a": ["123"], "b": ["456", "789"]}
json_2 = {"a": ["123"], "b": ["456"]}

在上述情况下,json_2 [“ a”]位于json_1 [“ a”]中,而json_2 [“ b”]位于json_1 [“ b”]中。

如果我知道json的所有可能键,则可以轻松地为每个键编写以上内容。但是,问题是我不知道JSON中有多少个键和哪些键。如果json_2位于json_1中,如何检查JSON中的每个键?

1 个答案:

答案 0 :(得分:0)

我不确定所需的输出格式,但这将为每个键创建一行,并带有一个布尔值,指示json_2键的数组值是否包含在json_1键的值中。

CREATE TABLE t (json_1 JSONB, json_2 JSONB);
INSERT INTO t
VALUES
    ('{"a":["123"],"b":["456","789","aaa"],"c":["999"],"d":[]}',
     '{"a":["123"],"b":["789","456"],"c":["123"],"d":["x"]}');

查询#1

SELECT key, value <@ (json_1->key) AS contained
FROM (
  SELECT (JSONB_EACH(json_2)).*, json_1
  FROM t
) j;

返回:

| key | contained |
| --- | --------- |
| a   | true      |
| b   | true      |
| c   | false     |
| d   | false     |

View on DB Fiddle