DB2 Coalesce函数返回null

时间:2011-12-15 20:54:29

标签: sql db2 coalesce

我正在使用DB2 for 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 个答案:

答案 0 :(得分:2)

如果你只是试图摆脱所有字母字符的ONIVRF,你可以这样做:

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

这有点hackish,因为DB2没有ISNUMERIC()等价物。但字母字符是唯一将由小写和小写函数翻译的字符。

我在DB2 for z / OS(v9)上对此进行了测试,但它确实有效,但我不确定DB2 for iSeries是否完全相同。在我的情况下,它就像@Joe Stefanelli所说的那样,并在尝试将字母串转换为NUMERIC时引发错误。

修改

这可能会更好(假设你没有任何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