3

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

最初我将它作为这样的 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 语句。

我正在寻找一种干净整洁的方法来做到这一点,但已经没有想法了——有人有更好的方法来实现这一点吗?谢谢。

4

4 回答 4

4

只需内联添加您的 CASE 语句。当mybit=1时不要忘记返回一个空字符串,否则整个返回NULL。

Select 
-- do other comparisons etc to build up the return string.
 + Case When @mybit=0 Then mystring else '' End
于 2013-02-08T17:32:37.527 回答
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 '

或者,如果您不想返回任何内容(null),mybit <> 0则使用没有 else部分的简单案例作为;

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

于 2013-02-08T17:36:06.323 回答
3

您也可以在 SQL Server 2012 上使用IIF和。CONCAT

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

IIF比 . 更简洁一些CASECONCAT可能是有益的,因为它自动将非字符串类型转换为字符串,并且连接NULL被视为与连接空字符串相同。

于 2013-02-08T17:43:03.637 回答
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
于 2013-02-08T17:33:13.960 回答