2016-10-03 41 views
0

我有一個要求來解析傳入的數據&獲取對應於特定鍵的值。我使用JSON_VALUE與假設我的數據是clob類型相同。JSON_VALUE可以返回多個值

{"REGION": "AMR", "CNTRY": "US"} 

如果我需要得到多個地區像「AMR」和「歐元」 (Ex: User selects 2 regions in the UI but selects only one country),我可以用JSON_VALUE從CLOB獲取值?如果是的話,clob的格式應該如何。

回答

0

問題的答案取決於JSON文檔的結構。但首先,是的,您可以從數據類型VARCHAR2BLOBCLOB獲取任何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關鍵詞完成的。我們指定我們想要列出regioncntry,它們都是VARCHAR2類型和JSON文檔中的路徑。正如我們已經告訴JSON_TABLE我們只想通過'$.REGIONS[*]'查看REGIONS的數組元素,現在我們可以選擇數組的元素,在這種情況下,$.REGION$.CNTRY。接下來的步驟很簡單。首先我們爲JSON_TABLE定義一個表別名,在這種情況下爲jt。現在回到SELECT部分​​,我們可以選擇剛剛生成的JSON文檔SELECT jt.region, jt.cntry中的那兩列。

你可以看看並嘗試上面的例子LiveSQL.oracle.com