如何在 PostgreSQL 12 上添加基于选择值 (JSONB) 的条件?

Pra*_*tha 5 sql arrays postgresql json jsonb

我想过滤带有gold徽章的行。我正在使用 PG12,并且使用它的新路径功能。

为了澄清一下,我有一个users_tbl这样的表:

CREATE TABLE users_tbl (
   ID serial NOT NULL PRIMARY KEY,
   data jsonb NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

让我们插入值:

INSERT INTO users_tbl (ID, data) values (1, '{"badges": ["gold", "silver"], "another_field": 1}');
INSERT INTO users_tbl (ID, data) values (2, '{"badges": ["silver"], "another_field": 3}');
INSERT INTO users_tbl (ID, data) values (3, '{"badges": ["gold"], "another_field": 4}');
Run Code Online (Sandbox Code Playgroud)

现在当我这样查询时:

SELECT
  ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
Run Code Online (Sandbox Code Playgroud)

我得到了预期的以下结果:

+----+--------------------+
+ ID |       badges       +
+----+--------------------+
+ 1  | ["gold", "silver"] +
+----+--------------------+
+ 2  | ["silver"]         +
+----+--------------------+
+ 3  | ["gold"]           +
+----+--------------------+
Run Code Online (Sandbox Code Playgroud)

现在列表只有badge匹配项gold

SELECT
  jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl"
WHERE "badges" @> 'gold';
Run Code Online (Sandbox Code Playgroud)

预期结果:

+----+--------------------+
+ ID |       badges       +
+----+--------------------+
+ 1  | ["gold", "silver"] +
+----+--------------------+
+ 3  | ["gold"]           +
+----+--------------------+
Run Code Online (Sandbox Code Playgroud)

实际结果:

column "badges" does not exist 
Run Code Online (Sandbox Code Playgroud)

我如何添加条件反对badges?或者我做的事情不正确?我怎样才能获得我的案例的预期结果?

注意:PostgreSQL 12。

更新:

实际上在这个例子中我使用了一个简单的 jsonb 对象。事实上它是这样的:

{
  "properties": {
    "badges": ["gold", "silver"]
  }
}
Run Code Online (Sandbox Code Playgroud)

所以,badgesproperties

kli*_*lin 3

您可以使用包含运算符:

select
    jsonb_path_query(data, '$.badges') as badges
from users_tbl
where data->'badges' @> '"gold"';
Run Code Online (Sandbox Code Playgroud)

或者jsonb_path_exists()

select
    jsonb_path_query(data, '$.badges') as badges
from users_tbl
where jsonb_path_exists(data, '$.badges ? (@[*] == "gold")')
Run Code Online (Sandbox Code Playgroud)