gpt4 book ai didi

sql - 在 Oracle 中的 JSON_VALUE() 中传递动态 key

转载 作者:行者123 更新时间:2023-12-04 21:54:16 26 4
gpt4 key购买 nike

我有一个包含 Json 数据的俱乐部类型列。
我有大约 100 个键,每条记录都是独一无二的。
我们正在使用 json_value('json_data', 'keyname')。
就我而言,我不知道这个记录的实际情况。所以我需要加入另一个定义了键的表。代替键名,我想传递列名。
它给出了一些错误说:

语法错误,
期望:字符串

任何人都可以建议如何通过在运行时传递动态键来从 json 列中获取数据。

假设我有两个表 table_1 和 table_2。
Table_1 有一个名为 json_data_column 的列,它以 json 格式存储数据。
Table_1 有 FK 到 TABLE_2 有映射键。
所以我们必须找出每条记录的动态键的值是多少。

如果我给任何静态 String 代替 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\"}"}

最佳答案

架构不能直接支持您尝试做的事情。基本上,我们设置了一个 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;

关于sql - 在 Oracle 中的 JSON_VALUE() 中传递动态 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42861070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com