2011-10-06 111 views
0

这里是我的代码示例:如何优化MSSQL CASE WHEN查询

SET @variable_out = 
'Report: ' 
+ CASE WHEN (SELECT name FROM person WITH(NOLOCK) WHERE person_id = @person_id) != '' 
    THEN 'Name: ' + (SELECT name FROM person WITH(NOLOCK) WHERE person_id = @person_id) + CHAR(13)+CHAR(10) 
    ELSE 'Name: not found' + CHAR(13)+CHAR(10) 
END 
+ CASE WHEN (SELECT home_phone FROM person WITH(NOLOCK) WHERE person_id = @person_id) != '' 
    THEN 'Phone #: ' + (SELECT home_phone FROM person WITH(NOLOCK) WHERE person_id = @person_id) + CHAR(13)+CHAR(10) 
    ELSE 'Phone #: not found' + CHAR(13)+CHAR(10) 
END 

等等

正如你所看到的,我冗余每个CASE WHENE执行两个选择...我正在构建的变量中,我希望将其折叠为每行只有一个选择。

我所知道的唯一解决方案是为CASE WHEN ...创建一个唯一变量,手动执行所有选择,然后如果变量不是空的,则将它们连接到@variable_out。

有没有更聪明的方法来实现这个目标?

回答

3
DECLARE @name the_same_datatype_as_name_field_from_person_table --Ex. VARCHAR(100) 
    ,@home_phone the_same_datatype_as_homephone_field_from_person_table; --Ex. VARCHAR(15) 

SELECT @name = NULLIF(p.name,''), @home_phone = NULLIF(p.home_phone,'') 
FROM person p --WITH(NOLOCK) 
WHERE p.person_id = @person_id; 

SET @variable_out = 
'Report: ' 
+ ISNULL('Name: ' + @name, 'Name: not found') 
+ CHAR(13)+CHAR(10) 
+ ISNULL('Phone #: ' + @home_phone, 'Phone #: not found') 
+ CHAR(13)+CHAR(10); 

注:

  1. ,或者您可以使用@name & @home_phone变量,如为@variable_out变量(如VARCHAR)相同的数据类型。

  2. NOLOCK pros & cons

+0

啊,太棒了!我不得不稍微调整语法,但这比我想要的要好得多。谢谢! – Joshua