簡體   English   中英

PostgreSQL過濾器基於嵌套json數組中的id

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM