問題的答案取決於JSON文檔的結構。但首先,是的,您可以從數據類型VARCHAR2
,BLOB
和CLOB
獲取任何JSON值。
我假設,根據您對需求的解釋方式,JSON的結構將帶有一系列區域,本身就是您在上面指出的對象。因此,讓我們假設你有一個JSON這樣的:
{
"REGIONS": [
{"REGION": "AMR", "CNTRY": "US"},
{"REGION": "EUR", "CNTRY": "AT"}
]
}
在這種情況下JSON_VALUE
不再是不夠的,因爲JSON_VALUE
設計獲得從JSON文件給定標值(注意,在這方面Oracle 12.2 will have significant enhancements)。但是在上面的例子中,您實際上需要將該對象數組建模爲關係行,即(您有一個JSON文檔,但是應該成爲一行的條目數組)。在這種情況下,您必須使用JSON_TABLE
來生成行。因此,對於上面的例子,你可以編寫一個查詢,如:
CREATE TABLE customers (doc CLOB CONSTRAINT doc_valid_json CHECK (doc IS JSON));
INSERT INTO customers (doc) VALUES ('
{
"REGIONS": [
{"REGION": "AMR", "CNTRY": "US"},
{"REGION": "EUR", "CNTRY": "AT"}
]
}');
COMMIT;
SELECT jt.region, jt.cntry
FROM customers c, JSON_TABLE(c.doc, '$.REGIONS[*]'
COLUMNS (region VARCHAR2(3) PATH '$.REGION',
cntry VARCHAR2(2) PATH '$.CNTRY')) jt;
的SQL上面會做以下,開始在FROM子句:它讀取持有我們的JSON文檔列doc
爲CLOB表customers
。接下來它應用JSON_TABLE
運算符,它爲我們提供了一些技巧。首先我們需要將它傳遞給包含JSON文檔的列,在我們的例子中是doc
列。然後我們可以給它一個路徑前綴,即一個機制,這樣我們就不必一遍又一遍地重複整個路徑。我們告訴JSON_TABLE
我們只想查看數組中出現的「REGIONS」的所有元素,通過[*]
標記。作爲最後一步,我們必須告訴JSON_TABLE
我們希望這些元素在關係世界中看起來像什麼,即我們想要使用哪些列名稱和數據類型。這是通過COLUMNS
關鍵詞完成的。我們指定我們想要列出region
和cntry
,它們都是VARCHAR2類型和JSON文檔中的路徑。正如我們已經告訴JSON_TABLE
我們只想通過'$.REGIONS[*]'
查看REGIONS的數組元素,現在我們可以選擇數組的元素,在這種情況下,$.REGION
和$.CNTRY
。接下來的步驟很簡單。首先我們爲JSON_TABLE
定義一個表別名,在這種情況下爲jt
。現在回到SELECT部分,我們可以選擇剛剛生成的JSON文檔SELECT jt.region, jt.cntry
中的那兩列。
你可以看看並嘗試上面的例子LiveSQL.oracle.com