2015-11-08 3 views
6

http://www.sql-ex.ru/でこのクイズを行いました。質問35は正確です。T-SQL、数値を検索

質問は次のとおりです。 製品表では、数字のみまたはラテン文字(A~Z、大文字と小文字を区別しない)のみで構成されるモデルを決定します。 結果セット:モデル、モデルのタイプ。

SELECT model, 
     type 
FROM Product 
WHERE Model NOT LIKE '%[^A-Z]%' 
     OR Model NOT LIKE '%[^0-9]%' 

私はそれを動作させるために、二重否定が必要なのか、なぜ今私の質問は次のとおりです。

そして私はある正しい答えを与えました。 私はコードを書き換える場合:

SELECT model, 
     type 
FROM Product 
WHERE Model LIKE '%[A-Z]%' 
     OR Model LIKE '%[0-9]%' 

私は間違った答えを得る: あなたのクエリが最初に(可能な)データベースの正しいデータセットを返されたが、それは第二の検査データベースに不正なデータセットを返されました。 *間違ったレコード数(37以上)

2番目の例では正しい答えが得られません。

私は答えは見つけようとしましたが運はありませんでした。説明に感謝します。

答えて

6
Where Model LIKE '%[A-Z]%' Or Model LIKE '%[0-9]%' 

Modelに少なくとも1つの英数字が含まれている行と一致します。

これは、英数字と英数字以外の文字が混在する値を決して除外するものではありません。

~A#-が原因A

の存在を通過する。また、あなたの正しいクエリが

  • '%[^A-Z]%'のいずれかに一致します以外の文字が含まれていないこれらの文字列(つまり、文字のみで構成するか、空である)
  • '%[^0-9]%':数字以外の数字が含まれていない文字列(数字のみまたは空の文字列)。

これは2度目の試みでは一切扱われず、文字と数字の混在した文字列がそれに受け入れられます。

私はあなたの最初の試みを使用しますが、あなたは、あなたが

SELECT model 
FROM Product 
WHERE Model LIKE REPLICATE('[A-Z]', LEN(Model)) 
     OR Model LIKE REPLICATE('[0-9]', LEN(Model)) 
+0

OKマーティンを使用することができ、二重否定を避けるために決定された場合は、あなたの答えのためにどうもありがとうございました – user3197410