2017-03-17 48 views
0

我有一個包含Json數據的俱樂部類型列。 我有大約100個按鍵,每個記錄都是唯一的。 我們正在使用json_value('json_data','keyname')。 在我的情況下,我不知道這個記錄的實際情況。所以我需要加入另一個表格,其中定義了鍵。我想要傳遞列名來代替鍵名。 它提供了一些錯誤說:在Oracle中傳遞JSON_VALUE()中的動態密鑰

語法錯誤,
期待:字符串

因此可以在任何一個建議,如何通過傳遞運行時動態鍵搞定從JSON列數據。

可以說我有兩個表table_1和table_2。 012_Table_1有一個名爲json_data_column的列,它以json格式存儲數據。Table_1具有映射關鍵字的FK到TABLE_2。 所以我們必須找出每個記錄的動態密鑰的價值。

如果我給任何靜態字符串代替t2.json_key,那麼它的工作。 但是,當給動態值,它不工作。

工作

select 
     json_value (json_value (t1.json_data_column, '$.string'), '$.my_key') 
from TABLE_1 t1 
     inner join TABLE_2 t2 on t1.json_key_fk = t2.id 

不工作

select 
     json_value (json_value (t1.json_data_column, '$.string'), t2.json_key) 
from TABLE_1 t1 
     inner join TABLE_2 t2 on t1.json_key_fk = t2.id 

數據集:

{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"} 

{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"} 

{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"} 

{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"} 
+0

您可以發佈一些示例數據?這將幫助我們形象化你的問題 – APC

回答

0

什麼你正在嘗試做的,不能直接通過該架構支持。基本上我們設置了一個JSON PATH引擎,用於搜索表中的每一行(集合中的文檔),以獲取在語句編譯時定義的一組路徑。在您的情況下,您希望我們能夠使用直到檢索行才能知道的路徑。

12.2

(也就是現在的GA),我們可以使用PL/SQL JSON功能做到這一點..

SQL> set lines 120 pages 0 
SQL> with FUNCTION GET_NAME(P_JSON_DOC in VARCHAR2) RETURN VARCHAR2 
    2 is 
    3 begin 
    4 return SUBSTR(P_JSON_DOC,INSTR(P_JSON_DOC,'"',1,5)+1,INSTR(P_JSON_DOC,'"',1,6)-INSTR(P_JSON_DOC,'"',1,5)-1); 
    5 end; 
    6 FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2 
    7 is 
    8 JO JSON_OBJECT_T; 
    9 begin 
10 JO := JSON_OBJECT_T(P_JSON_DOC); 
11 return JO.get_STRING(P_KEY); 
12 end; 
13 MY_TABLE as (
14 select COLUMN_VALUE JSON_DOC 
15  from TABLE(
16    XDB$STRING_LIST_T(
17    '{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\" 
:\"COMPLETED\"}"}', 
18    '{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\" 
:\"COMPLETED\"}"}', 
19    '{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\" 
status\":\"COMPLETED\"}"}', 
20    '{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"s 
tatus\":\"COMPLETED\"}"}' 
21   ) 
22   ) 
23 ) 
24 select GET_NAME(EMBEDDED_JSON),GET_KEY_VALUE(EMBEDDED_JSON,GET_NAME(EMBEDDED_JSON)) 
25 from (
26   select JSON_VALUE(JSON_DOC,'$.string') EMBEDDED_JSON 
27    from MY_TABLE 
28  ) 
29/
isActive 
true 

isDelete 
true 

isUnderProgress 
false 

isSentToClient 
false 


SQL> 

在12.1 GET_NAME功能可以使用EXECUTE IMMEDIATE

FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2 
is 
    V_RESULT VARCHAR2(200); 
begin 
    EXECUTE IMMEDIATE 'select JSON_VALUE(:1,''$.' || P_KEY || ''') from dual' into V_RESULT using P_JSON_DOC; 
    return V_RESULT; 
end;