我收到此错误将数据类型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,因为它没有正确排序....
谢谢。我一直在努力解决这个问题。
答案 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