我是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'


该软件引发以下错误:


消息8115,第16级,状态8,第2行
将nvarchar转换为数值数据类型的算术溢出错误。


我尝试使用以下方法将其转换为数字:

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,第15级,状态1,第10行
'='附近的语法不正确。 (第10行是“ SET”命令)


我正在使用SQL Server 2014将不胜感激。

最佳答案

第一条语句抱怨,因为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

10-06 13:46
查看更多