非常に興味深いことに、これを 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 句の順序を保証できる人はいません)。おそらくそれを修正する方法の1つは、前に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