2016-11-02 4 views
58

私は、10レコードに「TAX」という単語を含むテキストがある200レコードのテーブルを持っています。反対の結果を返さないLIKEとLIKE逆の結果を返さない

私は

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 

を実行していますし、私は正しく、これらの10件のレコードを含む結果セットを取得します。

しかし、ときに私はこれを行う代わりに、190

+42

その列には「ヌル」値がありますか? – musefan

+0

はい、その列にヌル値があります – Shanka

+1

可能であれば、検索文字列の先頭に '%'を使用しないようにしてください。それはかなり重いです。 –

答えて

73

の、唯一の100件のレコードを返すだ

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%' 

によってそれらのレコードを除外しようとしています正しい結果を返しますか?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%' 

私は列がそれらが含まれている場合は、その後、NULL NOT LIKE '%TAX%'UNKNOWN/NULLを返しますので、選択されることはありません、NULL値はここに問題があると考えています。

handling with NULL valuesまたはhereについてお読みください。パフォーマンスが問題になる場合

@ughaiが示唆したように、あなたも使用することができます。

[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 

これは、null値の世話をする必要があります。

Select * from tbl1 
    WHERE [TextCol] NOT LIKE '%TAX%' 
    OR [TextCol] IS NULL 
+16

私は '[TextCol] NOT LIKE '%TAX%'や[TextCol] IS NULL'を使用することをお勧めします。ユーザーが' NULL'値を含める場合は、より良いパフォーマンスが得られます – ughai

+3

彼は "190レコード" performaceは問題ですが、他の人がこの答えを読むかもしれないので、とにかく編集されています@ughai。 – sagi

+1

ありがとう! NULLが問題でした。 – Shanka

1
  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%') 
    
  2. select * from tbl1 
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 
    
+17

WHERE([TextCol] NOT LIKE '%TAX%')と([TextCol] NOT LIKE '%TAX%')のポイントは何ですか? – moopet

+4

このコードスニペットは、あなたの投稿の質を向上させるための説明(本当に助けます)(// meta.stackexchange.com/q/114762)を含め、質問を解決するかもしれません。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

0

はあなたにもNULL値をチェックする必要があります同様に、出力のすべての行が得られなかったのはおそらく理由です。

+3

このコードスニペットは、あなたの投稿の質を向上させるための説明(本当に助けます)(// meta.stackexchange.com/q/114762)を含む質問を解決するかもしれませんが。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

18

(A) SQL比較演算子は、True、False、Unknownの3つの値をとります。一方または両方のオペランドがNULLの場合、結果は不明です。我々は(18)の定数でいくつかの値(人の年齢)を比較以下の例を考えてみます

21 >= 18 -- True 
15 >= 18 -- False 
NULL >= 18 -- Unknown 

をあなたが見ることができるようにNULLが18に等しい/より大きい場合、データベースは/決められないだろうことができます。

(B)データベースは、WHERE句がTrueと評価される行のみを返します。式を反転すると(例:WHERE age >= 18WHERE age < 18に変更されました)、不明な結果には影響しません。

IS [NOT] NULLを使用して、NULLの値と一致させることができます。次のクエリは、列がパターンに一致しない行を選択しますまたは列がNULLである:そのようISNULLCOALESCEとして

WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 

機能がいくつかの値にNULLを変換するために使用することができます。

+4

修正:NULL値を含むすべての操作は** UNKNOWNとなります** **。 'SELECT COUNT(TextCol)as tally FROM tbl1' – onedaywhen

+0

編集 'すべての操作' - > '比較演算子'は良い+1 – onedaywhen

2

それは私にも一度も起こります!私の頭を壊した後、ヌル値であることがわかったので、このクエリを使用して回避することができます:

WHERE CASE WHEN [TextCol] IS NULL 
      THEN 'default' 
      ELSE [TextCol] 
     END NOT LIKE '%TAX%' 
関連する問題