2013-02-08 56 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