首页 > 解决方案 > 以路径作为查询列值的 Oracle JSON_QUERY

问题描述

我尝试在此选择的每个结果行中获取 JSON 列的一部分

SELECT TRIM(a.symbol),
       TRIM(a.ex_name),
       to_char(a.date_rw, 'dd-MON-yyyy'),
       a.pwr,
       a.last,
       JSON_QUERY(b.mval, '$."-9"') as value
FROM   adviser_log a
       INNER JOIN profit_model_d b
       ON a.date_rw = b.date_rw
WHERE  a.date_rw = '08-OCT-2021'

选择结果:

VERY    NAS  08-OCT-2021    -9  8.9443 {"sl":-3.6,"tp":5,"avg":1.368,"max":5,"min":-3.6,"count":1}

作为 json 路径,我输入了“-9”字面量,但我想将其作为路径 a.pwr

我想将与 a.pwr 比较的部分 json 匹配到 select 中的每一行

谢谢

标签: oracleoracle19c

解决方案


您可以使用函数来动态获取 JSON 值:

WITH FUNCTION get_value(
  value IN CLOB,
  path  IN VARCHAR2
) RETURN VARCHAR2
IS
BEGIN
  RETURN JSON_OBJECT_T( value ).get_object( path ).to_string();
END;
SELECT TRIM(a.symbol) AS symbol,
       TRIM(a.ex_name) AS ex_name,
       to_char(a.date_rw, 'dd-MON-yyyy') AS date_rw,
       a.pwr,
       a.last,
       get_value(b.mval, a.pwr) AS value
FROM   adviser_log a
       INNER JOIN profit_model_d b
       ON a.date_rw = b.date_rw
WHERE  a.date_rw = DATE '2021-10-08'

其中,对于您的示例数据:

CREATE TABLE adviser_log (symbol, ex_name, date_rw, pwr, last) AS
SELECT 'VERY', 'NAS', DATE '2021-10-08', -9, 8.9443 FROM DUAL;

CREATE TABLE profit_model_d (date_rw DATE, mval CLOB CHECK (mval IS JSON));

INSERT INTO profit_model_d (
  date_rw,
  mval
) VALUES (
  DATE '2021-10-08',
  '{"-9":{"sl":-3.6,"tp":5,"avg":1.368,"max":5,"min":-3.6,"count":1}}'
);

输出:

象征 EX_NAME DATE_RW 压水堆 最后的 价值
非常 NAS 2021 年 10 月 8 日 -9 8.9443 {"sl":-3.6,"tp":5,"avg":1.368,"max":5,"min":-3.6,"count":1}

db<>在这里摆弄


推荐阅读