postgresql 如何在PosgresSql中从JSON字符串中基于Key检索值

cxfofazt  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(3)|浏览(377)

在处理JSON字符串时,该字符串存储在DB表列中,如下所示:
假设表名为t1,列名为data:
data列将json字符串存储为:

[{"K":"V"}]

下面是我的查询,以获取基于Key的Value:

select Value ->> 'Value'
from json_array_elements(select data from t1) Key
where Key->>'Key'='K';

在执行时,它给我语法错误。
尝试了所有可能的方法来解决这个问题,但最终需要帮助。
----编辑这是我如何得到所需结果的------
1.创建一个表:
CREATE table(id int,data json);
1.将数据插入t1表:
插入t1值

(1,'[{"K":"V"}]'),
(2,'[{"loadShortCut_AutoText":"both"}]'),
(3,'[{"P":"R"}]');

1.下面的查询获取输出:
select row,row-〉〉'loadShortCut_AutoText' as value from t1,json_array_elements(t1.data)as row WHEREt1.id=2;
1.输出:
{“loadShortCut_AutoText”:“both”} both

mxg2im7a

mxg2im7a1#

你可以试试这个:

select row->>'K' as value
from t1, json_array_elements (data) as row
WHERE row->>'K' is not null

这将仅在键'K'存在时返回数据
Demo here

ovfsdjhp

ovfsdjhp2#

或者,您可以使用jsonb_path_query_array直接查询json数组(需要将json列转换为jsonb

select
id, data,
(jsonb_path_query_array(t1.data::jsonb, '$[*]?(exists (@."K"))'::jsonpath) -> 0) #>> '{K}'::text[] AS k_value
from t1

JSON路径$[*]?(exists (@."K"))选择所有包含键"K"的数组元素,而不是采用第一个这样的-> 0并提取其值#>> '{K}'::text[]
这种方法的优点是,它也适用于具有重复数据(id=4)和null值(id=6)的JSON数组,如示例输出所示

id|data                   |k_value|
--+-----------------------+-------+
 1|[{"K":"V"}]            |V      |
 2|[{"K":"V"},{"A":"B"}]  |V      |
 3|[{"Z":"V"},{"A":"B"}]  |       |
 4|[{"K":"V"},{"K":"B"}]  |V      |
 5|[{"Z":"V"},{"K":"B"}]  |B      |
 6|[{"Z":"V"},{"K": null}]|       |
9gm1akwq

9gm1akwq3#

json_array_elements()为每个数组元素返回一行,这也是一个JSON值。
select语句不能作为参数传递,需要将源表放入“main”FROM子句中:

select e.item ->> 'K' as value
from t1 
   cross join json_array_elements(t1.data) as e(item)

相关问题