Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL 12上添加基于选择值(JSONB)的条件?_Sql_Arrays_Json_Postgresql_Jsonb - Fatal编程技术网

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

如何在PostgreSQL 12上添加基于选择值(JSONB)的条件?,sql,arrays,json,postgresql,jsonb,Sql,Arrays,Json,Postgresql,Jsonb,我要筛选具有金徽章的行。我正在使用PG12,我使用它的新路径功能 为了澄清,我有一个如下的用户表: CREATE TABLE users_tbl ( ID serial NOT NULL PRIMARY KEY, data jsonb NOT NULL ); SELECT ID, jsonb_path_query("data", '$.badges') AS "badges" FROM "users_tbl"; { "properties": { "badges

我要筛选具有金徽章的行。我正在使用PG12,我使用它的新路径功能

为了澄清,我有一个如下的用户表:

CREATE TABLE users_tbl (
   ID serial NOT NULL PRIMARY KEY,
   data jsonb NOT NULL
); 
SELECT
  ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
{
  "properties": {
    "badges": ["gold", "silver"]
  }
}
并让我们插入值:

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}');
现在当我这样询问时:

CREATE TABLE users_tbl (
   ID serial NOT NULL PRIMARY KEY,
   data jsonb NOT NULL
); 
SELECT
  ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
{
  "properties": {
    "badges": ["gold", "silver"]
  }
}
我得到了如下预期结果:

+----+--------------------+
+ ID |       badges       +
+----+--------------------+
+ 1  | ["gold", "silver"] +
+----+--------------------+
+ 2  | ["silver"]         +
+----+--------------------+
+ 3  | ["gold"]           +
+----+--------------------+
现在名单上只有徽章匹配金

预期结果: 实际结果: 如何针对徽章添加条件?还是我做了一些不正确的事情?我怎样才能在我的案例中得到预期的结果

注:PostgreSQL 12

更新: 实际上,在这个示例中,我使用了一个简单的jsonb对象。实际上是这样的:

CREATE TABLE users_tbl (
   ID serial NOT NULL PRIMARY KEY,
   data jsonb NOT NULL
); 
SELECT
  ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
{
  "properties": {
    "badges": ["gold", "silver"]
  }
}
所以,徽章在属性中

您可以使用?接线员:

SELECT jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl"
WHERE "data" -> 'badges' ? 'gold';
select
    jsonb_path_query(data, '$.badges') as badges
from users_tbl
where data->'badges' @> '"gold"';
注意:我不确定您是否需要这里的jsonb_路径_查询。这是一个集合返回函数,在您的上下文中似乎没有意义。您的查询可能采用以下措辞:

SELECT "data" ->> 'badges' AS "badges"
FROM "users_tbl"
WHERE "data" -> 'badges' ? 'gold';
:


您可以使用包容操作符:

SELECT jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl"
WHERE "data" -> 'badges' ? 'gold';
select
    jsonb_path_query(data, '$.badges') as badges
from users_tbl
where data->'badges' @> '"gold"';
或jsonb_路径_存在:

如何针对徽章添加条件

你真的不能。正如错误消息所说,它不是表的一列——这是您需要在WHERE子句中引用的内容。不能使用选择别名引用表达式的结果值。你可以重复一遍

SELECT jsonb_path_query_first("data", '$.badges') AS "badges"
FROM "users_tbl"
WHERE jsonb_path_query_first("data", '$.badges') @> 'gold';
或使用横向子查询:

SELECT badges
FROM "users_tbl", LATERAL jsonb_path_query("data", '$.badges') as badges
WHERE badges @> 'gold';

在您的第一次查询中,WHERE中不允许使用集合返回函数。@Pratha噢,我忘了jsonb_path_查询是集合返回函数-您只希望返回一个数组值。我已经把它改为先使用jsonb_path_query_,虽然我肯定会建议像其他答案一样使用simple->操作符,但是jsonpath在这里太过分了。我只是想让代码与你原来的代码相似。我在底部做了一个更新。你能检查一下吗?@Pratha:那就是:选择数据->“属性”->“徽章”作为来自用户的徽章。\u tbl其中数据->“属性”->“徽章”?'黄金",;谢谢我只是无法决定我是否应该接受你的答案,还是@klin的答案中存在的jsonb_路径。此列可以为空,也可以为空,或者可能根本没有属性/徽章。这对你重要吗?我在底部做了更新。你能检查一下吗?不用检查。我刚刚添加了第二条路径,它成功了。