簡體   English   中英

使用 REEXXP_REPLACE 將所有 CRLF 替換為 \r\n

[英]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

db<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM