web-dev-qa-db-ja.com

NOT IN NULLの問題を回避する最良の方法は?

NOT IN NULLが機能しない理由はたくさんありますが、解決策はありませんでした。 (ここでの最近の質問: NULLを含むセットでNOT INが常にFALSE/NULLを返すのはなぜですか?

クエリの特定の値をフィルター処理するために使用されるストアドプロシージャに6つのオプションの引数があります。以前の開発者は次のようなことをしました:

IF @var1 IS NULL AND ..... 

    select ...

else

    select ...
    where value in (@var1, ...)


私は特にこれが好きではありませんでした。 (クエリは非常に大規模です)、次のようなものを選択することにしました。
(とにかく一時テーブルに結果がありました)

IF @var IS NOT NULL OR ...

    delete from #temp where value not in (@var1,...)


しかし、これは機能しないことに気付きました。

@ var1などにnull以外の値のみを保持する別の一時テーブルを作成して(ifステートメントを使用するか、whereがNULLである場合は削除する)、このテーブルで結合と削除を実行することが唯一考えられることです。

もっと良い方法はありますか?

3
user606723

Sybaseについては知りませんが、SQL Serverではこのようにできます。

select *
from yourtable
where value not in (select N
                    from (values (@var1),
                                 (@var2),
                                 (@var3),
                                 (@var4),
                                 (@var5)) T(N)
                    where N is not null)

valuesを使用して派生テーブルを作成できない場合は、代わりにunion allを使用できます。

where value not in (select N
                    from (select @var1 union all
                          select @var2 union all
                          select @var3 union all
                          select @var4 union all
                          select @var5) T(N)
                    where N is not null)
7
Mikael Eriksson

これは同じように動作するはずです。

select ...
from
    yourtable T1
    JOIN
    (
      SELECT value FROM yourtable§
      EXCEPT SELECT @var1
      EXCEPT SELECT @var2
      EXCEPT SELECT @var3
      EXCEPT SELECT @var4
      EXCEPT SELECT @var5
      EXCEPT SELECT @var6
    ) T2 ON T1.value = T2.value 
where ...
3
gbn

自分ですでに思いついたこと:

_CREATE TABLE #values (value varchar(8) NOT NULL)

IF @val1 IS NOT NULL INSERT #VALUES (value) SELECT @val1
IF @val2 IS NOT NULL INSERT #VALUES (value) SELECT @val2
IF @val3 IS NOT NULL INSERT #VALUES (value) SELECT @val3
IF @val4 IS NOT NULL INSERT #VALUES (value) SELECT @val4
IF @val5 IS NOT NULL INSERT #VALUES (value) SELECT @val5
IF @val6 IS NOT NULL INSERT #VALUES (value) SELECT @val6    

SELECT *
FROM table tab
WHERE value IN (SELECT value FROM #values)
_

または

_SELECT *
FROM table tab
WHERE value IN (ISNULL(@val1,'')
               ,ISNULL(@val2,'')
               ,ISNULL(@val3,'')
               ,ISNULL(@val4,'')
               ,ISNULL(@val5,'')
               ,ISNULL(@val6,''))
_

ISNULL(@val,'whatever_really_not_exists')を調整します。

NULLsをよりよく理解するには、Sybaseのドキュメントを読むことをお勧めします

_set ansinull [ on | off ]
_

または Robert Vollmanによる素敵な記事 についてNULLs

0
B0rG