我有一个表格类型,它有一个JSON列,比如说这样的位置:
{ "attribute":[
{
"type": "state",
"value": "CA"
},
{
"type": "distance",
"value": "200.00"
} ...
]
}
表格中的每一行都有数据,并且都具有"类型":"状态"在里面。我想提取"键入":" state"从表中的每一行开始,并将其放在一个新列中。我查了几个关于SO的问题,比如:
但无法让它发挥作用。我不需要对此进行查询。我需要这个专栏的价值。如果我错过了什么,我会提前道歉。
答案 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