我有一個需要從 SQL 陳述句中洗掉所有 CRLF 并將它們與文字字符 \r\n 一起存盤并將其存盤在 .json 檔案中的程序。稍后,當 .json 檔案重新插入資料庫時??,此程序會反轉。
我正在使用 ORACLE 19c。
原始(縮寫)SQL 可能如下所示:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME
FROM sztdhof
LEFT JOIN SPRIDEN
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM
RIGHT JOIN SSBSECT
ON sztdhof_CRN = SSBSECT_CRN
WHERE spriden_change_ind IS NULL
生成的字串應如下所示:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\nFROM sztdhof\r\nLEFT JOIN SPRIDEN\r\nON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\nRIGHT JOIN SSBSECT\r\nON sztdhof_CRN = SSBSECT_CRN \r\nWHERE spriden_change_ind IS NULL
我嘗試了多種方法讓 ORACLE REGEXP_REPLACE 一起識別回車和換行。似乎沒有一個作業。
首先,我將 db 中的值讀入變數 v_text。然后我嘗試轉換并將結果放入第二個變數 v_outtext。如果我使用兩個單獨的陳述句,每個陳述句都單獨作業。我可以接受這種方法,但我希望這可以作為一個單一的陳述。(注意。我也嘗試過 REPLACE 函式,結果相似。)
這段代碼...
SELECT REPLACE (v_text, chr(13) , '\r\n')
INTO v_outtext
FROM dual;
產生...
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\n
FROM sztdhof\r\n
LEFT JOIN SPRIDEN\r\n
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\n
RIGHT JOIN SSBSECT\r\n
ON sztdhof_CRN = SSBSECT_CRN \r\n
WHERE spriden_change_ind IS NULL\r\n
SELECT REGEXP_REPLACE(v_text, chr(10) , '\r\n')-- 與上面類似,除了 \r\n 位于每行的前面。
SELECT REGEXP_REPLACE(v_text, (chr(13)chr(10) , '\r\n')給我一個錯誤,缺少右括號。
SELECT REGEXP_REPLACE (v_text, '(\r\n)', '\r\n')將 r 替換為 \r 并將 n 替換為 \n,但僅限于第一個實體。
我已經嘗試了無數次迭代。沒有一個能解決問題。任何想法都會受到歡迎。
uj5u.com熱心網友回復:
您需要連接要替換的兩個字符,而不僅僅是將它們放在括號中(即使您同時提供了兩者):
SELECT REPLACE(v_text, chr(13) || chr(10) , '\r\n')
INTO v_outtext
FROM dual;
如果它已經在 PL/SQL 變數中,則無需切換到背景關系切換來從對偶中進行選擇;您可以簡化為:
v_outtext := REPLACE(v_text, chr(13) || chr(10) , '\r\n');
但聽起來您可以使用第一種方法v_outtext一次性將資料庫中的值讀入,而無需中間v_text.
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490005.html
