如何通过连接其他列值来更新列
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 |
+----+---------+------+---------+---------+
我有一个 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 |
+----+---------+------+---------+---------+