当前位置: 首页 > 面试题库 >

将列表传递给where子句

西门建安
2023-03-14
问题内容

我正在尝试从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-0412: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



 类似资料:
  • 问题内容: 给定一个ID数组,我想拥有一个SQL查询,该查询使用WHERE子句中的数组值,例如: 如何生成此查询字符串以用于MySQL? 问题答案: 谨防! 该答案包含一个严重的SQL注入漏洞。在未确保清除任何外部输入的情况下,请勿使用此处介绍的代码示例。

  • 问题内容: 我通过执行查询得到。这必须传递给 IN 子句值的另一个查询。如何通过 HQL ? 我们可以转换到并且可以通过它,这不是一个问题。 最后,我必须将列表以或或形式传递给 IN 子句。 问题答案: 要么

  • 问题内容: 使用Python的DB API规范,您可以将参数的参数传递给execute()方法。我的语句的一部分是WHERE IN子句,并且我一直在使用元组填充IN。例如: 但是,当我遇到参数元组只是1个项目的元组的情况时,执行将失败。 编程错误:错误:“)”或附近的语法错误。第 13行:ID为(3,)的WHERE 我怎样才能使元组正确地使用子句? 问题答案: 编辑:请,正如@rspeer在评论中

  • 问题内容: 我想按值将列表传递给函数。默认情况下,列表和其他复杂对象通过引用传递给函数。这是一些目标: 可以写得短些吗?换句话说,我不想更改 ad 。 问题答案: 您可以使用,但是对于包含列表(或其他可变对象)的列表,您应该使用: 等价于或,并返回列表的浅表副本。 何时使用:

  • 有没有比传递分隔字符串并稍后解析它更优雅的方法来传递可选的整数列表到?我也有一个位置论点。 不工作,因为试图获取并抱怨它不是整数。 理想情况下,我想与其中一个执行 或者类似的东西,但也能

  • 我正在从 JRBeanCollectionDataSource 生成报告。此报告是关于客户的订单的。 这是我的代码 当客户时,需要生成包含客户详细信息和客户订单列表的报告。由于接受一个集合,这就是我所做的。 如何提取< code>Customer中的< code>CustomerOrder列表并将其作为子报表传递?