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
整个表达式要容易得多。)
我正在寻找一种解决方案,可以在 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
整个表达式要容易得多。)