【问题标题】:How to update column with concatenation of other column values如何使用其他列值的连接更新列
【发布时间】:2021-09-19 07:41:29
【问题描述】:

我有一个包含 4 列的表格:科学、数学、英语和课程。 科学、数学和英语是布尔值,类是 nvarchar。

如果 Science 为 1,则 Classes 应附加分号和字符串 001。 如果 Math 为 1,则 Classes 应附加分号和字符串 002。 如果 English 为 1,则 Classes 应附加分号和字符串 003。

因此,如果 Science 为 1,Math 为 0,English 为 1,则 Classes 为 001;003。 或者,如果科学为 0,数学为 1,英语为 0,则 Classes 为 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 找到一个真实的陈述,它就会更新它并且不会检查其他条件。任何人都可以帮助弄清楚如何进行这种连接吗?谢谢!

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
  • 我会将其更改为计算列

标签: sql sql-server sql-update concatenation


【解决方案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     |
+----+---------+------+---------+---------+

【讨论】:

    【解决方案2】:

    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);
    

    【讨论】:

    • 甚至不需要ELSE ''。 (但保留它们并没有什么坏处)
    • @Luuk 你说得对。在 SQL Server 中,CONCAT() 与其他数据库不同,它会忽略空值。
    • 我刚试过这个,它奏效了!感谢您的帮助:) 这对我作为 SQL 初学者很有帮助
    【解决方案3】:

    另一种选择是使用更紧凑的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,'')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2022-06-10
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多