我不想为每一列重复我的解决方案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.
问候。
答案 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)