Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据评估几列中的某些列是否为真来创建计算列?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 根据评估几列中的某些列是否为真来创建计算列?

Sql 根据评估几列中的某些列是否为真来创建计算列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想写一个查询,创建一个计算列,基于评估现有的几个列是否为真 例如,如果我希望如果7列中的任意3列或更多列恰好为空,则列的输出为“否”,如果其中任意2列恰好为空,则为“可能”,如果其中任意一列恰好为空,则为“是”。case语句似乎需要枚举每个可能的列组合 我研究了创建一个局部变量,然后在select语句中设置/重新定义它,但是我找不到任何语法可以做的事情,假设这是可能的。这样做的方法是什么?这并不漂亮,但这里有一个选项: ALTER TABLE dbo.Table ADD CalculatedC

我想写一个查询,创建一个计算列,基于评估现有的几个列是否为真

例如,如果我希望如果7列中的任意3列或更多列恰好为空,则列的输出为“否”,如果其中任意2列恰好为空,则为“可能”,如果其中任意一列恰好为空,则为“是”。case语句似乎需要枚举每个可能的列组合


我研究了创建一个局部变量,然后在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   |
+----+----------+-------+