DB2:将varchar转换为货币

时间:2020-01-24 20:36:24

标签: db2

在这种情况下,我有2个varchar(64)值,这些值都是小数(例如COLUMN1和COLUMN2,都是varchar,都是小数(货币))。我需要在这里说一个where子句:

COLUMN1 < COLUMN2

我相信我必须将这2个varchar列转换为不同的数据类型,以便像这样进行比较,但是我不确定该怎么做。我尝试了直接的CAST:

CAST(COLUMN1 AS DECIMAL(9,2)) < CAST(COLUMN2 AS DECIMAL(9,2))

但是我必须知道那太容易了。任何帮助表示赞赏。谢谢!

3 个答案:

答案 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)chardecfloat之间进行“安全”转换(如果需要,可以使用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|                                          |
相关问题