非常有趣,我试图在 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