检查大于或小于数字时,将数据类型nvarchar转换为float时出错

时间:2014-04-04 10:00:12

标签: sql sql-server

请给我一个简单的查询,如下所示。

 SELECT d.id,d.dia FROM dbo.debtor d WHERE ISNUMERIC(dia + 'e0') = 1 

当我运行以上操作时,我想要的是什么。它返回dia为数字的两列中的所有记录。但是,我想通过添加dia是数字且大于或小于数字来过滤更多。我的查询失败。

  SELECT d.id,d.dia FROM dbo.debtor d 
        WHERE ISNUMERIC(dia + 'e0') = 1  and cast(dia as float)  > 6

请任何帮助将不胜感激。如何将nvarchar的dia转换为float?

3 个答案:

答案 0 :(得分:0)

尝试

ISNUMERIC('' + dia + 'e0')

答案 1 :(得分:0)

您需要检查查询计划,以查看是否按正确的顺序评估where子句。

您可以通过将第二个条件放在外部select语句中来实现所需的结果,这样它只会评估具有数字dia的记录。

答案 2 :(得分:0)

考虑你的WHERE子句

WHERE ISNUMERIC(dia + 'e0') = 1  and cast(dia as float)  > 6

没有特定的顺序将首先执行这两个条件。 假设dia不是数字,然后首先执行条件cast(dia as float) > 6,然后在条件cast(dia as float)中进行转换将抛出错误,因为值无法转换为浮动。

为了确保转换条件仅适用于数值,您必须在WHERE子句中应用CASE,如下所示

SELECT d.id,d.dia FROM dbo.debtor d 
WHERE ISNUMERIC(dia + 'e0') = 1  and 
      6 < CASE WHEN ISNUMERIC(dia + 'e0') = 1 THEN cast(dia as float)  ELSE 1 END