postgresql 如何检查jsonb列中是否存在键值对重叠?

irlmq6kh  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(109)

我在Postgres表中有一个jsonb列。它是一个简单的键值对字典。我想检查以下内容:
1.它是查询参数的子集
1.与查询参数有重叠
对于案例1,我可以很容易地实现这一点,它工作正常

SELECT '{"k1": "v1"}'::jsonb
    <@ '{"k1": "v1", "k2":"v2"}'::jsonb;  -- returns true

字符串
我没有得到一个简单的解决方案的情况2。我尝试了类似下面的东西,但它没有工作。

SELECT '{"k1": "v1", "k3":"v4"}'::jsonb
    && '{"k1": "v1", "k2":"v2"}'::jsonb;  -- Syntax error.


我希望这会返回true,因为在某些键值对中存在重叠。

nsc4cvqm

nsc4cvqm1#

由于jsonb中不存在&&操作符,我建议您更改方法以使用jsonb_path_exists(),并通过迭代查询参数来构建多个WHERE子句。例如:

WITH data AS (
  SELECT '{"k1": "v1", "k3":"v4"}'::jsonb AS sample
)

SELECT
  data.sample
FROM
  data
WHERE
  jsonb_path_exists(data.sample, '$.k1[*] ? (@ == "v1")')
  OR jsonb_path_exists(data.sample, '$.k2[*] ? (@ == "v2")')

字符串

相关问题