gpt4 book ai didi

sql - 将列表传递给 where 子句

转载 作者:行者123 更新时间:2023-11-29 11:46:01 27 4
gpt4 key购买 nike

我正在尝试从 SQL 导出到 .csv,如果我对其进行硬编码以接受一定数量的参数,它就会工作。问题是,我想允许用户请求任意数量的参数并将这些参数传递给 where 子句。代码应该使这一点更加清晰。

create temporary table bdates as

select tt.date, tt.time, tt.location
from birthdays as bd
inner join days as d
on (d.id = bd.birth_id)
inner join total_time as tt
on (bd.date = tt.date and
bd.time = tt.time and
d.day_of = tt.location)
where tt.date in(:date1, :date2) --defined by user at command line
order by...

\copy bdates to '.csv'

所以我想我想做的是将列表传递给 where 子句而不是显式的 :dates# 变量。例如,一个人可以使用参数“2012-01-04 12:00、2012-02-04 12:00、2012-03-04 12:00”运行脚本,或者只有两个或一个参数。在三个的情况下,字符串将被解析为“2012-01-04 12:00”、“2012-02-04 12:00”、“2012-03-04 12:00”。

我已经尝试过 string_to_array()、unnest(regexp_matches(:dates, expression)) 和 regexp_split_to_table(:dates, expression),但我不确定如何进行连接。我尝试过的各种解决方案产生了许多错误,包括:

无法将类型 text[] 转换为没有时区的时间戳

无法将类型记录转换为没有时区的时间戳

regexp_split 不支持全局选项

WHERE 的参数不能返回一个集合

最后一个特别令人沮丧,我不知所措,非常感谢任何意见。有一种更简单的方法可以做到这一点,不是吗?谢谢!

最佳答案

试试这个:

create table x(d timestamp);

insert into x values
('jan 2, 2012'),
('february 4, 2012 12:00'),
('jan 4, 2012 12:00'),
('march 1, 2012'),
('may 3, 2012');

查询:

with input as
(
select
'2012-1-2, 2012-01-04 12:00, 2012-02-04 12:00, 2012-03-04 12:00'::text
as d_input
)
,converted_to_array as
(
select ('{' || d_input || '}')::timestamp[] as d_array
from input
)
select d
from x cross join converted_to_array
where d = any(d_array)

输出:

D
January, 02 2012 00:00:00-0800
February, 04 2012 12:00:00-0800
January, 04 2012 12:00:00-0800

现场测试:http://www.sqlfiddle.com/#!1/43d48/26


您也可以使用 IN,只是将数组取消嵌套到行:

with input as
(
select
'2012-1-2, 2012-01-04 12:00, 2012-02-04 12:00, 2012-03-04 12:00'::text
as d_input
)
,converted_to_array as
(
select ('{' || d_input || '}')::timestamp[] as d_array
from input
)
select d
from x cross join converted_to_array
where d in (select unnest(d_array))

现场测试:http://www.sqlfiddle.com/#!1/43d48/29


您也可以将它们全部放在一行中:

select d
from x
where d in (select unnest( ('{' || '2012-1-2, 2012-01-04 12:00, 2012-02-04 12:00, 2012-03-04 12:00'::text || '}')::timestamp[] ))

但我犹豫是否这样做,因为它会导致 stackoverflow 上出现水平滚动条:-)

现场测试:http://www.sqlfiddle.com/#!1/43d48/31

关于sql - 将列表传递给 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com