使用排序将数据类型nvarchar转换为float时出错

时间:2014-02-05 17:43:02

标签: sql sql-server

我收到此错误将数据类型nvarchar转换为float时出错。

当我尝试运行此查询时...

select 
  * 
from 
  products.products
order by 
  case 
      when len(PartNumber) < 3 then ''
      else substring(PartNumber,1,3)
  end,
  case 
      when len(PartNumber) < 4 then ''
      when isnumeric(substring(PartNumber,4,len(PartNumber) - 4)) = 1 then
      cast(substring(PartNumber,4,len(PartNumber) - 4) as float)
      else ''
  end
go

PartNumber是nvarchar(50)

我无法将其更改为nvarchar,因为它没有正确排序....

谢谢。我一直在努力解决这个问题。

2 个答案:

答案 0 :(得分:1)

正如@Lamak所说,你的CASE语句需要有一种数据类型。您不能使用空字符串,但幸运的是您可以使用Null

select 
  * 
from 
  products.products
order by 
  case 
      when len(PartNumber) < 3 then ''
      else substring(PartNumber,1,3)
  end,
  case 
      when len(PartNumber) < 4 then Null
      when isnumeric(substring(PartNumber,4,len(PartNumber) - 4)) = 1 then
      cast(substring(PartNumber,4,len(PartNumber) - 4) as float)
      else Null
  end

您还应该注意IsNumeric函数 - 有很多情况下它返回1但字符串无法转换为数字。

答案 1 :(得分:0)

另一种方法是逐步完成。通过这种方式,您可以轻松地微调哪个结果首先或最后。 但这里也算是@Richard所说的。例如:select isnumeric(“,123”)给出1,但不要尝试将其强制转换为浮点数! 其次,你可能想检查你的子串。

select substring('12,34',4,len('12,34') - 4)

不给'34'或'4'而是'3'。我不确定你在这里期待什么,但要注意这一点。

我的结果查询:

select products.*
  ,
  case when (len(PartNumber) >= 4) AND isnumeric(substring(PartNumber,4,len(PartNumber) - 4)) = 1
      then substring(PartNumber,4,len(PartNumber) - 4)
      else '0'
  end
from 
  products
order by 
  case 
      when len(PartNumber) < 3 then ''
      else substring(PartNumber,1,3)
  end,
  case 
      when len(PartNumber) < 4 then 1
      else 0
  end,
  case when (len(PartNumber) >= 4) AND isnumeric(substring(PartNumber,4,len(PartNumber) - 4)) = 1 
    then 1
    else 0
  end,
  case when (len(PartNumber) >= 4) AND isnumeric(substring(PartNumber,4,len(PartNumber) - 4)) = 1
      then substring(PartNumber,4,len(PartNumber) - 4)
      else '0'
  end
go

如果你想用我的查询玩更多,这是我的sqlfiddle链接: http://www.sqlfiddle.com/#!3/80b2e/3