JSON_DATAGUIDE只給了我鍵,而不是像"$.a "那樣的值。我怎樣才能得到下面這個例子中的鍵值對呢?
select json_dataguide('{a:100, b:200, c:300}'/span>)
from dual;
JSON_DATAGUIDE('{A:100,B:200,C:300}'/span>)
--------------------------------------------------------------------------------
[{"o:path":"$.a", "type": "number", "o:length":4},{"o:path":"$.b", "type": "number","
o:length":4},{"o:path":"$.c", "type": "number", "o:length":4}]
我需要這樣的表格:
Column Key, ColumnValue
a100
b200
c300
我想在不使用declare,begin等情況下找到它。只有內置函式,例如json_table,json_dataguide。我不希望宣告函式或其他東西。
uj5u.com熱心網友回復:
一個替代方案是
declare
j JSON_OBJECT_T;
i NUMBER;
k JSON_KEY_LIST。
CURSOR c_json IS
SELECT '{a:100, b:200, c:300}' as myJsonCol from dual;
begin[/span
FOR rec IN c_json
回圈
j := JSON_OBJECT_T.parse(rec.myJsonCol)。
k := j.get_keys;
dbms_output.put_line('KEY VAL'/span>)。
FOR i in 1..k.COUNT
回圈
dbms_output.put_line(k(i) || ' ' || j.get_Number(k(i)) )。
END LOOP;
END LOOP;
END;
/>
演示
然后你可以將結果存盤在sys_refcursor中,如果你想的話,甚至可以創建一個表函式。
uj5u.com熱心網友回復:
在后來的Oracle版本中,你可以在SELECT陳述句的子查詢保理(WITH)子句中包含函式。然后,你可以使用這個答案:
WITH FUNCTION get_key(
pos IN PLS_INTEGER,
json IN CLOB
) RETURN VARCHAR2
AS AS
doc_keys JSON_KEY_LIST。
BEGIN
doc_keys := JSON_OBJECT_T.PARSE ( json ).GET_KEYS。
RETURN doc_keys( pos ) 。
END get_key;
SELECT get_key( j.pos, t.value ) as key,
j.value
FROM table_name t
CROSS APPLY JSON_TABLE(
t.value,
'$.*'
COLUMNS (
pos FOR ORDINALITY,
value PATH '$'
)
) j;
其中,對于示例資料:
CREATE TABLE table_name ( value VARCHAR2(4000) CHECK (value IS JSON) ) 。
INSERT INTO table_name (value) VALUES ('{a:100, b:200, c:300}'/span>) 。
輸出:
KEY VALUE a 100
c c c c
只有內置函式,例如json_table,json_dataguide
你將會在這些限制中掙扎,因為:
你將會在這些限制中掙扎。
JSON_QUERY只允許路徑的字面值;你不能傳遞一個動態的路徑值。JSON_TABLE似乎允許COLUMNS子句中的動態路徑,但是不能為這些動態路徑回傳一個值。
例如:
SELECT t.value AS json,
SUBSTR(p.path, 3) AS key,
JSON_QUERY(t.value, p.path) AS value
FROM table_name t
CROSS JOIN LATERAL(
SELECT JSON_DATAGUIDE(t.value) AS data
FROM DUAL
) d
CROSS JOIN LATERAL(
SELECT path
FROM JSON_TABLE(
d.data,
'$[*]'/span>
COLUMNS(
path VARCHAR2(20) PATH '$. "o:path"')
)
)
) p;
輸出:
ORA-40454: path expression not a literal
并且:
SELECT t.value AS json,
SUBSTR(p.path, 3) AS key,
v.val AS value
FROM table_name t
CROSS JOIN LATERAL(
SELECT JSON_DATAGUIDE(t.value) AS data
FROM DUAL
) d
CROSS JOIN LATERAL(
SELECT path
FROM JSON_TABLE(
d.data,
'$[*]'/span>
COLUMNS(
path VARCHAR2(20) PATH '$. "o:path"')
)
)
) p
CROSS JOIN LATERAL(
SELECT val
FROM JSON_TABLE(
t.value,
'$'
COLUMNS(
val VARCHAR2(20) PATH p.path
)
)
) v;
輸出:
JSON KEY VALUE {"a":100, "b":200, "c":300}? a <null>/em> {"a":100, "b":200, "c":300}? b <null> <{"a":100, "b":200, "c":300}? c <null> <
雖然這個查詢是有效的,但它并不能動態地獲得值。(注意:如果你使用一個字面的路徑而不是動態的路徑,那么這個查詢將是有效的。)
db<>fiddle>db<>fiddle here
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325019.html
標籤:
