我正在以 jsonb 格式在 PostgreSQL 9.5 上的某些网站上存储大量 json。其中一个字段是一组具有相同信息的 Json。这是一个例子。
[
{
"text": "JIMIN",
"indices": [
16,
22
]
},
{
"text": "PUMA",
"indices": [
23,
28
]
}
]
Run Code Online (Sandbox Code Playgroud)
我想检索所有text
值,也就是说,我想进行一个查询,在这个例子中给我JIMIN
和PUMA
。我找不到使用公共运算符(如#>>
)来实现这一目标的方法。有没有办法做到这一点?
您没有提供任何代码,因此我将创建一个包含一行和一些查询的示例表,以提取您需要的信息。
CREATE TABLE test (myfield jsonb);
Run Code Online (Sandbox Code Playgroud)
加载数据:
INSERT INTO test (myfield) VALUES ('
[
{
"text": "JIMIN",
"indices": [
16,
22
]
},
{
"text": "PUMA",
"indices": [
23,
28
]
}
]
'::jsonb);
Run Code Online (Sandbox Code Playgroud)
要提取特定项,假设text
第二个数组项的字段:
SELECT myfield#>>'{1,text}' AS text FROM test;
Run Code Online (Sandbox Code Playgroud)
这将输出:
text
------
PUMA
(1 row)
Run Code Online (Sandbox Code Playgroud)
为了提取text
数组内的所有字段,一个可能的解决方案是:
SELECT (jsonb_array_elements(myfield)::jsonb)->'text' AS text FROM test;
Run Code Online (Sandbox Code Playgroud)
输出是:
text
---------
"JIMIN"
"PUMA"
(2 rows)
Run Code Online (Sandbox Code Playgroud)
显然这适用于许多记录:每个数组项将被移植到每个数组的一行。此查询与 PostgreSQL 9.5 兼容。查看官方文档以创建更高效或更通用的查询(https://www.postgresql.org/docs/9.5/static/functions-json.html)。