SQL - 将 space 添加到字符串

SQL - adding space to a string

我正在寻找一种解决方案,可以在 DESCR 属性字段下的整个字符串中出现特定 CODE 符号后插入 space。

可用数据样本:

enter image description here

总体逻辑是 SQL 在使用 CASE 找到它时分配特定的代码,否则它分配静态的默认代码。

代码如下:VBN、BNM、XCV。随机的,因为我想表明每一个都有不同的长度和字母模式。

SELECT FUND_FAMILY,BUSINESS_UNIT_AP,VOUCHER_ID,INVOICE_ID, VENDOR_ID, DESCR
 FROM
 (
     SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as RowNumb, FUND_FAMILY,BUSINESS_UNIT_AP,VOUCHER_ID,INVOICE_ID, VENDOR_ID, DESCR
     FROM (

SELECT FUND_FAMILY||BUSINESS_UNIT_AP||VOUCHER_ID||INVOICE_ID||VENDOR_ID ID,FUND_FAMILY,BUSINESS_UNIT_AP,VOUCHER_ID,INVOICE_ID, VENDOR_ID, 

DESCR FROM (
SELECT
VOUCHER_LINE_NUM,
     CASE instr (DESCR, 'XCV') 
     WHEN  (0) 

     THEN (CASE instr (DESCR, 'VBN') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'BNM') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'ASD') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'ERT') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'ERY') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'RTTYUU') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'HJKKK') 
     WHEN  (0)

     THEN  'CODE2'  

     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE8'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE7'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE6'), 4) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE5'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE4'), 5) END)   
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE3'), 4) END)  
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE2'), 6) END)  

     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE1'), 4) 

     END AS FUND_FAMILY,

BUSINESS_UNIT_AP,VOUCHER_ID,INVOICE_ID,VENDOR_ID, DESCR FROM TABLE_NAME 

WHERE UNIT IN ('ETITY1')
AND ACCOUNT = '135000' 
AND FISCAL_YEAR > 2013

AND (DESCR LIKE '%CODE1%' OR DESCR LIKE '%CODE2%' OR DESCR LIKE '%CODE3%' OR DESCR LIKE '%CODE4%' OR DESCR LIKE '%CODE5%'
OR DESCR LIKE '%CODE6%' OR  DESCR LIKE '%CODE7%' OR DESCR LIKE '%CODE8%' OR DESCR LIKE '%CODE9%')

AND NOT DESCR LIKE '%CODE10%'

GROUP BY 
VOUCHER_LINE_NUM , 
     CASE instr (DESCR, 'CODE1') 
     WHEN  (0) 

     THEN (CASE instr (DESCR, 'CODE2') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'CODE3') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'CODE4') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'CODE5') 
     WHEN  (0) 
     THEN  (CASE instr (DESCR, 'CODE6') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'CODE7') 
     WHEN  (0)
     THEN  (CASE instr (DESCR, 'CODE8') 
     WHEN  (0)

     THEN  'CODE2'  

     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE8'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE7'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE6'), 4) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE5'), 5) END)
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE4'), 5) END)   
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE3'), 4) END)  
     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE2'), 6) END)

     ELSE  SUBSTR(DESCR, instr (DESCR, 'CODE1'), 4) 
     END, BUSINESS_UNIT_AP,VOUCHER_ID,INVOICE_ID,VENDOR_ID, DESCR


    )
        )
            ) X 
WHERE RowNumb = 1

听起来像是 regexp_replace 的工作。

trim(regexp_replace(descr,'( )*(FGIF|FTIF|FTOF|FTSF|FTSIF|FTSIIF|FTSMF|TISCE)( )*','  '))

正则表达式查找 [zero or more spaces][any one of your codes][zero or more spaces] 并将其替换为 [ ][the code it found][ ]。如果代码出现在字符串的开头或结尾,则需要 trim()。 (我希望有一种方法可以在正则表达式本身中处理这个问题,但是 trim 整个表达式要容易得多。)