![](/img/trans.png)
[英]Is it possible to put a CASE expression inside a While loop on SQL Server 2008?
[英]WHILE / LOOP inside CASE expression SQL - ORACLE
我正在测试一个包含 CASE 表达式的 select 语句,我需要在其中一个 WHEN 条件中添加一个 WHILE / LOOP。
此语句的逻辑最终将包含在 PL/SQL 脚本中,但我想在将其包含在程序中之前知道它 100% 工作。
该逻辑用于查询在 clob 列中找到的 XML 包内的邮政编码。
预期行动:
如果 ZIP > 5 位数字,则删除第 5 个字符后的所有内容。
如果 ZIP < 5 位数字,则添加 '0' 直到长度达到 5 个字符。
别的什么都不做。
需要什么:
使用 contact() 函数添加“0”的逻辑需要重复,直到新 zip 达到 5 个字符的长度。 实际上,该查询加起来最多只有一个“0”,但这需要根据总字符长度为 = '5' 的需要重复多次。 根据 Oracle SQL,我尝试添加 LOOP 或 WHILE 都会导致格式不正确。
询问:
SELECT ORDER_NUMBER,
EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip') as "ZIPS_INV",
LENGTH(EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip')) as "ZIPS_LEN",
CASE
/* add digits to zip WHILE/LOOP NEEDED HERE */
WHEN LENGTH(EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip')) < 5
THEN concat(EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip'), '0')
/* subtract digits to zip */
WHEN LENGTH(EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip')) > 5
THEN substr(EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip'), 1, 5)
ELSE
'correct format'
END as "FIXED_ZIP"
FROM quarantine;
您可以使用RPAD()
一次执行这两个操作:该函数可以根据目标长度填充字符串、截断它或保持它不变。
所以:
RPAD(
EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip'),
5,
'0'
)
在您的查询中:
SELECT
t.*,
LENGTH(zips_inv) zip_len,
RPAD(zip_inv, 5, '0') fixed_zip
CASE WHEN LENGTH(zips_inv) = 5
THEN 'correct format'
ELSE 'wrong format'
END zip_status
FROM (
SELECT
order_number,
EXTRACTVALUE(xmltype(PACKAGE), '/Package/fCustomerVO/invoiceAddress/zip') zips_inv
FROM quarantine
) t
我发现子查询在这里很有用,可以避免多次重复相同的冗长表达式。 此外,将 zip 值与其状态(正确与否)分开对我来说更有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.