如果有可能列值可能是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
電話。
您可以考慮使用[ISNULL(https://msdn.microsoft.com/en-us/library/ms184325.aspx),而不是爲清潔的where子句:'WHERE(ISNULL(α,β) =?)AND(ISNULL(b,?)=?)'等等。 –
在標準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
@ScrapingInfinity我認爲你假設如果參數爲null,那麼應該接受任何'a'的值。 (或者,如果'a'爲空,那麼無論傳遞哪個參數,都應該返回該行。)這不是我從這個問題得到的結果。我得到的印象是,如果參數爲null,那麼應該只返回'where a null'的記錄。 – hvd