【问题标题】:Two or more results of one CASE statement in SQLSQL 中一个 CASE 语句的两个或多个结果
【发布时间】:2015-07-13 09:19:29
【问题描述】:

SELECT 是否可以通过 CASE 语句的一击获得两列或更多列的值?我的意思是,而不是:

select 
 ColumnA = case when CheckColumn='condition' then 'result1' end
,ColumnB = case when CheckColumn='condition' then 'result2' end

类似:

select case when CheckColumn='condition' then ColumnA='result1', ColumnB='result2' end

更新
就像我们可以使用 UPDATE 语句一样:

update CTE
set ColumnA='result1', ColumnB='result2'
where CheckColumn='condition'

【问题讨论】:

  • 我只能问为什么?
  • 不,不可能使用CASE 表达式。
  • @Kaf 用于在强调条件而不是结果时清除代码。
  • @Fireblade 为了表演。它不是多次检查相同的条件吗?我在 UPDATE 语句stackoverflow.com/a/15881737/1903793 中查找了多个列的更新逻辑
  • 可能值得对此进行分类:在文本中你说你想做一个UPDATE,但你的例子显示SELECT。您能否更改文本或示例以使问题保持​​一致?

标签: sql sql-server case


【解决方案1】:

CASE 表达式是不可能的。 对于每一列,您都需要新的CASE

【讨论】:

    【解决方案2】:

    这是不可能的,但您可以使用 table value constructor 作为解决此问题的方法,将 columna 和 columnb 的每个值存储在您的检查列中:

    SELECT  t.CheckColumn,
            v.ColumnA,
            v.ColumnB
    FROM    dbo.YourTable AS t
            LEFT JOIN 
            (VALUES
                ('Condition1', 'Result1', 'Result2'),
                ('Condition2', 'Result3', 'Result4'),
                ('Condition3', 'Result5', 'Result6')
            ) AS v (CheckColumn, ColumnA, ColumnB)
                ON v.CheckColumn = t.CheckColumn;
    

    如果您有更复杂的条件,那么您仍然可以应用此逻辑,但只需使用伪结果进行连接:

    SELECT  t.CheckColumn,
            v.ColumnA,
            v.ColumnB
    FROM    dbo.YourTable AS t
            LEFT JOIN 
            (VALUES
                (1, 'Result1', 'Result2'),
                (2, 'Result3', 'Result4'),
                (3, 'Result5', 'Result6')
            ) AS v (ConditionID, ColumnA, ColumnB)
                ON v.ConditionID = CASE WHEN <some long expression> THEN 1
                                        WHEN <some other long expression> THEN 2
                                        ELSE 3
                                    END;
    

    【讨论】:

      【解决方案3】:

      update 等效的select 是:

      select 'result1', 'result2'
      . . .
      where CheckColumn = 'condition';
      

      您的select 不同,因为它产生NULL 值。有一种神秘的方式,你可以用outer apply 基本上做到这一点:

      select t2.*
      from . . . outer apply
           (select t.*
            from (select 'result1' as col1, 'result2' as col2) t
            where CheckColumn = 'condition'
           ) t2;
      

      当没有匹配时,这将返回 NULL 值。而且,您可以拥有任意数量的列。

      【讨论】:

        【解决方案4】:

        我从您的问题中了解到,如果某些条件为真,您希望更新多个列。

        对于这种情况,您必须使用MERGE 语句。

        使用 MERGE 的示例在 msdn here 上给出。

        代码示例:

        -- MERGE statement for update.
        USE [Database Name];
        GO
        MERGE Inventory ity
        USING Order ord
        ON ity.ProductID = ord.ProductID
        WHEN MATCHED THEN
          UPDATE
          SET ity.Quantity = ity.Quantity - ord.Quantity;
        

        更多 MERGE 语句示例here

        【讨论】:

          【解决方案5】:

          你可以通过 CTE 或 CROSS APPLY 来解决这个问题,类似于

          DECLARE @tbl2 TABLE(inx INT, val1 VARCHAR(10),val2 VARCHAR(10));
          INSERT INTO @tbl2 VALUES(1,'value1a','value1b'),(2,'value2a','value2b'),(3,'value2a','value2b');
          
          UPDATE yourTable SET col1=subTable.val1,col2=subTable.val2
          FROM yourTable
          CROSS APPLY(
              SELECT val1,val2
              FROM @tbl2
              WHERE inx=1 --YourCondition
          ) AS subTable
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-22
            • 2015-02-06
            • 2014-08-18
            • 1970-01-01
            • 1970-01-01
            • 2017-02-17
            • 2022-06-21
            相关资源
            最近更新 更多