【问题标题】:Case Statement Performance (is it possible to reference another case statement from within another one?)案例陈述表现(是否可以从另一个案例陈述中引用另一个案例陈述?)
【发布时间】:2012-08-11 05:26:24
【问题描述】:

我有一个关于子查询和案例陈述的问题

我在同一个查询中有两个 case 语句:

  • 有一个子查询,用于确定列是否匹配。
  • 我希望对方检查 [在其他检查中] 是否匹配,然后标记一个值。
  • 但是,t-SQL 不允许我在第二个 case 语句中引用我的第一个字段(从 case 语句生成)。
  • 这迫使我将子查询添加到我的第二个 case 语句中并取消第一个 case 语句
  • 当我这样做时,我的查询从 13 秒变为 2.5 分钟
  • 当我从查询中完全删除子查询时,运行需要 8 秒

问题1:可以在同一个查询的后续case语句中引用case语句生成的字段吗?

问题 2: 为什么当我在一个独立的 case 语句中有子查询时,我的查询只多花 5 秒,而当该子查询在一个有 4-5 个其他的 case 语句时却多花 2 分钟检查?

第一个案例陈述

CASE WHEN (SELECT xxx.xxx from xxx) THEN 'Y' 
     END AS "Match_Ind",

第二个案例陈述

CASE WHEN condition 1 = true THEN 'cond1'
    WHEN condition 2 = true THEN 'cond2'
    WHEN Match_Ind = 'Y' THEN 'matched'
    END AS "Match Detail"

【问题讨论】:

  • 您能发布完整的查询吗?您甚至可能不需要 SELECTCASE 语句中。

标签: sql tsql subquery case


【解决方案1】:

您应该考虑发布您的完整查询,但如果您想在另一个 CASE 语句中引用第一个 CASE 的结果,那么您可以将其包装在类似于以下内容的 SELECT 中:

select 
    CASE 
        WHEN condition 1 = true THEN 'cond1'
        WHEN condition 2 = true THEN 'cond2'
        WHEN Match_Ind = 'Y' THEN 'matched'
    END AS Match Detail
from 
(
    SELECT CASE 
        WHEN conditionHere -- (SELECT xxx.xxx from xxx)
        THEN 'Y' 
        END AS Match_Ind,
        othercols
    from yourtable
) x

【讨论】:

  • 感谢您的快速回复!将子查询放在 FROM 子句中就可以了。
【解决方案2】:

你有没有尝试过类似的方法:

select case Bar1 ... end as Bar2, ...
  from ( select case Foo1 ... end as Bar1, ... from ... )

可以根据需要与其他表格一起JOINed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2010-10-30
    • 2016-05-13
    • 2016-02-21
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多