我在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语句。
我正在寻找一种干净利落的方式来做到这一点,但已经没有想法 - 任何人都有更好的方法来实现这一目标?感谢。
答案 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一样使用IIF
和CONCAT
。
SELECT CONCAT('Start',
IIF(@mybit=0,'myString',''),
'End')
IIF
比CASE
更简洁。 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