Nvarchar为十进制并过滤结果

时间:2015-08-27 09:18:22

标签: sql sql-server sql-server-2008

我无法进行将nvarchar列转换为十进制的查询,并且只显示>的值。 90,< 90和= 90。

使用我构建的查询,起初它似乎给出了期望的结果,但事实并非如此。列(价格)具有空值非数字值,如'red',abcde'等。此外,nvarchar列(价格)中的值具有小数点后1,2,3或更多数字,如90.0,1234.5643,34.00等。

这是我写的查询 -

select * from PriceList A1 
join (
select * from  priceList
where ISNUMERIC(price) <>0)
     )A2
on A1.productId = A2.productId
and A1.ObjectKey=a2.ObjectKey
and CAST(A1.price as decimal(10,4)) > '90'

我得到几行返回结果,然后出现错误 -

  

Msg 8114,Level 16,State 5,Line 2
  将数据类型nvarchar转换为数字时出错。

查询有什么问题?

编辑在下方。这工作除了=(等于)条件我得到'错误将nvarchar转换为数字'。错误是相同的= 90或= 900等。现在想知道什么是错的?!

select * from PriceList A1 
join 
( select * from PriceList where isnumerice(price)<>0 
and price like '%[^a-zA-z]%' ) A2 
on A1.productid = A2.productId and A1.ObjectKey=a2.ObjectKey 
where CAST(A1.convertedvalue as decimal(20,8)) > '90' 
and price like '%[^a-zA-z]%'

1 个答案:

答案 0 :(得分:0)

在您想要进行转换时使用case语句,然后与转换后的值进行比较或算术运算:

case 
when isnumeric(fieldname) = 1 then cast(fieldname as decimal(10,4)) 
else null end 

所以:

select * 
from  priceList
where case 
  when isnumeric(fieldname) = 1 then cast(fieldname as decimal(10,4)) 
  else null 
  end  > 90