【问题标题】:One case statement for multiple parameters多个参数的一个案例语句
【发布时间】:2018-01-30 16:20:59
【问题描述】:

下面是我的示例代码情况

declare @Ka int = select count(empid) from employee where age between 18 and 22
declare @Kb int = select count(empid) from employee where age between 23 and 30
declare @Kc int = select count(empid) from employee where age between 31 and 35

现在,如果 Ka/Kb/Kc 的值不是 0 或 null,则应显示“x”,否则应显示空白。所以我的选择语句是:

select  
   CASE WHEN @Ka = 0 then ''  
        ELSE 'X' 
        END AS 'Ka',
   CASE WHEN @Kb = 0 then ''  
        ELSE 'X' 
        END AS 'Kb',
   CASE WHEN @Kc = 0 then ''  
        ELSE 'X' 
        END AS 'Kc'

所以如果我有更多的参数,我应该像上面一样为每个参数做一个案例陈述吗?有没有办法做单例语句,包括所有符合条件的参数?或者有没有一种简单的方法来完成类似的事情?

【问题讨论】:

  • 请注意,您的变量在这里永远不能有 NULL 的值。对表执行COUNT 将始终返回一个值,即使它不包含任何行。然而,这不是其他聚合函数的工作方式(0 行结果集的COUNT(*) 将返回 0,然而,0 行结果集的SUM(Column) 不会返回结果)。

标签: sql sql-server select case


【解决方案1】:

为什么要这样?如果您要执行以下操作(不带变量),它似乎效率更高:

SELECT CASE WHEN COUNT(CASE WHEN age BETWEEN 18 AND 22 THEN empid END) = 0 THEN '' ELSE 'X' END AS Ka,
       CASE WHEN COUNT(CASE WHEN age BETWEEN 23 AND 30 THEN empid END) = 0 THEN '' ELSE 'X' END AS Kb,
       CASE WHEN COUNT(CASE WHEN age BETWEEN 31 AND 35 THEN empid END) = 0 THEN '' ELSE 'X' END AS Kc
FROM Employee;

【讨论】:

    【解决方案2】:

    没有。不要这样做。您需要查询内部的逻辑:

    select sum(case when age between 18 and 22 then 1 else 0 end) as age_18_22,
           sum(case when age between 23 and 30 then 1 else 0 end) as age_23_30,
           sum(case when age between 31 and 35 then 1 else 0 end) as age_31_35       
    from employee e; 
    

    SQL 不能通过替换查询字符串中的文本来工作。我的意思是,你可以这样做——它被称为dynamic sql。但您应该首先学习表达查询的基础知识。

    【讨论】:

    • 对于这种情况,我认为 OP 真的希望 'x'blank 作为最终结果
    • 明白了。有什么区别?我的旧方式和建议的方式之间有什么性能差异吗?
    • @Jiah 最大的好处是您只需解析一次表格,并在解析时进行计算。使用您的 SQL,必须为每个变量解析一次表,然后您必须对变量值进行进一步检查。
    • @Larnu 如果我遇到想要添加 Ka+Kb+Kc 的情况,那么我必须去参数对吗?
    • @Jiah,没有。我建议在那个阶段使用 CTE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多