【问题标题】:What is the best way of writing a CASE within a CASE for multiple conditions in SQL在 SQL 中针对多个条件在 CASE 中编写 CASE 的最佳方法是什么
【发布时间】:2021-10-11 04:06:36
【问题描述】:

我需要在具有 3 个条件的案例语句中编写一个案例。
当 A=B
当A>B
当A

当我执行查询时,我只得到 A=B 的结果。

有 A>B 和 A

CASE WHEN A = B THEN

CASE WHEN VALUE_In_A IN (1,2,3) THEN 'Do something'

CASE WHEN VALUE_In_B IN (5,6,7) THEN 'Do something'

ELSE

CASE WHEN A > B THEN

CASE WHEN VALUE_In_A IN (1,2,3) THEN 'Do something'

CASE WHEN VALUE_In_A IN (5,5,6) THEN 'Do something'

ELSE

CASE WHEN A < B THEN

CASE WHEN VALUE_In_B IN (1,2,3) THEN 'Do something'

CASE WHEN VALUE_In_B IN (5,5,6) THEN 'Do something'

END END

具体代码如下
这里的全部目的是:
如果 jdGroupCode = emGradeCode,则返回 emGradeCode
如果 jdGroupCode > emGradeCode,返回 emGradeCode
如果 jdGroupCode

  case when jdGradeCode = emp.emGradeCode 
  then      
  case when emp.emGradeCode in ('1','2','3')    then 'Unskilled'                
  when EMP.emGradeCode in ('4','5','6','7')     then 'Semi-Skilled'                          
  when EMP.emGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'                
  when EMP.emGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'                
  when EMP.emGradeCode in ('18','19','20','21') then 'Senior Management'                
  when EMP.emGradeCode in ('22','23','24','25') then 'Top Management' 
  else      
  case when jdGradeCode > emp.emGradeCode     then      
  case when EMP.emGradeCode in ('1','2','3')    then 'Unskilled'     
  when EMP.emGradeCode in ('4','5','6','7')     then 'Semi-Skilled'    
  when EMP.emGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'           
  when EMP.emGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'      
  when EMP.emGradeCode in ('18','19','20','21') then 'Senior Management'    
  when EMP.emGradeCode in ('22','23','24','25') then 'Top Management' 
  else 
    case when jdGradeCode < emp.emGradeCode     then      
  case when jdGradeCode in ('1','2','3')    then 'Unskilled'     
  when jdGradeCode in ('4','5','6','7')     then 'Semi-Skilled'    
  when jdGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'           
  when jdGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'      
  when jdGradeCode in ('18','19','20','21') then 'Senior Management'    
  when jdGradeCode in ('22','23','24','25') then 'Top Management' 
end end end end end end,
 

【问题讨论】:

  • VALUE_In_AVALUE_In_B 是表中的其他列还是您的意思是 A 和 B?
  • 此查询无法编译 - 您有 9 个 CASE 实例,只有两个 END 实例。您能否发布您实际执行的查询结果不正确而不是伪代码?
  • @GarethD 我已经粘贴了我执行的确切代码
  • @forpas 添加了确切的代码
  • 你的嵌套层级错了,你基本上有CASE WHEN jdGradeCode = emp.emGradeCode THEN &lt;all your logic&gt; END。因此,如果不满足此初始条件,您将无法到达 case 表达式的任何其他部分。你最喜欢想要CASE WHEN jdGradeCode = emp.emGradeCode THEN ... WHEN jdGradeCode &lt; emp.emGradeCode THEN ... ELSE ... END。您会发现使用良好的缩进并确保您的 CASE 与您的 END 对齐将真正有助于发现此类问题。

标签: sql-server tsql case


【解决方案1】:

对于要应用主 CASE 表达式的逻辑,需要 3 个分支,每个分支需要另一个 CASE 表达式:

case 
  when jdGradeCode = emp.emGradeCode then   
    case 
      when emp.emGradeCode in ('1','2','3') then 'Unskilled'    
      when emp.emGradeCode in ('4','5','6','7') then 'Semi-Skilled'        
      when emp.emGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'    
      when emp.emGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'    
      when emp.emGradeCode in ('18','19','20','21') then 'Senior Management'    
      when emp.emGradeCode in ('22','23','24','25') then 'Top Management'    
    end
  when jdGradeCode > emp.emGradeCode  then   
    case 
      when emp.emGradeCode in ('1','2','3') then 'Unskilled'  
      when emp.emGradeCode in ('4','5','6','7')  then 'Semi-Skilled' 
      when emp.emGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'     
      when emp.emGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'   
      when emp.emGradeCode in ('18','19','20','21') then 'Senior Management' 
      when emp.emGradeCode in ('22','23','24','25') then 'Top Management' 
    end 
  when jdGradeCode < emp.emGradeCode  then   
    case 
      when jdGradeCode in ('1','2','3') then 'Unskilled'  
      when jdGradeCode in ('4','5','6','7')  then 'Semi-Skilled' 
      when jdGradeCode in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'     
      when jdGradeCode in ('14','15','16','17') then 'Middle Management (Prof Qual)'   
      when jdGradeCode in ('18','19','20','21') then 'Senior Management' 
      when jdGradeCode in ('22','23','24','25') then 'Top Management' 
    end
end

但是这样你必须重复 3 次相同的逻辑。
不幸的是,SQL Server 不支持像 LEAST() 这样的函数,而其他数据库(如 MySql 和 Postgresql)支持并有助于缩短/简化代码。
因此,您可以使用另一个 CASE 表达式来获得emp.emGradeCodejdGradeCode 中的最小值:

case 
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('1','2','3') then 'Unskilled'    
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('4','5','6','7') then 'Semi-Skilled'        
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('8','9','10','11','12','13')  then 'Junior Management (Sklled & Academically Qual)'    
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('14','15','16','17') then 'Middle Management (Prof Qual)'    
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('18','19','20','21') then 'Senior Management'    
  when case when jdGradeCode < emp.emGradeCode then jdGradeCode else emp.emGradeCode end in ('22','23','24','25') then 'Top Management'    
end

这也将进一步简化,可能使用子查询,或者使用&lt;&gt; 运算符,而不是枚举in 列表中的所有值。

【讨论】:

  • 工作就像一个魅力,感谢磨坊。结束语句导致我的 proc 返回丢失的字符串
【解决方案2】:

我会说您的案例混淆了缺少的END 条件,这应该归档您想要的内容

CASE WHEN A = B THEN
    CASE WHEN VALUE_IN_A IN (1,2,3) 
        THEN 'magic string a=b, value in (1,2,3)' 
        ELSE 
            CASE WHEN VALUE_IN_B IN (5,6,7) THEN 'magic string a=b, value in (5,6,7)' 
            END
        END
ELSE
CASE WHEN A > B THEN
    CASE WHEN Value_IN_A IN (1,2,3) THEN 'magic string a>b value in (1,2,3)' 
        ELSE 
            CASE WHEN Value_IN_A IN (5,5,6) THEN 'magic string a > b value in (5,5,6)' 
            END
        END
ELSE
CASE WHEN A < B THEN
    CASE WHEN Value_IN_B IN (1,2,3) THEN 'magic string a<b value in (1,2,3)' 
        ELSE 
            CASE WHEN Value_IN_B IN (5,5,6) THEN 'magic string a < b value in (5,5,6)' 
            END
        END
END
END
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多