当ISNUMERIC等于1时,CAST nvarchar为int

时间:2015-03-26 21:53:05

标签: sql-server casting type-conversion

我有varchar列的表格。 我需要做的是选择此列中具有数值但行数介于100和150之间的所有行 下面的示例代码包含一些数据:

create table test (number nvarchar(10))

insert into test (number) values ('100'), ('140'), ('222ass'), ('2'), ('some text')

首先想到的是:

select * from test where isnumeric(number) = 1 and cast(number as int) between 100 and 150

但是错误:

Conversion failed when converting the nvarchar value 'some text' to data type int.

注意:当字段为varchar时 - 此代码可以正常工作。

接下来试试。我使用子查询。为什么?我认为在子查询中我会有正确的值(子查询中的条件ISNUMERIC)而且我可以毫无问题地进行转换:

select 
  number
from (
  SELECT 
    number
  FROM test 
  where isnumeric(number) = 1) ds 
where number between 100 and 150

但也是ERROR(与上面相同)

在这个错误之后,我抓住了最后的希望(当前的思维方式)。我添加了第三个子查询:)

select * 
from (
  select 
    cast(number as int) n 
  from (
    SELECT 
      number
    FROM test 
    where isnumeric(number) = 1) ds 
) ds2
where n between 100 and 150

但是又出现了错误:(

知道如何解决我的问题吗? 我也很高兴找出为什么我会得到这个错误。为什么MSSQL不想播放我的数据?

感谢您的帮助!

PS。 MSSQL 2008 R2

2 个答案:

答案 0 :(得分:3)

您可以像这样使用CASE

SELECT number
FROM (
  SELECT CASE WHEN isnumeric(number) = 1 THEN number
              ELSE CAST (NULL AS int)
         END AS number         
  FROM test) t
WHERE number BETWEEN 100 and 150

答案 1 :(得分:1)

如果您使用SQL Server 2012或更高版本,TRY_CONVERT将解决您的问题:

TRY_CONVERT(int, number)
如果可以进行转换,

会将number转换为int,否则会返回NULL