Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
使用postgres查询嵌套jsonb_Json_Postgresql_Jsonb_Postgresql 9.6 - Fatal编程技术网

使用postgres查询嵌套jsonb

使用postgres查询嵌套jsonb,json,postgresql,jsonb,postgresql-9.6,Json,Postgresql,Jsonb,Postgresql 9.6,我有一个嵌套的jsonb列,我正在尝试使用Postgres9.6查询jsonb中类似于值的字段,或者是确切的值 表:测试 Jsonb列:数据 { "subject":[ { "test1": "blue", "test2": "12", "test3": "green" }, { "test1": "red", "test2": "1234",

我有一个嵌套的jsonb列,我正在尝试使用Postgres9.6查询jsonb中类似于值的字段,或者是确切的值

表:测试

Jsonb列:数据

{
"subject":[
{
          "test1": "blue",
          "test2": "12",
          "test3": "green"
          },
          {
          "test1": "red",
          "test2": "1234",
          "test3": "green"
          }
]}
我试过这个:

SELECT * from test where data ->'subject'->>'test2' like '%12%';
还尝试了一个包含查询:

SELECT '{"test":{test1: "blue"}}' :: jsonb@> '{"test":{}}'::jsonb
最后,尝试访问jsonb元素,但获取列“1234”不存在错误

SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data -> 'subject') as s
    WHERE (s->'test2'= "1234"));
第一次运行,但我没有得到任何数据

出现错误的函数

CREATE FUNCTION search_data (search text)
  RETURNS setof test AS $$
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%search%';
$$ language sql stable;

我想你想要的是:

SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';
事实上,我刚刚注意到,您的上一个查询几乎完成了,但是有几个小的语法和逻辑错误:

  • '1234'
    字符串周围需要单引号而不是双引号 literal(这就是为什么会出现“no-this column”错误), 以及:
  • 您需要使用
    ->
    而不是
    ->
    来提取
    数据->'test2'
    ,因此它被提取为
    varchar
    而不是
    jsonb
    。否则,当
    jsonb
    隐式转换为
    varchar
    以将其与
    '1234':varchar进行比较时,该值将在稍后的查询求值中用双引号括起来
  • 以下查询适用于我:

    SELECT * FROM test
    WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data->'subject') as s
        WHERE (s->>'test2' = '1234'));
    
    看我的