用于从字段编号中删除char的SQL代码

时间:2017-12-01 22:00:38

标签: sql oracle

我正在尝试编写一个用于Excel 2013宏的SQL。 我的目标是根据相关字段的值返回某些数字的平均值。

我的问题是有些数字包含>在第一个字符处签名。我一直试图用SQL检测并忽略>签名,因为我需要将数字包含在返回的平均值中(不能只是扔掉实例)。

最后,我无法更改数据,我们的管理员必须保持完整(即使数据管理不佳)。

以下是我发出的错误:

animation-duration

当数据不包含> (比如> 10000)没有问题,它就像一个冠军。 当数据包含>我收到错误ORA-01722:无效号码

我试图将字段中的数据转换为十进制,但它也会抛出错误:

SELECT AVG(CASE WHEN data.study = 'studyname' THEN data.result ELSE NULL END)
FROM database data
WHERE data.ID = '12345'

这给了我同样的错误。 我试图使用LEFT函数来确定最左边的char是否是>但我似乎无法正确理解语法,而且在线示例不属于AVG()函数内部或要求我重写数据。我现在只使用SQL一两个星期,所以它可能是一个非常简单的东西,我忽略了。

感谢您的时间和帮助!

3 个答案:

答案 0 :(得分:0)

检查该值是否为有效数字。这可能足以满足您的目的:

SELECT AVG(CASE WHEN data.study = 'studyname' AND
                     REGEXP_LIKE(data.result, '^[0-9]{0-3}[.]?[0-9]{0-9}$')
                THEN CAST(data.result AS DECIMAL(3, 9) 
           END)
FROM database data
WHERE data.ID = '12345'

答案 1 :(得分:0)

您可能需要检查/更改excel中的列格式,从常规格式到数字格式,然后尝试。

通用格式可能会为您提供可能导致错误的指数值。

我希望这可能有所帮助。

答案 2 :(得分:0)

LEFT函数的语法是LEFT([列名],字符数)。

你可以尝试

  

AVG(CAST(解码)(左([你的专栏],1),'>',SUBSTR([你的专栏],2,len([你的列]],[你的列])AS DECIMAL(3,9) )))

DECODE提供条件逻辑。因此,如果第一个字符是>然后使用除第一个字符以外的所有内容,否则使用整个内容。

或使用REPLACE功能。

  

AVG(CAST(REPLACE([你的专栏],'>','')AS DECIMAL(3,9)))