【问题标题】:Check if one json value is in the json value from another JSON, for each key对于每个键,检查一个 json 值是否在另一个 JSON 的 json 值中
【发布时间】:2018-11-27 14:32:36
【问题描述】:

使用 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 中的每个键?

【问题讨论】:

  • 所以 json_1/2 可以包含任意数量的任意名称的键,并且这些键中的每一个都将始终是一个数组,并且对于 json_2 中的每个数组,您要检查相应的键(可能不存在)在json_1中,然后看看json_2数组中的所有值是否以任意顺序在json_1数组中找到?
  • 正确。但是,如果密钥在 json_2 中,我知道它也将在 json_1 中。所以“可能不存在”部分不成立。但是,json_1中key的值可能是[]。

标签: sql json postgresql compare


【解决方案1】:

我不确定您想要什么输出格式,但这会为每个键创建一行,并带有一个布尔值,说明 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

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2020-11-16
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多