【问题标题】:Nvarchar to decimal and filter the resultNvarchar 转十进制并过滤结果
【发布时间】:2015-08-27 09:18:21
【问题描述】:

我在进行将 nvarchar 列转换为十进制并仅显示 > 90、

使用我构建的查询,起初它似乎给出了预期的结果,但事实并非如此。列(价格)同时具有 null 值非数字 值,例如 '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'

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

消息 8114,第 16 级,状态 5,第 2 行
将数据类型 nvarchar 转换为数值时出错。

查询有什么问题?

在下方编辑。除了 =(equal to) 条件我得到“将 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]%'

【问题讨论】:

  • 错误告诉你......你不能将redabcde之类的值转换为数值,因为没有数值。
  • 内部查询where子句必须在外部查询where子句之前执行。
  • @Matt Indianso 我在外部查询中包含了 where 子句以过滤掉非数字。查询现在如下 - select * from PriceList A1 join ( select * from PriceList where isnumerice(price)0 and price like '%[^a-zA-z]%' ) A2 on A1.productid = A2。 productId 和 A1.ObjectKey=a2.ObjectKey where CAST(A1.convertedvalue as decimal(20,8)) > '90' and price like '%[^a-zA-z]%' 但是当我想要 values ='90 ' 我得到 ' 将 nvarchar 转换为非数字时出错。可能是什么问题?

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


【解决方案1】:

这是因为CAST(A1.price as decimal(10,4))&gt;90 对“red”、“abcde”等非数字值给出了错误

试试这个

select * from
(
select A1.* from PriceList A1 
join (
select * from  priceList
where ISNUMERIC(price) <>0)
     )A2
on A1.productId = A2.productId
and A1.ObjectKey=a2.ObjectKey
and A1.price not like '%[^0-9]%' 
) as t where CAST(price as decimal(10,4)) > '90'

【讨论】:

  • 好的。我也是这么想的。但是参考我的查询,表 A2 不会消除所有非数值,包括空值吗?然后连接结果将仅包含具有数值的行。那是我的理解。你能解释一下吗?
  • 参考您的查询,我收到消息“列 'productId' 已为 't' 指定了多次。”我似乎没有弄清楚。
  • 修改了类似部分的代码以仅获取数字。我仍然有'错误将 nvarchar 数据类型转换为数字' select * from ( select A1.* from PriceList A1 join ( select * from priceList where ISNUMERIC(price) 0) )A2 on A1.productId = A2.productId 和A1.ObjectKey=a2.ObjectKey and A1.price not like '%[a-zA-z]%' ) as t where CAST(price as decimal(10,4)) > '90'
【解决方案2】:

在您想要进行转换时使用 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

【讨论】:

  • 谢谢,本!这就像一个魅力。当您说“这种类型的事物”时,您能解释一下吗?为什么其他查询不适用于“等于”条件?您的查询适用于 和 =。对于我的和您对 条件的查询,返回的行数相同。
  • “这种类型的东西”是指任何时候您想要进行转换,然后与转换后的值进行比较或算术运算。我不知道为什么你的不适用于 = 但我怀疑这是因为条件 price like '%[^a-zA-z]%' 是错误的 - 它不允许小数点。你想说(price not like '%[0-9.]%' and price not like '%.%.%'),即最多可以包含一个小数点。
  • 知道了!非常感谢! :)
猜你喜欢
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2020-03-30
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多