9

为什么这不起作用?

select *
from
(
    select membership_number
    from members
    where membership_number not like '%[^0-9]%'
) mem
where cast(membership_number as int) > 2

请参阅SQL Fiddle 演示

子查询应该过滤掉非数字的数据,外部查询将其转换为整数,以便我可以查找大于 2 的任何数据。

似乎它首先运行外部查询的 where 子句。我该如何解决这个问题?

4

5 回答 5

2

也许是:

select *
from
(
    select
        membership_number
    from
        members
    where
        membership_number not like '%[^0-9]%'
) mem
where Try_Convert(int, membership_number) > 2
于 2013-04-10T01:09:52.250 回答
1

我之前有这个问题。我所做的是:

1,你可以有一个视图:

select membership_number
    from members
    where membership_number not like '%[^0-9]%'

2,或者使用临时表

3、还是用例子句:

select *
from
(
    select membership_number
    from members
    where membership_number not like '%[^0-9]%'
) mem
where (CASE WHEN ISNUMERIC(membership_number) THEN cast(membership_number as int) ELSE 0 END) > 2

没有一个优雅的解决方案,但希望这会有所帮助

于 2013-04-10T01:10:44.807 回答
1

非常有趣,我试图在 SQL Server 上重现这个,然后找到了。我将您的查询更改为简单,以确保查询不会失败并且我可以看到执行计划:

select *
from
(
    select membership_number
    from members
    where membership_number not like '%[^0-9]%'
) mem
where membership_number > '2'

执行计划是有表扫描和谓词:

[master].[dbo].[members].[membership_number]>'2' 
    AND NOT [master].[dbo].[members].[membership_number] like '%[^0-9]%'

所以这是因为 SQL 优化引擎以这种方式工作(正如有人所说 - 没有人可以保证 where 子句的顺序)。修复它的一种方法可能是在之前使用 ISNUMERIC

select *
from
(
    select membership_number
    from members
    where membership_number not like '%[^0-9]%'
) mem
where ISNUMERIC(mem.membership_number) = 1 and cast(mem.membership_number as int) > 2
于 2013-04-10T01:32:14.923 回答
0

注释解释了执行计划如何(有时)选择cast评估like. 声明可以case帮助评估顺序,但正如亚当斯所说,即使这种方法也不是 100%。

select  *
from    members
where   case
            when membership_number like '%[^0-9]%' then 0
            when cast(membership_number as int) > 2 then 1
            else 0
        end = 1
于 2013-04-10T01:14:04.887 回答
0

你可以试试这个,在下面的查询中执行第一个条件,如果它失败,那么它不会执行第二个条件

select
    membership_number
  from
    members
where 
isnumeric(membership_number) = 1 and 
cast(membership_number as int) > 2

要回答为什么您的查询不起作用,请在此处查看此说明

于 2013-04-10T04:06:26.897 回答