在这种情况下,我有2个varchar(64)值,这些值都是小数(例如COLUMN1和COLUMN2,都是varchar,都是小数(货币))。我需要在这里说一个where子句:
COLUMN1 < COLUMN2
我相信我必须将这2个varchar列转换为不同的数据类型,以便像这样进行比较,但是我不确定该怎么做。我尝试了直接的CAST:
CAST(COLUMN1 AS DECIMAL(9,2)) < CAST(COLUMN2 AS DECIMAL(9,2))
但是我必须知道那太容易了。任何帮助表示赞赏。谢谢!
答案 0 :(得分:3)
您可以创建这样的UDF,以检查哪些值不能强制转换为DECIMAL
CREATE OR REPLACE FUNCTION IS_DECIMAL(i VARCHAR(64)) RETURNS INTEGER
CONTAINS SQL
--ALLOW PARALLEL -- can use this on Db2 11.5 or above
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN
DECLARE NOT_VALID CONDITION FOR SQLSTATE '22018';
DECLARE EXIT HANDLER FOR NOT_VALID RETURN 0;
RETURN CASE WHEN CAST(i AS DECIMAL(31,8)) IS NOT NULL THEN 1 END;
END
例如
CREATE TABLE S ( C VARCHAR(32) );
INSERT INTO S VALUES ( ' 123.45 '),('-00.12'),('£546'),('12,456.88');
SELECT C FROM S WHERE IS_DECIMAL(c) = 0;
会返回
C
---------
£546
12,456.88
答案 1 :(得分:1)
真的很容易...这很好...
select cast('10.15' as decimal(9,2)) - 1
from sysibm.sysdummy1;
您的数据中除了有效的数字字符外,还有其他内容。 而且除了前导或尾随空格...
尝试以下操作...
select *
from table
where translate(column1, ' ','0123456789.')
<> ' '
or translate(column2, ' ','0123456789.')
<> ' '
这将向您显示带有字母字符的行...
如果上面没有返回任何内容,则您可能有一个带双小数点或其他内容的字符串... 您可以使用正则表达式找到那些。
答案 2 :(得分:0)
具有无需UDF的内置功能。<br/>
下面的xmlcast
函数在(var)char
和decfloat
之间进行“安全”转换(如果需要,可以使用as double
或作为decimal(X, Y)
使用)。如果无法转换,则返回NULL
。
您可以在WHERE
子句中两次使用这样的表达式。
SELECT
S
, xmlcast(xmlquery('if ($v castable as xs:decimal) then xs:decimal($v) else ()' passing S as "v") as decfloat) D
FROM (VALUES ( ' 123.45 '),('-00.12'),('£546'),('12,456.88')) T (S);
|S |D |
|---------|------------------------------------------|
| 123.45 |123.45 |
|-00.12 |-0.12 |
|£546 | |
|12,456.88| |