在sql server中用一个条件更新多个列
Posted
技术标签:
【中文标题】在sql server中用一个条件更新多个列【英文标题】:update multiple columns with one condition in sql server 【发布时间】:2021-04-26 10:49:54 【问题描述】:我有一个包含一些列的表,我需要在 SQL Server 中根据条件更新它。 我有一张桌子,我想在一些 UI 操作后在这张桌子上执行“更新”语句。 但问题是我必须根据条件只更新某些列,而某些列将在没有任何条件的情况下更新。
请检查下面的架构详细信息
Table_1
ID | Name | Phone | |
---|---|---|---|
1 | A | a@g.com | 12345678890 |
2 | B | b@g.com | 14345678890 |
我有一个过程,我们正在发送用于更新此表的参数,并且我们还发送一个标志参数(用于在更新语句中应用条件)
CREATE PROC UpdateStudent
@Name VARCHAR(100) = NULL,
@Email VARCHAR(100) = NULL,
@Phone VARCHAR(20) = NULL,
@IsChanged BIT = NULL
AS
BEGIN
--update 'Table_1'
update Table_1 SET
Name = IIF(@IsChanged = 1, @Name, null),
Email = @Email,
Phone = IIF(@IsChanged = 1, @Phone , null)
where ID = 1
END
因此,如果标志 @IsChanged 为 1,则根据上述查询我需要更新,但如果标志 @IsChanged 为 0,则我必须更新不同的“更新”语句-
IF @IsChanged = 0
BEGIN
--update 'Table_1'
update Table_1 SET
Name = NULL,
Email = NULL,
Phone = NULL
where ID = 1
END
有没有最好的方法来处理这个要求,如果我们必须用一个条件更新多个列,我们如何在 SQL Server 中做到这一点?
【问题讨论】:
您当前的更新查询有什么问题? @TimBiegeleisen,没有错,但问题是如果我的表中有 10 列,那么我必须为每列使用此条件 10 次。所以,我正在寻找一种方法,我们可以使用一个 case 语句或一个条件来更新它。 您可以将IIF
替换为CASE
表达式,但它实际上会给您更多代码,而不是更少。
@TimBiegeleisen,它会解决我的问题吗?如果是,请添加一些代码。
不 - 这里没有“问题”需要解决。您只是想避免编写重复的代码。要求别人免费为你做这件事似乎有点冒昧。而且我认为您当前的设计和逻辑毫无意义。如果什么都没有改变(IsChanged = 0),那么为什么要调用这个过程呢?像这样的过程的默认值 null 对 IMO 毫无意义,但确实鼓励开发人员懒惰。
【参考方案1】:
为了让事情更清楚,你可以有 IF else 逻辑。
IF @IsChanged = 1
BEGIN
update Table_1 SET
Name = @Name
Email = @Email,
Phone = @Phone
where ID = 1
END
ELSE
BEGIN
update Table_1 SET
Name = null
Email = @Email,
Phone = null
where ID = 1
END
【讨论】:
以上是关于在sql server中用一个条件更新多个列的主要内容,如果未能解决你的问题,请参考以下文章