如何通过连接其他列值来更新列

How to update column with concatenation of other column values

我有一个 table,有 4 个栏目:科学、数学、英语和 类。 科学、数学和英语是布尔值,类是nvarchar。

如果 Science 为 1,则 类 应附加分号和字符串 001。 如果 Math 为 1,则 类 应附加分号和字符串 002。 如果 English 是 1,那么 类 应该附加一个分号和字符串 003.

所以如果科学是 1,数学是 0,英语是 1,那么 类 将有 001;003。 或者,如果科学为 0,数学为 1,英语为零,则 类 将有 003。

我最初尝试过:

Update Table
SET Classes = CASE
                WHEN Science = 1 THEN concat(Classes, ';001')
                WHEN Math = 1 THEN concat(Classes, ';002')
                WHEN English = 1 THEN concat(Classes, ';003')
              END

但这行不通,因为一旦 CASE 找到一个 true 语句,它就会更新它并且不会检查其他条件。谁能帮忙弄清楚如何进行这种串联?谢谢!

CONCAT() 中需要 3 个 CASE 表达式:

UPDATE Table
SET Classes = CONCAT(Classes, 
                CASE WHEN Science = 1 THEN ';001' END,
                CASE WHEN Math = 1 THEN ';002' END,
                CASE WHEN English = 1 THEN ';003' END
              )
WHERE 1 IN (Science, Math, English);

另一种选择是使用稍微更紧凑的iif

classes=
concat(
    iif(science=1,';001',''),
    iif(math=1,';002',''),
    iif(english=1,';003','')
)

因为在您的问题中您表示不需要第一个分号,您可以使用 stuff

将其删除
stuff(concat(
    iif(science=1,';001',''),
    iif(math=1,';002',''),
    iif(english=1,';003','')
),1,1,'')

对于 SQL Server 2017 及更高版本。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Science BIT, Math BIT, English BIT, Classes VARCHAR(20) DEFAULT (NULL));
INSERT INTO @tbl (Science, Math, English) VALUES
(1, 0, 1),
(0, 1, 0);
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

UPDATE @tbl
SET Classes = CONCAT_WS(';', IIF(Science=1, '001',NULL), IIF(Math=1, '002',NULL), IIF(English=1, '003',NULL))

-- after
SELECT * FROM @tbl;

输出

+----+---------+------+---------+---------+
| ID | Science | Math | English | Classes |
+----+---------+------+---------+---------+
|  1 |       1 |    0 |       1 | 001;003 |
|  2 |       0 |    1 |       0 | 002     |
+----+---------+------+---------+---------+