更新多行而不循环

时间:2014-12-10 18:07:03

标签: sql-server sql-server-2008-r2 sql-update

我想在更新语句中一次更新多行而不使用循环。

我的下表包含一些记录,如下所示:

表:

create table test
(
col1 int,
col2 int,
col3 varchar(20),
col4 datetime,
name varchar(max)
);

插入:

insert into test values(111,999,'A101','2014-01-01','');
insert into test values(112,998,'A102','2014-01-02','');
insert into test values(113,997,'A103','2014-01-03','');
insert into test values(114,996,'A104','2014-01-04','');
insert into test values(111,999,'A101','2014-01-01','');
insert into test values(114,996,'A104','2014-01-04','');
insert into test values(115,995,'A105','2014-01-05','');
insert into test values(116,994,'A106','2014-01-06','');

现在我想更新特定日期的名称,例如如下所示:

更新name D1,查看2014-01-012014-01-02之间的日期 更新name D2,了解2014-01-042014-01-06

之间的日期

预期结果表

col1    col2    col3            col4             name
-------------------------------------------------------
111     999     A101    2014-01-01 00:00:00.000  D1
112     998     A102    2014-01-02 00:00:00.000  D1
113     997     A103    2014-01-03 00:00:00.000  
114     996     A104    2014-01-04 00:00:00.000  D2
111     999     A101    2014-01-01 00:00:00.000  D1
114     996     A104    2014-01-04 00:00:00.000  D2
115     995     A105    2014-01-05 00:00:00.000  D2

注意:如何在不循环的情况下将上述名称更新到单个更新语句中的特定日期。

1 个答案:

答案 0 :(得分:3)

我可以想象这样做的一种方式(可能不是最快的方法)是使用带有CASE语句的UPDATE。

UPDATE  test
SET     name = CASE WHEN col4 BETWEEN '2014-01-01' AND '2014-01-02' THEN 'D1'
                    WHEN COL4 BETWEEN '2014-01-04' AND '2014-01-06' THEN 'D2'
                    ELSE name --Keeps que old value if doesn't match any case statement
               END

我在这里进行了测试,它完全符合您的需要。