我正在寻找一种解决方案,在DESCR属性字段下的整个字符串中出现特定的CODE符号后插入空格。
可用数据样本:
总体逻辑是SQL在使用CASE找到它时指定特定的CODE,否则它会分配静态的默认CODE。
CODEs如下: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)( )*',' \2 '))
正则表达式寻找[zero or more spaces][any one of your codes][zero or more spaces]
并用[ ][the code it found][ ]
替换它。如果代码出现在字符串的开头或结尾,则需要trim()
。 (我希望有一种方法可以在正则表达式本身中处理这个问题,但只需要对整个表达式进行操作就可以轻松了。)