[英]PostgreSQL filter based on an id in a nested json array
我在表中有一個json字段(存儲為文本),我想從json中提取具有嵌套數組(在json中)中具有指定ID的某些項。
每個json項都有一個type
屬性和一個value
屬性。 該value
還具有我想用來過濾的GRI
屬性(數組)。 這是一個streamfield列項目的示例:
[{"type": "paragraph",
"value": {"paragraph": "<p>Sample paragraph 91</p>", "GRI": [27, 91, 211]},
{"type": "paragraph",
"value": {"paragraph": "<p>Sample paragraph 191</p>", "GRI": [13, 191, 271]}]
該查詢的工作原理是:
SELECT value FROM "sampletable" r, json_array_elements(r.streamfield::json) obj
WHERE obj->>'type' = 'paragraph' AND obj#>>'{value,GRI}' LIKE '%91%';
這將為我提供所有ID為91的商品。而且還包含ID 191、291等...
那么,如何將“ obj#>>” {value,GRI}'語句轉換為數組,以便可以基於指定的ID進行過濾?
這是用於此的SQLFiddle: http ://sqlfiddle.com/#!15/184e1/1
編輯:澄清的JSON結構
這是我將如何處理的方法。 基本上,您需要將JSON數組的項目作為一個集合返回,然后從中創建一個PostgreSQL數組。
DROP TABLE IF EXISTS "sampletable";
CREATE TEMP TABLE "sampletable" (streamfield TEXT);
INSERT INTO "sampletable" VALUES ('{"type": "paragraph", "value": {"paragraph": "<p>Sample paragraph 91</p>", "GRI": [27, 91, 211]}}');
-- Easier to separate out in a CTE, but this could be a subquery, if need be.
WITH cte AS
(
SELECT
(streamfield::JSON)->>'type' AS type_text,
JSON_EXTRACT_PATH_TEXT(streamfield::JSON,'value','paragraph') AS paragraph_text,
(SELECT ARRAY_AGG(col::INT) FROM JSON_ARRAY_ELEMENTS_TEXT(JSON_EXTRACT_PATH(streamfield::JSON,'value','GRI')) tbl(col)) AS gri_array -- This is an INT array now
FROM
"sampletable"
)
SELECT
type_text,
paragraph_text,
gri_array
FROM
cte
WHERE
type_text = 'paragraph' AND
91 = ANY(gri_array)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.