使用强制转换在select语句中转换数据类型

时间:2018-02-19 05:13:32

标签: sql oracle select casting

我有以下查询

SELECT SUM(CAST(A.OVERTIME as float)) 
FROM DUTY_TRAN1 A,DUTY_MAS B 
WHERE A.DOC_NO=B.DOC_NO 
  AND A.FROM_DATE='01-JAN-18' 
  AND A.TO_DATE='31-JAN-18' 

A.OVERTIME在varchar中。我希望在float或int中转换它以使SUM函数起作用。我收到错误的无效号码。

varchar列的示例数据

enter image description here

1 个答案:

答案 0 :(得分:1)

问题是您的OVERTIME在某些列中包含非数字字符,例如空格/字母数字。第一步是识别它们。

使用translate的查询将产生十进制数字中找不到的所有字符。

SELECT * FROM  DUTY_TRAN1 A WHERE translate (OVERTIME,'x.+-0123456789','x') 
IS NOT NULL;

上述查询将返回包含除数字以外的任何内容的行,a"。"和" + / - "符号。如果你的字符串有一个"这将有效。"字符。对于最高12.1的Oracle版本中带小数的综合测试,您可能必须使用REGXP_或用户定义的函数。请参阅以下链接:

https://www.techonthenet.com/oracle/questions/isnumeric.php

然后,您可以将它们从WHERE子句中排除,以便SUM仅适用于数字字符。

with t(n)
AS
(
  select '1.5' FROM DUAL UNION ALL
  select '.6' FROM DUAL UNION ALL
  select NULL FROM DUAL UNION ALL
  select '22.5'  FROM DUAL UNION ALL
  select 'a'  FROM DUAL
  )
select  SUM (CAST ( n  AS FLOAT ) ) 
FROM t WHERE translate (n,'x+-.0123456789','x') 
IS  NULL; 

如果您运行的是Oracle 12.2,则可以在DEFAULT return_value ON CONVERSION ERROR中指定CAST子句。

CAST(OVERTIME 
       AS FLOAT
       DEFAULT 0 ON CONVERSION ERROR)

CAST

最后但并非最不重要,对您而言,一个重要的建议是使用JOIN ON语法的ANSI标准而不是过时的tablea,tableb语法