繁体   English   中英

WHILE / LOOP 内 CASE 表达式 SQL - ORACLE

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM