【发布时间】:2015-03-17 03:01:02
【问题描述】:
表格:表格名称
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 和set_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;
上面的更新语句完成的工作是静态的。
与更新表的方法相同,我只想准备 case 语句,它应该是动态的,可以根据参数 (p_dates,p_sets) 更改。
问题:
- 如何拆分
p_dates的给定日期? (我在两个日期之间有to关键字。) - 如何拆分
p_sets的给定集合? (我在两个 set_name 之间有 ',' 逗号。) -
p_dates和p_sets拆分后如何准备动态case语句?
这个问题与Dynamic case statement using SQL Server 2008 R2 相关,这与 Microsoft SQL Server 相同。
【问题讨论】:
-
查看
string_to_array()函数:postgresql.org/docs/current/static/functions-array.html -
您可能还想查看regexp_split_to_table。但我不确定直接去表并绕过数组到底是否更好。
标签: sql postgresql postgresql-9.3 set-returning-functions unnest