非常有趣,我試圖在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
您是否自己運行內部查詢以確保它返回您期望的內容? – OldProgrammer 2013-04-10 00:52:00
這很酷。我從來沒有聽說過SQL小提琴。 – anthonybell 2013-04-10 00:52:51
@ OldProgrammer-是的,內部查詢工作正常。我已經嘗試過一個CTE,它也做同樣的事情。我能做到這一點的唯一方法是,如果我在'test_table'中選擇了一個成員編號,然後用該表替換子查詢。 – Lock 2013-04-10 00:56:09