Sql 根据评估几列中的某些列是否为真来创建计算列?
我想写一个查询,创建一个计算列,基于评估现有的几个列是否为真 例如,如果我希望如果7列中的任意3列或更多列恰好为空,则列的输出为“否”,如果其中任意2列恰好为空,则为“可能”,如果其中任意一列恰好为空,则为“是”。case语句似乎需要枚举每个可能的列组合Sql 根据评估几列中的某些列是否为真来创建计算列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想写一个查询,创建一个计算列,基于评估现有的几个列是否为真 例如,如果我希望如果7列中的任意3列或更多列恰好为空,则列的输出为“否”,如果其中任意2列恰好为空,则为“可能”,如果其中任意一列恰好为空,则为“是”。case语句似乎需要枚举每个可能的列组合 我研究了创建一个局部变量,然后在select语句中设置/重新定义它,但是我找不到任何语法可以做的事情,假设这是可能的。这样做的方法是什么?这并不漂亮,但这里有一个选项: ALTER TABLE dbo.Table ADD CalculatedC
我研究了创建一个局部变量,然后在select语句中设置/重新定义它,但是我找不到任何语法可以做的事情,假设这是可能的。这样做的方法是什么?这并不漂亮,但这里有一个选项:
ALTER TABLE dbo.Table ADD CalculatedColumn AS (
CASE (CASE WHEN col_a IS NULL THEN 1 ELSE 0 END + CASE WHEN col_b IS NULL THEN 1 ELSE 0 END + ...)
WHEN 1 THEN 'Yes'
WHEN 2 THEN 'Maybe'
ELSE 'No' --3 or more
END
);
您也可以为0添加一个案例,但是您希望处理它。从查询的角度来看,您可以尝试以下操作:
-- Create a mock-up table.
DECLARE @Data table (
col1 varchar(10),
col2 varchar(10),
col3 varchar(10),
col4 varchar(10),
col5 varchar(10),
col6 varchar(10),
col7 varchar(10),
id int IDENTITY ( 1, 1 )
);
-- Insert some mock data.
INSERT INTO @Data VALUES
( 'val', 'val', 'val', 'val', NULL, NULL, NULL ),
( 'val', 'val', 'val', 'val', 'val', NULL, NULL ),
( 'val', 'val', 'val', 'val', 'val', 'val', NULL );
-- Query data and return Yes, No, Maybe based on the number of null columns.
;WITH col_data AS (
SELECT
id,
CASE WHEN col1 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col2 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col3 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col4 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col5 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col6 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col7 IS NULL THEN 1 ELSE 0 END
AS null_sum
FROM @Data
)
SELECT
id,
null_sum,
CASE
WHEN null_sum <= 1 THEN 'Yes'
WHEN null_sum <= 2 THEN 'Maybe'
ELSE 'No'
END AS msg
FROM col_data;
好的,我看到了使用嵌套case语句进行计算。这比定义每个变量组合要好得多,谢谢。SQL似乎混淆了select和case语法的局限性……如果它不是计算列,只是select,那么子查询将在countval>=3时使用select case,然后是“否”。。。从值COL1,col2。。。vvalFYI案例是一个表达式而不是一个语句。请显示一些示例数据、预期结果和您尝试过的内容。
+----+----------+-------+
| id | null_sum | msg |
+----+----------+-------+
| 1 | 3 | No |
| 2 | 2 | Maybe |
| 3 | 1 | Yes |
+----+----------+-------+