像int一样选择和过滤nvarchar

时间:2009-04-07 10:43:26

标签: sql sql-server tsql

我的MS SQL 2005数据库中的表McTable中有一个nvarchar列BigMacs,带有alfanumeric和numeric值。例如:

  • 132
  • 432adfad
  • sfs54543
  • 5256

现在我想做这样的事情:

select Convert(BigMacs, int) from McTable
where IsNumerc(BigMacs) = 1 AND Convert(BigMacs, int) > 6

但是当我这样做时,我得到一个错误:

  

Msg 245,Level 16,State 1,Line 41   将nvarchar值“ ”转换为数据类型int时转换失败。

在线选择。

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT  *
FROM    (
        SELECT  REPLACE(BigMacs, ',', '.') AS BigMacs
        FROM    McTable m
        WHERE   IsNumerc(BigMacs) = 1
        ) q
WHERE   CAST(BigMacs AS DECIMAL) > 6

IsNumeric会在TRUE之类的小数部分返回1234.1232,但无法将其转换为INT

检查:

WITH McTable AS
        (
        SELECT '123124,123123' AS BigMacs
        )
SELECT  *
FROM    (
        SELECT  REPLACE(BigMacs, ',', '.') AS BigMacs
        FROM    McTable
        WHERE   IsNumeric(BigMacs) = 1
        ) q
WHERE   CAST(BigMacs AS DECIMAL) > 6

-----------
123124.123123

答案 1 :(得分:2)

这可能是因为IsNumeric函数对于任何可以转换为数字的值都返回true。请尝试以下示例:

create table McTable  (BigMac varchar(255))

insert into McTable  select '1p927'
insert into McTable  select '1927'
insert into McTable  select '1,927'
insert into McTable  select '1.927'

select BigMac, isnumeric(BigMac)
from McTable 

select BigMac, CAST(BigMac AS DECIMAL)
from McTable 
where isnumeric(BigMac) = 1

即使除了'1p927'之外的所有行都是数字,演员表也会失败!这是因为'1,927'无法转换为十进制(在我的机器上)

IsNumeric不能完全按指定的方式工作。找到here后,您可以使用

IsNumeric (data + 'e0')

-Edo

答案 2 :(得分:2)

有很多方法可以实现这一目标。这两种方法都是一样的。在这种情况下最好不要使用替换,因为有太多的未知因素需要更换。最好过滤掉不属于你的所有东西。

SELECT
    CONVERT(INT,BigMacs) AS BigMacs
FROM
    McTable
WHERE
    ISNUMERIC(BigMacs) = 1
AND PATINDEX('%[^0-9]%', BigMacs) = 0


SELECT
    CONVERT(INT,BigMacs) AS BigMacs
FROM
    McTable
WHERE
    ISNUMERIC(BigMacs) = 1
AND BigMacs NOT LIKE ('%[^0-9]%')

注意:如果人们正确拼写ISNUMERIC(),会有所帮助。如果您在CONVERT()

上使用正确的语法顺序,它也会有所帮助