2013-01-31 89 views
4

我將標識存儲在varbinary(max)字段中。我正在尋找的是說,一個SQL語句,有條件的SQL where子句

select logo where customerid=5

但如果特定客戶ID標識爲NULL,那麼,

select logo where customerid=18

這是默認的標誌。如果可能,我想在單個查詢中執行此操作。這可以做到嗎?謝謝。

+1

哪種數據庫類型?這將改變答案 –

+0

這是MSSQL,不確定爲什麼我的問題從「如果它爲空」更改爲「如果該customerid不存在」,customerid確實存在,但他們可能沒有添加徽標,離開領域null – Greg

+0

修復了您的編輯問題。 –

回答

4
SELECT COALESCE(b.logo, dflt.logo) AS logo 
FROM mytable dflt 
LEFT OUTER JOIN mytable b ON b.customerid=5 
WHERE dflt.customerid=18 
+0

我認爲我們的答案都能奏效,但我很想知道我們哪個答案表現更好......一方面,我對加入表示懷疑。另一方面,我喜歡使用coalesce,我不確定我的IN()+ ORDER BY CASE會更好,尤其是那些不適合索引但適合連接的條件。 –

+0

此外,你的移動性更強,你不必在TOP 1,LIMIT 1等之間進行轉換。 –

+0

是的,我沒有MS SQL Server,所以我無法測試哪個性能更好。如果customerid是主鍵(或集羣鍵),那麼我認爲它會非常有效地匹配1或2行,所以任何一種解決方案都會很快。 –

2
SELECT TOP 1 logo 
FROM [Table] 
WHERE logo is not null and customerid IN (@CustomerID, 18) 
ORDER BY CASE WHEN customerid= 18 THEN 1 ELSE 0 END 

請注意我是如何處理訂單的。我懷疑你可能有一些ID爲< 18的客戶和一些id> 18的客戶,所以你需要在這裏小心。

+0

這個工程!謝謝!我只是選擇了這個,因爲我還是不太瞭解聯結,但是都要感謝。 – Greg

+2

用SQL編程而不理解連接就像在Java或C#或其他語言中編程而不理解循環。 –

+0

我知道,我一直在盯着你的解決方案半小時試圖找出它,它也可以。 – Greg