我正在使用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)
,我会得到完全相同的结果。)
我在这里做错了什么?
答案 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