0

私の元のクエリは7975行を返します。where句を追加すると、7917行を受け取ります。SELECT58行の違いが欲しいです。そうするために、私は逆のwhere句であると私が信じているものを書きました。残念ながら、予想される58行ではなく、41行しか表示されません。

TableName.ColumnとTableName.Column2はどちらもnull許容です。

オリジナルどこ

where ((TableName.Column in ('1', '2', '3))
or (TableName.Column2 in ('1', '2', '3))

逆の私の試み

where ((TableName.Column not in ('1', '2', '3))
and (TableName.Column2 not in ('1', '2', '3))
4

4 に答える 4

2
SELECT 
    * 
FROM 
    TableName 
EXCEPT 
SELECT 
    * 
FROM 
    TableName 
WHERE 
    ((TableName.Column IN ('1', '2', '3))
    OR (TableName.Column2 IN ('1', '2', '3))

ところで、NULL 値が結果に影響を与えているのではないかと思います。Null 値はそうINではなくNOT IN、特定のセットでもありません。

于 2012-08-14T15:32:20.793 に答える
1

前述のように、nullすべてのテストに失敗するという SQL の 3 方向のロジック命令は、無効性の明示的なテストを除きます。

xが null の場合x = 3、テキストと同様にテストは失敗しますx != 3。さらに、テストx = nullは失敗します (これは明示的な無効性のテストではありません)。null に対して「適切に」成功または失敗する唯一のテストは testx is [not] nullです。

SQL Server の問題は、その既定の動作 WRTnullがそのように機能しないことです。

ただし、null/non-null を適切にチェックするように SQL クエリを作成すると、データベースの動作に関係なく、クエリは適切に機能します。

于 2012-08-14T17:18:06.457 に答える
1

あなたの問題はNULLにあります。実際の逆は次のいずれかです。

where (coalesce(TableName.Column, '') not in ('1', '2', '3))

また:

where tableName is NULL or (TableName.Column not in ('1', '2', '3))

両方の列を使用すると、次のようになります。

where (coalesce(TableName.Column, '') not in ('1', '2', '3)) and
      (coalesce(TableName.Column2, '') not in ('1', '2', '3)
于 2012-08-14T15:40:27.770 に答える
0

両方の場所にa'と aがありません。)タイプミスだと思います。

したがって、元のクエリは次のとおりです。

where ((X) or (Y))

そしてあなたはに変わった

where ((!X) and (!Y))

これは同じことではありません。最初の例では、クエリを評価するために条件の 1 つだけが真である必要があるため、列に 1 を持つ行が返されます。2番目に、両方がtrueである必要があるため、列1と列2に1、2、または3がない行のみが返されます

正確に何を返す必要がありますか?

于 2012-08-14T15:44:03.923 に答える