我有一个俱乐部类型列,其中包含Json数据。 我有大约100个键,每个记录都是唯一的。 我们使用的是json_value(' json_data',' keyname')。 在我的情况下,我不知道这个记录的实际情况。所以我需要加入另一个表定义键的表。我想要传递columnname来代替keyname。 它给出了一些错误说:
语法错误,
期待:字符串
任何人都可以建议,如何通过在运行时传递动态密钥从json列获取数据。
假设我有两个table table_1和table_2。 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 :(得分:1)
架构无法直接支持您尝试执行的操作。基本上我们设置了一个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;