0

我正在为 IBM i V6R1 使用 DB2,并且我正在尝试将一个字符串值转换为一个数字,该字符串有时具有数字的有效表示。我想出的是:

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),我会得到完全相同的结果。)

我在这里做错了什么?

4

1 回答 1

2

如果您只是想摆脱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 for z/OS (v9) 上对此进行了测试,它确实有效,但我不确定 DB2 for iSeries 是否完全相同。在我的身上,它按照@Joe Stefanelli 所说的那样做,并在尝试将字母字符串转换为NUMERIC.

编辑:

这可能会更好(假设你不会有任何ONIVRFs 都是波浪号)。@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
于 2011-12-15T22:47:02.517 回答