【问题标题】:Update multiple columns with different criteria for each column?为每列更新具有不同条件的多列?
【发布时间】:2026-02-06 08:00:02
【问题描述】:

在学生表中,我有 'null' 和 ('') 空单元格。有没有办法通过对每列使用不同的条件来更新多列?

我已经尝试了如下几个查询,但没有按计划进行

第一个:

update student_info SET email_id = Null, department = NULL, scholarship = NULL WHERE EXISTS (
SELECT email_id,department,scholarship from student_info WHERE 
(email_id in ('null','') or department in ('null', '') or scholarship in ('null', '')));
GO

第二个:

UPDATE student_info SET 
        email_id = CASE  WHEN ( email_id in ('null','')) THEN NULL END,
        department = CASE WHEN (department in ('null','')) THEN NULL END,
        scholarship = CASE WHEN (scholarship in ('null','')) THEN NULL END,
        location = CASE WHEN (location in ('null','')) THEN NULL END
        GO

我该如何解决这个问题?

表:

CREATE TABLE student_info ( student_id INT, email_id varchar(15), scholarship 
VARCHAR(5),location varchar(20), department VARCHAR(15), phone varchar(15));
GO

价值:

INSERT INTO student_info 
VALUES 
(1002,'1002@uni.com', 'Yes', 'null','', '+00000002'),
(1003,'null', 'Yes', 'International','', '+00000003'),
(1004,'1004@uni.com', 'null', '','English', '+00000004'),
(1005,'null', 'Yes', 'Domestic','', '+00000005'),
(1006,'null', 'Yes', 'Domestic','English', ''),
(1007,'', 'Yes', 'Domestic','English', '+00000007'),
(1009,'1001@uni.com', 'null', 'Domestic','English', '+00000009');
 GO

【问题讨论】:

  • NULL'NULL' 不同。列中的实际值是多少?另外你的预期输出是什么?
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql sql-update


【解决方案1】:

我认为这会更简单地写成:

UPDATE student_info 
    SET email_id = (CASE WHEN email_id NOT IN ('null', '') THEN email_id END),
        department = (CASE WHEN (department NOT IN ('null', '') THEN department END),
        scholarship = (CASE WHEN scholarship NOT ('null', '') THEN scholarship END),
        location = (CASE WHEN location NOT IN ('null', '') THEN location END)
WHERE email_id IN ('null', '') OR
      department IN ('null', '') OR
      scholarship IN ('null', '') OR
      location IN ('null', '');

变化是:

  1. CASE 表达式现在在 no 匹配时返回列。缺少的ELSE 意味着匹配总是NULL
  2. WHERE 子句不使用子查询。这是完全没有必要的。
  3. WHERE 子句检查所有四列。

在 SQL Server 中,最好使用WHERE 子句过滤掉不会发生更改的记录。即使记录没有更改,SQL Server 也会“进行更新”。

【讨论】:

  • @Rahat 。 . .你有理由不接受这个答案吗? WHERE 子句中的子查询不是解决问题的最佳方法。
【解决方案2】:

您的“case when”选项缺少“ELSE”和“WHERE”:

我添加了 2 并且它可以工作 (sqlfiddle to see the result):

UPDATE student_info SET 
        email_id = (CASE  WHEN ( email_id in ('null','')) THEN NULL ELSE email_id END),
        department = (CASE WHEN (department in ('null','')) THEN NULL ELSE department END),
        scholarship = (CASE WHEN (scholarship in ('null','')) THEN NULL ELSE scholarship END),
        location = (CASE WHEN (location in ('null','')) THEN NULL ELSE location END)
WHERE EXISTS (
SELECT email_id,department,scholarship from student_info WHERE 
(email_id in ('null','') or department in ('null', '') or scholarship in ('null', '')));

【讨论】:

  • 现在可以正常工作了。我认为这里不需要“WHERE EXISTS”子句。我试过没有它,它工作正常。非常感谢您的帮助。
  • exists 子查询检查是否需要更新 any 行。由于它不是correlated subquery,它不限制update 处理哪些行,它只是控制是否更新整个 表。也没有理由在 exists 子查询中使用多列 选择列表 (email_id,department,scholarship)。它只是语法要求的占位符,可以替换为NULL1 / 0。我更喜欢42
最近更新 更多