SQL Server在Case When Then中映射多个列

时间:2017-11-19 18:55:28

标签: sql sql-server database

我不想为每一列重复我的解决方案1,而是我想要的是我应该只有一个条件,并且我应该能够在此基础上在不同的列中设置不同的值。

通常在SQL Select语句中我们可以这样做。

解决方案1:

select
  abc  as column1,
  def  as column2,
  (
     case
     when someColumn is not null
        then (1)
     else 0
 end
 ) as column3

但我想要做的是,如果满足某些条件,例如(someColumn不为null),则将1设置为column3,将2设置为coulmn 4 e.t.c 我怎样才能做到这一点。我希望实现这样的目标。

需要什么:

SELECT
     (
      case
      when column is null   
      then( 
               1 as column3,
               2 as column4
         )
      else  (
               10 as column3,
               20 as column4
        )
     ))
from table.

问候。

3 个答案:

答案 0 :(得分:1)

您无法使用CASE执行此操作,但使用 IIF 可以轻松实现:

DECLARE @Test INT = NULL;

--NULL case
SELECT IIF(@Test IS NULL, 1, 10) AS Col3, IIF(@Test IS NULL, 2, 20) AS Col4;

SET @Test = 1;
--NOT NULL case
SELECT IIF(@Test IS NULL, 1, 10) AS Col3, IIF(@Test IS NULL, 2, 20) AS Col4;

结果(NULL):

+------+------+
| Col3 | Col4 |
+------+------+
|    1 |    2 |
+------+------+

结果(非空):

+------+------+
| Col3 | Col4 |
+------+------+
|   10 |   20 |
+------+------+

这是一个简单的 demo

更新

以下是使用IIF IIF解决问题的方法

CREATE TABLE MyTable (
    ID INT IDENTITY(1,1) NOT NULL,
    TestCol INT,
    CONSTRAINT PK_Test PRIMARY KEY (ID)
    );

INSERT INTO MyTable VALUES
(NULL),
(1),
(2),
(3),
(NULL),
(1),
(2),
(55);
SELECT *, 
       IIF(TestCol IS NULL, 1, IIF(TestCol = 1, 11, IIF(TestCol = 2, 22 , IIF(TestCol = 3 , 33 , 0)))) AS Col3, 
       IIF(TestCol IS NULL, 11, IIF(TestCol = 1, 111, IIF(TestCol = 2, 222 , IIF(TestCol = 3 , 333 , 100)))) AS Col4
FROM MyTable;

请参阅 demo

答案 1 :(得分:0)

您可以使用表驱动方法。在@CaseTable表中添加所有案例值并将其与主表连接。并从案例表

获取值
DECLARE @CaseTable TABLE (CaseValue INT, column3 INT, column4 INT)
INSERT INTO @CaseTable VALUES 
(1, 1, 2), 
(2,10,20)

DECLARE @TheTable  TABLE (column1 VARCHAR(10), column2 VARCHAR(10), someColumn VARCHAR(10))
INSERT INTO @TheTable VALUES
('abc','def', 'xyx'),
('ghi','jkl', NULL)

SELECT column1, column2, C.column3, C.column4 FROM @TheTable T
LEFT JOIN @CaseTable C ON C.CaseValue = (CASE WHEN T.someColumn IS NULL THEN 1 ELSE 2 END)

答案 2 :(得分:0)

您可以将CROSS APPLY用于此类需求(demo

SELECT CA.column3,
       CA.column4
FROM   YourTable t
       /*conditions are mutually exclusive and guaranteed that one is true
         so will output one row per outer row*/
       CROSS APPLY (SELECT 1, 2 WHERE  column0 IS NULL
                    UNION ALL
                    SELECT 10, 20 WHERE  column0 IS NOT NULL
                   )CA(column3, column4)