Функция DB2 Coalesce возвращает нули - PullRequest
0 голосов
/ 16 декабря 2011

Я использую DB2 для IBM i V6R1 и пытаюсь преобразовать строковое значение, которое иногда содержит действительное представление числа в число.Я придумал вот что:

select onorno, onivrf, coalesce(cast(substr(onivrf,1,5) as numeric),99999) as fred
from oinvol

иногда в поле ONIVRF есть данные типа «00111-11», иногда в нем есть данные типа «FREIGHT».

Документация приводит меня кповерьте, что для таких данных:

ONORNO ONIVRF
12     11010-11
13     FREIGHT
14     00125-22

я должен получить вывод, подобный этому:

ONORNO ONIVRF    FRED
12     11010-11  11010
13     FREIGHT   99999
14     00125-22  125

Вместо этого я получаю это:

ONORNO ONIVRF    FRED
12     11010-11  11010
13     FREIGHT   NULL
14     00125-22  125

(Я пропускаю coalesce() и просто использую Cast(substr(onivrf(1,5) as numeric), я получаю точно такие же результаты.)

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 16 декабря 2011

Если вы просто пытаетесь избавиться от ONIVRF s, которые являются буквенными символами, вы можете сделать что-то вроде этого:

SELECT ONORNO, ONIVRF, 
    CASE 
        WHEN UCASE(SUBSTR(ONIVRF,1,5)) = LCASE(SUBSTR(ONIVRF,1,5)) THEN CAST(SUBSTR(ONIVRF,1,5) AS NUMERIC)
        ELSE 99999
    END AS fred
FROM OINVOL

Это немного глупо, потому что у DB2 нет эквивалента ISNUMERIC(). Но буквенные символы - единственные, которые будут переведены функциями верхнего и нижнего регистра.

Я протестировал это в DB2 для z / OS (v9), и это сработало, но я не уверен, что DB2 для iSeries точно такой же. В моем случае это было сделано, как сказал @Joe Stefanelli, и выдало ошибку при попытке привести буквенную строку к NUMERIC.

Edit:

Это может сработать лучше (при условии, что у вас не будет никаких ONIVRF с тильдами). Не должно возникнуть проблемы, когда в @ X-Zero упоминается, что некоторые символы на языках, отличных от английского, не имеют строчных и прописных букв.

SELECT ONORNO, ONIVRF,
    CASE
        WHEN TRANSLATE(ONIVRF, '~~~~~~~~~~~', '0123456789-') = '~~~~~~~~' THEN CAST(SUBSTR(ONIVRF,1,5) AS NUMERIC)
        ELSE 99999
    END AS fred
FROM OINVOL
...