2015-11-17 79 views
0

如果有可能列值可能是NULL,您將如何處理SQL Server 2012中的SELECT語句?當NULL值可能時,如何檢查SQL Server 2012中是否存在記錄?

我試圖通過JDBC條件插入記錄,如果記錄不存在,並返回與該記錄相關聯的ID(如果存在)。爲了簡單起見,我選擇使用SELECT查詢,然後爲此查詢INSERT

我的SELECT查詢看起來像這樣,除了(a,b,c,d,e)對應於有意義的名稱(使用您的想象力)。

SELECT id 
FROM dim_repository 
WHERE a = ? 
    AND b = ? 
    AND c = ? 
    AND d = ? 
    AND e = ? 

然而,如果(a)NULL那麼該查詢將返回一個空結果因爲(a) = NULL是不是有效的查詢(即,因爲不同的動詞用於NULLs和標量值)。

修復查詢的唯一方法是添加一個條件選擇如下?

SELECT id 
FROM dim_repository 
WHERE (a = ? OR a IS ?) 
    AND (b = ? OR b IS ?) 
    AND (c = ? OR c IS ?) 
    AND (d = ? OR d IS ?) 
    AND (e = ? OR e IS ?) 

這種方法是有效的,但因爲是我與工作表中有16個不同的欄目,我很猶豫用30個條件語句在我SELECT電話。

+2

您可以考慮使用[ISNULL(https://msdn.microsoft.com/en-us/library/ms184325.aspx),而不是爲清潔的where子句:'WHERE(ISNULL(α,β) =?)AND(ISNULL(b,?)=?)'等等。 –

+0

在標準SQL(SQL Server不支持)中,有'x IS NOT DISTINCT FROM y',如果'x = y',則爲真,但兩個NULL值相等。請參閱http://stackoverflow.com/questions/10416789/how-to-rewrite-is-distinct-from-and-is-not-distinct-from,特別是約翰凱勒的答案,以瞭解如何重寫SQL Server。注意:在你的例子中,它可以寫成WHERE EXISTS(SELECT a,b,c,d,e INTERSECT SELECT?,?,?,?,?)'。如果添加更多列,它可以很好地擴展。 – hvd

+0

@ScrapingInfinity我認爲你假設如果參數爲null,那麼應該接受任何'a'的值。 (或者,如果'a'爲空,那麼無論傳遞哪個參數,都應該返回該行。)這不是我從這個問題得到的結果。我得到的印象是,如果參數爲null,那麼應該只返回'where a null'的記錄。 – hvd

回答

0

編輯:最近的活動促使我重讀我接受的答案,我不知道什麼時候我寫的我在想什麼。當然,如果你小心,它會起作用,但這不是一個好的解決方案。相反,應使用intersectexcept功能,因爲它們被設計成優雅的處理空比較:

declare @a int = null; 
declare @b int = null; 

select Data.* 
from (values 
    (1, 1) 
    , (1, null) 
    , (null, 1) 
    , (null, null) 
) as Data (a, b) 
where exists (
      select @a, @b 
      intersect 
      select Data.a, Data.b 
    ); 

我也注意到,實際上@hvd共享在評論這一解決方案,所以我希望你按照他的建議,與我無關!

原件(可怕的)答案:我認爲這確實你問需要提醒的是,你必須小心哪些價值你選擇作爲您的後備什麼。這裏的零選項很差,因爲0在表中可能是有效的值。

declare @i1 int = null; 
declare @i2 int = null; 

select Data.* 
from (values 
    (1, 1) 
    , (1, null) 
    , (null, 1) 
    , (null, null) 
) as Data (a, b) 
where Coalesce(Data.a, 0) = Coalesce(@i1, 0) 
    and Coalesce(Data.b, 0) = Coalesce(@i2, 0); 
0

如果你知道有一些不可能的價值,你可以替換空值,如0的自動增量列,您可以使用ISNULL():

WHERE a = ISNULL(@parameter,0) AND ... 

但你是最安全的要明確什麼你正在做的通過將在附加條款和爲NULL檢查:

WHERE (a = @parameter OR @parameter IS NULL) AND ... 
+0

嗯。我希望我不需要使用2(n-1)條件,其中(n)等於我表中的列數。 – hodgepodge

+0

這就是SQL。你的問題不清楚你是否試圖NULL檢查參數或表中的值。如果它的參數,你可能會逃脫ISNULL(@參數,0)或任何你已知的「不可能的」值。查看更新。 – 3bh

相關問題