我有以下查询
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列的示例数据
答案 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)
最后但并非最不重要,对您而言,一个重要的建议是使用JOIN ON
语法的ANSI标准而不是过时的tablea,tableb
语法