2

% 記号なしで「not like」を使用することと、Microsoft SQL で不等号 <> を使用することの間に実際の違いはありますか? 例:

if exists (select * from table_name where column_name not like @myvariable)

また

if exists (select * from table_name where column_name not like 'myvalue')

if exists (select * from table_name where column_name <> @myvariable)

また

if exists (select * from table_name where column_name <> 'myvalue')

私は、not like を使用する習慣があることに気付きました (入力するのが速く、自分のコードを読むときにより直感的に感じられます)。「好き」は「等しい」よりも遅いという他の質問を読みましたが、ここでの比較の結果についてもっと心配しています。比較を行うときは、ほぼ常に varchar データ型を使用しています。

4

5 に答える 5

4

<> はワイルドカードを評価しません
<> '%' はリテラル % の検索です

% _ より多くの「ワイルドカード」があります

これらは同じではありません

  SELECT TOP 1000 [ID],[word]
  FROM [FTSwordDef]
  where [word] like '[a-z]a'


  SELECT TOP 1000 [ID],[word]
  FROM [FTSwordDef]
  where [word] = '[a-z]a'

リテラル一致がある場合は <> を使用します

「ワイルドカード」を使いたいときは LIKE を使います

式は同じように評価されず、交換可能であるという前提で排他的に LIKE を使用するのは不適切です。

于 2013-04-30T17:54:38.803 に答える
2

あなたが与える例では、クエリの最終結果に違いはありません。しかし、これはおそらく悪い考えだと思います。追跡するのが難しい予約文字に関連するバグが発生する可能性があります (LIKE は、パターン マッチングの予約文字として % と _ を使用します)。WHERE 句をハードコーディングしても問題にはならないかもしれませんが、そこには変数も含まれています。バグやセキュリティ ホールを回避するために、変数に % または _ が含まれていないことをアプリケーションで確認する必要があります。

また、LIKE は「マーク付き」構文です。パターン マッチングを行う必要がない限り、通常は使用しません。あなたのコードを読んでいる他の誰かは、あなたが実際に <> を意味していたのに、なぜ LIKE を使用したのかを理解しようと時間を費やします。あなたがやろうとしていることのセマンティックな意味が「等しくない」であることを考慮すると、指定された演算子を使用すると、最大限の明確さが得られます。

于 2013-04-30T18:09:36.027 に答える
0

nchar 列と nvarchar 列を比較すると、結果が異なる場合があります。これを試して:

CREATE TABLE #Test (ColA nchar(10), ColB nvarchar(10))

INSERT INTO #Test SELECT N'test    ', N'test '

SELECT * FROM #Test WHERE ColA = ColB

SELECT * FROM #Test WHERE ColA LIKE ColB

DROP TABLE #Test

これはおそらく、「 = 」を使用すると、SQL サーバーが比較の両側を同じデータ型にキャストする必要があり、nchar 列が nvarchar にキャストされ、末尾のスペースが削除されるために発生します。

于 2013-09-26T19:34:07.920 に答える
0

他の回答で言及されている他の問題 (変数にリテラル "%" または "_" が含まれている場合に発生する可能性のある問題) に加えて、パフォーマンスにも悪いと思います: それにもかかわらず、SQL Server はパターンを探して文字列をスキャンしますが、何も見つかりません。

エルゴ、あなたのクエリは、最初に different-from 演算子を使用することと意味的に同等ですが、「<>」は、SQL S. が検索するパターンを探して文字列を検索することを強制しません。

確かに、数ミリ秒以上の損失はありませんが、このクエリが複数のユーザーによってほぼ同時に呼び出された場合、合計すると多くの余分な時間が発生する可能性があります。

于 2013-04-30T20:21:28.177 に答える
0
  1. 別の特殊記号 '_' (任意の 1 文字) があります。「いいね」を使うのは悪い考えであり、将来的に頭痛がする可能性があると思います。
  2. あなたの表現はすべて奇妙に思えます: 論理の二重否定、使用しない理由

    存在する場合 ( select ... where column_name = 'value' )

  3. whereで否定を使用すると、インデックスの使用が自動的に無効になります(Oracleから知っているように)。

  4. はい、 like を使用すると、クエリの実行計画にも影響すると思います
于 2013-04-30T17:59:52.073 に答える