2013-02-08 63 views
2

我有一個SQL查詢在SQL Server 2012上運行,需要比較一個比特值,如果該值爲1則返回一個字符串,如果爲零則返回一個空字符串。尋找替代凌亂的SQL ISNULL/NULLIF

我本來它作爲像這樣的CASE語句:

CASE WHEN myBit = 0 THEN 
-- do other comparisons etc to build up the return string. 
+'myString' 
ELSE 
-- do other comparisons etc to build up the return string. 
'' END 

的問題是,所有的代碼中「做其他」部分是相同的。我想要做的是追加一個字符串的返回值,如果該位是零,如果它是1沒有。

所以我重構它只有一次共同的代碼,然後追加到字符串的末尾這個:

-- do other comparisons etc to build up the return string. + 
ISNULL(NULLIF(Cast(ISNULL(CAST(NULLIF(myBit, 0) AS NVARCHAR), 'myString') AS varchar),'0'),'') 

但是,上面看起來很混亂,至少因爲CAST聲明是必需的。

我正在尋找乾淨整潔的做法,但已經用完了想法 - 任何人都有更好的方法來實現這個目標?謝謝。

+0

請記住,CASE是一個函數/表達式,* not * a子句,因此您可以在使用ISNULL,NULLIF或任何其他函數的相同位置使用它。 – RBarryYoung 2013-02-08 17:43:10

回答

3

您還可以使用IIFCONCAT因爲你是SQL Server 2012的

SELECT CONCAT('Start', 
       IIF(@mybit=0,'myString',''), 
       'End') 

IIF上超過CASE簡潔一點。 CONCAT可能會有所幫助,因爲它會自動將非字符串類型轉換爲字符串,並且連接NULL與連接空字符串的處理方式相同。

+0

我不知道這些功能對我來說真的很有用,謝謝。 – 2013-02-12 13:50:01

4

只需添加您的CASE語句內聯。當mybit = 1時,不要忘記返回一個空字符串,否則整個事件將返回NULL。

Select 
-- do other comparisons etc to build up the return string. 
+ Case When @mybit=0 Then mystring else '' End 
+0

我曾嘗試將CASE內聯,但我最終得到了一個空值。我認爲它不會像那樣工作,但至少現在我知道它肯定是別的東西。謝謝。 – 2013-02-12 13:52:16

0

你可以把公共代碼放到子查詢中嗎?這將類似於此:

select case when myBit = 0 then value else value + 'what you append' end returnvalue 
from 
(subquery with common code) abc 

或者,也許一個功能

select case when myBit = 0 then yourfunction() 
else yourfunction + 'what you append' end returnvalue 
2

你也可以使用一個簡單的case這裏;

Select 'Your other string ' + 
     Case mybit When 0 then 'mystring' else '' End As Results 

--Results will be like 
mybit Results 
0  'Your other string mystring' 
1  'Your other string ' 

OR,如果你什麼都不想要(空)返回如果mybit <> 0然後用一個簡單的例子沒有別的一部分;

Select 'Your other string ' + Case mybit When 0 then 'mystring' End As Results 

--Results will be like 
mybit Results 
0  'Your other string mystring' 
1  null 

SQL-SERVER-DEMO兩種情況

+0

謝謝你這樣一個全面的答案。我曾嘗試將這種情況列入內聯,但遇到了問題。至少現在我知道一定是別的東西給了我麻煩,而不是內聯的情況。 – 2013-02-12 13:56:56