像 int 一样选择和过滤 nvarchar

Posted

技术标签:

【中文标题】像 int 一样选择和过滤 nvarchar【英文标题】:Select and filter nvarchar like a int 【发布时间】:2009-04-07 10:43:26 【问题描述】:

我的 MS SQL 2005 数据库的表 McTable 中有一个 nvarchar 列 BigMacs,其中包含字母数字和数值。例如:

132 432adfad sfs54543 5256

现在我想做这样的事情:

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

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

消息 245,第 16 级,状态 1,第 41 行 将 nvarchar 值“.”转换为数据类型 int 时转换失败。

在线选择。

如何解决这个问题?

【问题讨论】:

【参考方案1】:

这可能是因为 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')

-江户

【讨论】:

好的,但是当我从 select 中选择时仍然出现此错误(如 Spencer Ruport) 我的值中没有昏迷或点。 我的观点是 IsNumeric() 对于不能转换为小数的值返回 1。你不能依赖它。 我已经添加了这个函数并这样做了:select * from (select BigMac, CAST(BigMac AS DECIMAL) ValueS from McTable where dbo.isReallyNumeric (BigMac) = 1) tablee WHERE tablee.ValueS > 5 但我仍然得到:将数据类型 nvarchar 转换为数字时出错。 @tomaszs:你的表中有一些奇怪的值 :)【参考方案2】:

试试这个:

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

IsNumeric 将在 1234.1232 等小数上返回 TRUE,但它们不能转换为 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

【讨论】:

这不起作用(选择条件?)。当我将它移动到出现错误的位置时:将数据类型 nvarchar 转换为数字时出错。但是当我选择 IsNumeric(BigMacs) 时,我得到了全部 1。 您到底想选择什么?这个“> 6”条件是什么意思?您是要选择所有适用的行并找出它们是否大于 6,还是要过滤掉那些小于 6 的行? 我想从 McTable 中获取 BigMacs 中具有数值且该值大于 6 的行 现在我收到将数据类型 nvarchar 转换为数字时出错。 on 从第一行中选择 *。 很抱歉,这个解决方案不起作用。请参阅我的帖子以获得解释【参考方案3】:

有很多方法可以做到这一点。这两个工作相同。在这种情况下最好不要使用替换,因为要替换的未知数太多。最好过滤掉所有不是你想要的东西。

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() 上使用正确的语法顺序,它也会有所帮助

【讨论】:

以上是关于像 int 一样选择和过滤 nvarchar的主要内容,如果未能解决你的问题,请参考以下文章

像键盘一样显示UIPickerView,没有UITextField

为啥我不能像使用列表一样过滤 IQueryable?

csharp 在过滤之前像Rails一样

如何在 Qt TableView 中实现像过滤一样的电子表格?

如何使magento过滤器像类别一样工作

过滤自动完成材料。一些输入表单像一个输入一样工作