1

こんにちは専門家:私は呼び出されたテーブルを持っていますtblAlarm、そしてそれはこのようないくつかのレコードを持っています:

ここに画像の説明を入力してください

どのユーザーにどのメッセージが表示されるかを判断するための別のテーブルがあります。

ここに画像の説明を入力してください

ここで、メッセージが期限切れになった場合にユーザーが見たことがないメッセージを表示するクエリを作成します(たとえば、BeginYearとEndYearの間の年など)。私はこのクエリを書きます:

SELECT  *
FROM
tblAlarms LEFT OUTER JOIN tblUsersAlarms tua ON tblAlarms.Id=tua.MessageID
WHERE @CurrentYear BETWEEN  tblAlarms.BeginYear AND tblAlarms.EndYear 
  AND @CurrentMonth BETWEEN  tblAlarms.BeginMonth AND tblAlarms.EndMonth 
  AND @CurrentDay BETWEEN tblAlarms.BeginDay AND tblAlarms.EndDay
  AND @CurrentHour * 60 + @CurrentMinute BETWEEN tblAlarms.BeginHour*60 + tblAlarms.BeginMinute AND tblAlarms.EndHour*60 + tblAlarms.EndMinute
  --AND (tua.UserID <> 128  AND tua.UserID IS NULL)

そしてそれは戻ります:

ここに画像の説明を入力してください

ただし、最後の行のコメントを解除すると、レコードは返されません。ユーザーに表示されていないメッセージを特定するにはどうすればよいですか。

ありがとう

4

2 に答える 2

6

NULLを値と比較した結果は、不明です。フィルタ条件は、条件がTRUEと評価される行のみを選択するため、条件がFALSEまたはUNKNOWNと評価される行は選択されません。

とテストは異なり、常にTRUEまたはFALSEの回答を生成しますIS NULL。また、またはIS NOT NULLを書くこともできません(少なくとも、SQL標準ではそれが許可されていません。一部のSQL方言では許可されています)。column = NULLcolumn != NULL

あなたの状態は:

AND (tua.UserID <> 128 AND tua.UserID IS NULL)
  • の値tua.UserIDがNULLの場合、2番目の項はTRUEと評価されますが、最初の項はUNKNOWNと評価され、UNKNOWNとTRUEはUNKNOWNであり、TRUEではないため、行は選択されません。

  • の値がtua.UserIDNULLでない場合、2番目の項はFALSEと評価されるため、全体的な条件はFALSEと評価されるため、行は選択されません。

したがって、条件を追加すると、観察したように何も選択されません。

より一般的には、状態は次の2つのいずれかになります。

AND (tua.UserID <> 128 AND tua.UserID IS NOT NULL)

AND (tua.UserID <> 128 OR tua.UserID IS NULL)

最初の選択肢の二重条件は、実際には冗長です。がNULLの場合tua.UserID、最初の項はUNKNOWNと評価されるため、全体的な条件はTRUEにならず、行は選択されません。2番目の選択肢は非常に便利です。

于 2012-04-07T06:42:40.567 に答える
0

NULL」は「価値がわからない」という意味です。「価値はあり得ない」という意味ではありません。したがって、引数の1つとしてNULL値を使用して比較を実行すると、実際の(ただし不明な)値に応じて、結果はTRUEまたはになります。FALSEただしUNKNOWN、これは比較の有効な結果ではないため、この場合の出力はFALSEです。

、、、、、、のような比較演算子を2つの値(フィールドまたはリテラル)の間に置き、この値の1つがNULLの場合、その比較操作の結果=は常にです!=<<=>>=<> FALSE

すでに使用しているNULL値の2つの特別な比較演算子があります:IS NULLIS NOT NULL。どちらも二項演算子ではなく、単項演算子です。つまり、2つの引数はなく、1つだけです。引数がNULL値であるかどうかをテストします。

したがって、の場合tua.UserIDNULL、でtua.UserID <> 128なければなりませんFALSE。他の部分tua.UserID IS NULLはですがTRUEFALSE AND TRUEです。これにより、すべての行FALSEの完全なWHERE条件が作成されます。FALSE

于 2012-04-07T07:06:37.093 に答える