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である場合は削除する)、このテーブルで結合と削除を実行することが唯一考えられることです。
もっと良い方法はありますか?
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)
これは同じように動作するはずです。
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 ...
自分ですでに思いついたこと:
_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
。