我們有 2 個表,如下所示:
表一:
| 行號 | 描述 |
|---|---|
| 1 | {"to": " 1111", "from": "9999"} |
| 2 | {"to": " 5555", "from": "8888"} |
表 B:
| COL1 | COL2 |
|---|---|
| 1111 | 222 |
| 5555 | 666 |
請幫助我使用 Oracle 查詢替換上表中表 A 中的部分描述列。文本“to:”后出現的數字,即表A(說明欄)的 1111 和 5555 應與表B 的COL1 進行比較,并替換為相應的COL2 值。
例如:將表 A 中的 1111 替換為 222 將表 A 中的 5555 替換為 666
表 A 應該看起來像這個運行后的查詢。
表一:
| 行號 | 描述 |
|---|---|
| 1 | {"to": "222", "from": "9999"} |
| 2 | {“到”:“666”,“從”:“8888”} |
提前致謝 :)
uj5u.com熱心網友回復:
您可以在 PL/SQL 代碼值中使用專用于 JSON 的技術,例如
DECLARE
v_jsoncol tableA.description%TYPE;
v_json_obj json_object_t;
v_new_jsoncol tableA.description%TYPE;
v_col1 tableB.col1%TYPE;
v_col2 VARCHAR2(25);
l_key_list json_key_list;
BEGIN
FOR c IN
(
SELECT *
FROM tableA
)
LOOP
v_json_obj := TREAT(json_element_t.parse(c.description) AS json_object_t);
l_key_list := v_json_obj.get_keys;
FOR i IN 1 .. l_key_list.COUNT
LOOP
IF l_key_list (i) = 'to' THEN
v_col1 := v_json_obj.get_string (l_key_list (i));
SELECT TO_CHAR(col2)
INTO v_col2
FROM tableB
WHERE col1 = v_col1;
v_json_obj.put(l_key_list (i),v_col2);
v_new_jsoncol := v_json_obj.to_string;
UPDATE tableA SET description = v_new_jsoncol WHERE row_num = c.row_num;
END IF;
END LOOP;
END LOOP;
END;
/
Demo
uj5u.com熱心網友回復:
我使用 instr 獲取第 3 和第 4 個“字符位置以獲取內部值并將其替換為其他查詢。
注意: ROWNUM , description 是保留關鍵字,所以我建議不要將它們用作列名
這是最終的代碼:
SELECT ROWNUM ,
REPLACE (description ,
SUBSTR( description , INSTR(description, '"', 1, 3) 1,
INSTR(description, '"', 1, 4) - INSTR(description, '"', 1, 3)-1) ,
(select COL2 from tblB where COL1 =
SUBSTR( description , INSTR(description, '"', 1, 3) 1,
INSTR(description, '"', 1, 4) - INSTR(description, '"', 1, 3)-1)
)
)
from tblA
uj5u.com熱心網友回復:
不要為此使用字串函式。您應該使用 JSON 函式并且可以使用JSON_MERGEPATCH:
MERGE INTO table_a dst
USING (
SELECT a.ROWID AS rid,
b.col2
FROM table_a a
INNER JOIN table_b b
ON JSON_VALUE(a.description, '$.to' RETURNING VARCHAR2(10)) = b.col1
) src
ON (dst.ROWID = src.RID)
WHEN MATCHED THEN
UPDATE
SET description = JSON_MERGEPATCH(
dst.description,
JSON_OBJECT(KEY 'to' VALUE src.col2)
);
其中,對于您的示例資料:
CREATE TABLE Table_A (description CLOB CHECK (description IS JSON));
INSERT INTO table_a (description)
SELECT '{"to": " 1111", "from": "9999"}' FROM DUAL UNION ALL
SELECT '{"to": " 5555", "from": "8888"}' FROM DUAL;
CREATE TABLE Table_B (COL1, COL2) AS
SELECT ' 1111', 222 FROM DUAL UNION ALL
SELECT ' 5555', 666 FROM DUAL;
然后:
SELECT * FROM table_a;
輸出:
描述 {"to":222,"from":"9999"} {"to":666,"from":"8888"}
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330505.html
標籤:甲骨文
