WHILE / L OOP внутри CASE выражение SQL - ORACLE - PullRequest
1 голос
/ 15 января 2020

Я тестирую оператор выбора, содержащий выражение CASE, и мне нужно добавить WHILE / L OOP в одно из условий WHEN.

Логика c из этого оператора в конечном итоге будет включена внутри скрипта PL / SQL, но я хочу знать, что он работает на 100%, прежде чем я включу его в процедурный.

Logi c служит для запроса почтового индекса внутри XML пакет найден в столбце clob.

ПРЕДПОЛАГАЕМОЕ ДЕЙСТВИЕ:

, если ZIP> 5 цифр, затем удалить все после 5-го символа.

, если ZIP <5 цифр, затем добавить '0 'пока длина не достигнет 5 знаков. </p>

, иначе ничего не делать.

ЧТО НУЖНО:

Лог c, который добавляет' 0 ', используя функцию contact () Необходимо повторить, пока новый почтовый индекс не достигнет длины 5 символов. Как таковой, запрос добавляет только один '0', но это должно повторяться столько раз, сколько требуется для общей длины символа до = '5'. Все мои попытки добавить L OOP или WHILE приводят к неправильному форматированию в соответствии с Oracle SQL.

QUERY:

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;

1 Ответ

3 голосов
/ 15 января 2020

Вы можете выполнять обе операции одновременно с 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 от его состояния (правильное или нет) имеет больше смысла для меня.

...