提取值> 1.00来自数据库

时间:2015-11-03 14:49:19

标签: sql sql-server sql-server-2014

我对SQL很新;我正在努力从数据库中提取数据。我试图用Au值>提取所有记录1.00。 AttributeValue列为NVARCHAR

这就是我的尝试:

SELECT TOP 1000 [Id]
      ,[DHGeochemistryId]
      ,[AttributeColumn]
      ,[AttributeValue]
      ,[ModifiedDate]
      ,[ModifiedBy]
      ,[MRTDetailId]
  FROM [DRILLHOLES_Export].[dbo].[DHGeochemistryAttr]
      WHERE [AttributeValue] > 1.00 and [AttributeColumn] = 'Au'

软件引发以下错误:

  

Msg 8115,Level 16,State 8,Line 2   将nvarchar转换为数据类型numeric的算术溢出错误。

我尝试使用以下代码转换为数字:

SELECT TOP 1000 [Id]
      ,[DHGeochemistryId]
      ,[AttributeColumn]
      ,[AttributeValue] 
      ,[ModifiedDate]
      ,[ModifiedBy]
      ,[MRTDetailId]
  FROM [DRILLHOLES_Export].[dbo].[DHGeochemistryAttr]
  SET myValue = CASE WHEN ISNUMERIC(AttributeValue)=1 THEN CAST(AttributeValue AS float)
      ELSE 0 END)
      WHERE [AttributeValue]  > 1.00 and [AttributeColumn] = 'Au'

软件引发以下错误:

  

Msg 102,Level 15,State 1,Line 10   ' ='附近的语法不正确。 (第10行是“SET”命令)

我正在使用SQL Server 2014会感激一点帮助。

2 个答案:

答案 0 :(得分:4)

第一个语句抱怨因为AttributeValue不是数字列。你可以CAST

WHERE CAST([AttributeValue] AS FLOAT)  > 1.00

但如果其中的任何值不是数字,则可能会出错。所以你可以在演员之前使用ISNUMERIC

WHERE ISNUMERIC([AttributeValue]) = 1
AND CAST([AttributeValue] AS FLOAT)  > 1.00

SQL Server非常聪明,可以使逻辑短路,因此如果CAST子句的第一部分返回false,它就不会尝试WHERE

答案 1 :(得分:1)

我仍然认为它会出错,但是你可以试一试......赶上你应该没问题。这是一个示例:

create table #test (
    attValue nvarchar(100),
    attCol nvarchar(100))

insert into #test (attValue, attCol)
select '.99', 'Au'
union
select '1.1', 'Au'
union
select 'hello', 'Au'
union
select '1.01', 'Au'
union
select '1.2', 'Au'
union
select '1.5', 'Au'

begin try
    ;with atts (AttributeValue, AttributeCol) as
    ( 
    select convert(float, x.attValue) as aVal, x.attCol
      from (
            select attValue, attCol
              from #test
             where IsNumeric(attValue) = 1
           ) x
    )
    select * from atts
    where AttributeValue > cast(1.0 as float)
end try
begin catch
    -- do nothing
end catch