查询Postgres 9.6中json列中属性数组内的数据

时间:2017-05-18 20:23:29

标签: sql json postgresql

我有一个表格类型,它有一个JSON列,比如说这样的位置:

{ "attribute":[
  {
    "type": "state",
    "value": "CA"
  },
  {
    "type": "distance",
    "value": "200.00"
  } ...
  ]
  } 

表格中的每一行都有数据,并且都具有"类型":"状态"在里面。我想提取"键入":" state"从表中的每一行开始,并将其放在一个新列中。我查了几个关于SO的问题,比如:

但无法让它发挥作用。我不需要对此进行查询。我需要这个专栏的价值。如果我错过了什么,我会提前道歉。

2 个答案:

答案 0 :(得分:2)

create table t(data json);
insert into t values('{"attribute":[{"type": "state","value": "CA"},{"type": "distance","value": "200.00"}]}'::json); 

select elem->>'value' as state
from t, json_array_elements(t.data->'attribute') elem
where elem->>'type' = 'state';

| state |
| :---- |
| CA    |

dbfiddle here

答案 1 :(得分:0)

我主要使用Redshift,其中有一个内置函数来执行此操作。所以,如果你有机会,请查看。 redshift docs

看起来Postgres有类似的功能集: https://www.postgresql.org/docs/current/static/functions-json.html

我认为你需要将三个功能链接在一起才能使其发挥作用。

SELECT 
   your_field::json->'attribute'->0->'value'
FROM
    your_table

我正在尝试的是按密钥名称提取的json,然后是按索引提取的json数组(如果您的示例与完整数据一致,则始终为1st),最后是按键名提取的另一个提取。 / p>

编辑:让它适用于您的示例

SELECT 
  '{ "attribute":[
  {
    "type": "state",
    "value": "CA"
  },
  {
    "type": "distance",
    "value": "200.00"
  }
  ]
  }'::json->'attribute'->0->'value'

返回"CA"

第二次编辑:嵌套查询 @McNets是正确的,更好的答案。但在这次潜水中,我发现你可以在Postgres中嵌套查询! frickin'很酷!

我将json存储为虚拟表中的文本字段并成功运行:

SELECT 
  (SELECT value FROM json_to_recordset(
    my_column::json->'attribute') as x(type text, value text)
  WHERE
    type = 'state'
    )
FROM dummy_table