2015-07-13 693 views
1

SELECT兩個或多個列的值是否可能與CASE語句的一次性匹配?我的意思,而不是:SQL中的一個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語句做:

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

我能問的是爲什麼? –

+0

不可以使用'CASE'表達式。 – Kaf

+1

@Kaf在壓力情況下清除代碼,而不是結果。 –

回答

1

這是不可能的用CASE表達。 對於每一個你需要列新CASE

1

這是不可能的,但你可以使用一個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; 
0

我從你的問題理解什麼是你要更新多列,如果certa在條件是真實的。

對於這種情況,您必須使用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

0

你可以用一個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 
1

等效selectupdate是:

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值時,沒有匹配。而且,您可以擁有任意數量的列。