2017-01-06 10 views
5

最近、私はSql ServerとOracleでnot()に遭遇しました。 LIKE、INなどの異なる演算子でNOT条件とnot()を比較する異なる例を試しました。結果セットとレコード数の点で違いはありませんが、これらの両方が同じであればコミュニティで確認したいまたは任意の警告?あなたのケースではOracleとMS SQL ServerのNOT条件とNOT()の違い

例クエリ

select count(*) from Emp where country not in ('ENGLAND UK', 'HAITI', 'IRELAND') 
select count(*) from Emp where not(country in ('ENGLAND UK', 'HAITI', 'IRELAND')) 
+0

SQL Serverでは、サーバーに実行計画を生成させることができます。これらの2つのクエリの実行計画を比較して、それらが同一であることを確認できます。 Oracleには、異なる名前で同様の機能があります。 –

+0

SQL 2014と2016: 'IN()'句のリテラル引数リストでは、SQL実行計画に違いはありません。 PK列が含まれている場合は、クラスタ化インデックスのシーク、それ以外の場合はクラスタ化インデックスのスキャンになります。サブクエリと最適キーを使用すると、2回のスキャンと左側のアンチ・セミ・ジョインになり、NOT演算子が置かれていても違いはありません。 – dlatikay

答えて

2

と同じではないであろう。 NOTの前に括弧で囲まれた式はその式の結果を反転しますが、これは従来のブール論理であり、SQLに固有のものではありません。

T-SQLでは、実行プランはSQL Server 2014とSQL Server 2016で同じです(例:テーブルにはプライマリキーがあり、countryは索引付けされません)。

特に指定した例があります。NULLの値が引数にある場合、IN演算子の動作が予想外の動作をします。 Oracleの場合、see here;

T-SQLのために、このことを考慮してください。

select 1 where 'A' in (null) 

これは、行を返しません。これは簡単ですが、:

select 1 where 'A' not in (null) 

このステートメントは行eiherを返しません。

select 1 where not ('A' in (null)) 

をしかしIN (NULL)neither true nor falseに評価されるためには、しません。私たちは論理的に、このような最初の文から式を反転させる場合は今、私たちは、主張することができ、それは間違いなく、行を返す必要があります。

1

、このしかし何もありません本当の違い

ルック:

where x1 not in ('a','b','c') 
and x2 not in ('x','y','z') 

書くときにこれは

where not (x1 in ('a','b','c') 
      or x2 in ('x','y','z')) 

のように記述することができますクエリ、時々私は除外したいものを特定しているときにorを使用します。 not()を書き換えるよりも簡単ですorand ... not ...

3

AND/ORという別の条件があると、そこに違いがあります。それはANDからORORからAND

select 1 where not(1 = 1 or 1 <> 1) 

select 1 where (1 <> 1 and 1 = 1) 

select 1 where not(1 = 1 and 1 <> 1) 

と同じになります

select 1 where (1 <> 1 or 1 = 1) 
と同じになります反転します

select 1 where not(1 = 1) or 1 = 1 

NOTキーワードの両方のプレースメントは、論理的に等価であり、同じ結果が得

select 1 where not(1 = 1 or 1 = 1)