簡體   English   中英

列中的 json 數組為 SQL

[英]SQL for json array in column

我有一個 SQL 表,其中一列為jsonb數據類型。 以下是 json 條目:

{
    "size": -1,
    "regions": [
        {
            "shape_attributes": {
                "name": "polygon",
                "X": [
                    2703,
                    2801,
                    2884
                ]
            },
            "region_attributes": {
                "Material Type": "wood",
                "Color": "red"
            }
        },
        {
            "shape_attributes": {
                "name": "polygon",
                "X": [
                    2397,
                    2504,
                    2767
                ]
            },
            "region_attributes": {
                "Material Type": "metal",
                "Color": "blue"
            }
        }
    ],
    "filename": "filenam_1"
}

我正在使用 PostgreSQL。 給定一個 search_string,對於這兩種情況,我如何使用 SQL 到 select 行 -

  1. 密鑰已知
  2. 密鑰未知,即 json 中任何位置的字符串

我試過這個

select * 
from TABLE_Name
WHERE ‘wood’ IN ( SELECT value FROM OPENJSON(COL_NAME,'$.Material Type'))  

---
Error occurred during SQL query execution
Reason:
SQL Error [42883]: ERROR: function openjson(jsonb, unknown) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
SELECT * 
FROM  TABLE_Name
CROSS APPLY OPENJSON(COL_NAME,'$.Material Type')
WHERE value ='wood'

---
Error occurred during SQL query execution
Reason:
SQL Error [42601]: ERROR: syntax error at or near "APPLY"

我認為你正在做的事情根本不可能,除非我不知道。 您可以使用編程語言,例如 Python 或 C#,並在程序中執行 SQL 查詢。 這要容易得多。

要查找具有已知鍵的鍵/值對,您可以使用幾種不同的方法,使用contains 運算符就是其中之一:

select *
from table_name
where the_jsonb_column @> '{"regions": [{"region_attributes": {"Material Type": "wood"}}]}'

上面提到的openjson function(來自 SQL 服務器)的等價物是jsonb_each()但是(就像openjson一樣)只會擴展頂級鍵/值對。 它不會遞歸地執行此操作。

如果您至少知道鍵位於regions數組中的某處,則可以使用遍歷所有元素的 JSON/Path 表達式(遞歸):

select *
from table_name
where (t.the_jsonb_column -> 'regions') @@ '$[*].** == "wood"'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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