寻找凌乱的SQL ISNULL / NULLIF的替代方案

时间:2013-02-08 17:26:56

标签: sql sql-server sql-server-2012

我在SQL Server 2012上运行的SQL查询需要比较一个比特值,如果该值为1则返回一个字符串,如果为零则返回一个空字符串。

最初我把它作为这样的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

问题是'do other'部分中的所有代码都是相同的。如果该位为零,我想要做的就是将一个字符串附加到返回的值,如果它是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语句。

我正在寻找一种干净利落的方式来做到这一点,但已经没有想法 - 任何人都有更好的方法来实现这一目标?感谢。

4 个答案:

答案 0 :(得分:4)

只需内联添加CASE语句即可。当mybit = 1时,不要忘记返回空字符串,否则整个事件将返回NULL。

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

答案 1 :(得分:3)

此外,您可以在此处使用简单 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则不返回任何内容(null),然后使用简单的案例而不使用其他部分;

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两种情况

答案 2 :(得分:3)

您也可以像使用SQL Server 2012一样使用IIFCONCAT

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

IIFCASE更简洁。 CONCAT可能是有益的,因为它会自动将非字符串类型转换为字符串,并且连接NULL被视为连接空字符串。

答案 3 :(得分: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