[英]Replace all CRLF with \r\n using REXEXP_REPLACE
我有一個需要從 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,但僅限於第一個實例。
我已經嘗試了無數次迭代。 沒有一個能解決問題。 任何想法都會受到歡迎。
您需要連接要替換的兩個字符,而不僅僅是將它們放在括號中(即使您同時提供了兩者):
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.