Stored-Procedures

解決 NOT IN NULL 問題的最佳方法是什麼?

  • November 7, 2018

有很多解釋為什麼 NOT IN NULL 不起作用,但我沒有看到任何解決方案。(這裡最近的問題:為什麼 NOT IN 與包含 NULL 的集合總是返回 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 等中的非空值(使用 if 語句或刪除 where is 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 ...

引用自:https://dba.stackexchange.com/questions/17417