【问题标题】:How to optimize MSSQL CASE WHEN queries如何优化 MSSQL CASE WHEN 查询
【发布时间】:2018-12-06 11:41:29
【问题描述】:

这是我的代码示例:

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。

有没有更聪明的方法来做到这一点?

【问题讨论】:

    标签: sql sql-server optimization select


    【解决方案1】:
    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.

    【讨论】:

    • 啊,太棒了!我不得不稍微调整一下语法,但这比我想出的要好得多。谢谢!
    猜你喜欢
    • 2021-03-15
    • 2016-02-23
    • 1970-01-01
    • 2017-05-30
    • 2014-11-29
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多