PostgreSQL 在 JSON 数组中搜索值

Har*_*ish 3 postgresql json jsonb

我想在 PostgreSQL 中的 JSONB 中搜索元素,这里是我的 JSON

CREATE TABLE test
AS
  SELECT jsondata::jsonb
  FROM ( VALUES
    ( '{"key1": 1, "keyset": [10, 20, 30]}' ),
    ( '{"key1": 1, "keyset": [10, 20]}' ),
    ( '{"key1": 1, "keyset": [30]}' ),
    ( '{"key1": 1 }' ),
    ( '{"key1": 1, "key2": 1}' )
  ) AS t(jsondata);
Run Code Online (Sandbox Code Playgroud)

上表keyset中的所有行都不存在,我的查询是

SELECT * FROM test WHERE  jsondata->>'keyset' = 10;
Run Code Online (Sandbox Code Playgroud)

上面的查询给出了空结果,预期的输出是

jsondata
------------------------------------
{"key1": 1, "keyset": [10, 20, 30]}
{"key1": 1, "keyset": [10, 20]}
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 5

你想要的是这个

SELECT jsondata @> '{"keyset": [10]}' FROM foo;
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样

 SELECT jsondata, jsondata @> '{"keyset": [10]}' FROM foo;
              jsondata               | ?column? 
-------------------------------------+----------
 {"key1": 1, "keyset": [10, 20, 30]} | t
 {"key1": 1, "keyset": [10, 20]}     | t
 {"key1": 1, "keyset": [30]}         | f
 {"key1": 1}                         | f
 {"key1": 1, "key2": 1}              | f
Run Code Online (Sandbox Code Playgroud)

@>运营商将检查在PostgreSQL的遏制。我把选择显示给你的评价..

SELECT jsondata
FROM foo
WHERE jsondata @> '{"keyset": [10]}';
Run Code Online (Sandbox Code Playgroud)