表:表名
create table table_name
(
given_dates timestamp,
set_name varchar
);
插入记录:
insert into table_name values('2001-01-01'),('2001-01-05'),('2001-01-10'),
('2001-01-15'),('2001-01-20'),('2001-01-25'),
('2001-02-01'),('2001-02-05'),('2001-02-10'),
('2001-02-15');
现在我想更新某些日期的 set_name 。
例如:
我想像这样更新表:
given_dates set_name
----------------------
2001-01-01 s1
2001-01-05 s1
2001-01-10 s2
2001-01-15 s2
2001-01-20
2001-01-25
2001-02-01
2001-02-05
2001-02-10
2001-02-15
注意:given_dates
andset_name
是传递参数,因为它们是动态的。如上图我可以通过2套,s1,s2
也可以根据要求通过4套。
所以我需要动态 case 语句来更新set_name
.
给定两个参数:
declare p_dates varchar := '2001-01-01to2001-01-05,2001-01-10to2001-01-15';
declare p_sets varchar := 's1,s2';
那么我可以通过使用以下静态脚本来做到这一点:
静态更新声明:
update table_name
SET set_name =
CASE
when given_dates between '2001-01-01' and '2001-01-05' then 's1'
when given_dates between '2001-01-10' and '2001-01-15' then 's2'
else ''
end;
上面的 update 语句完成了工作,但是是静态的。
就像更新表的相同方式一样,我只想准备 case 语句,它应该是动态的,可以根据参数的(p_dates,p_sets)
变化而变化。
问题:
- 如何拆分给定的日期
p_dates
?(我to
在两个日期之间有关键字。) - 如何拆分给定的集合
p_sets
?(我在两个 set_name 之间有 ',' 逗号。) p_dates
拆分and后如何准备动态case语句p_sets
?
这个问题与使用 SQL Server 2008 R2 的动态案例语句有关,这与 Microsoft SQL Server 相同。