如何将数组转换为类型?

时间:2015-02-03 18:21:50

标签: sql arrays postgresql casting sql-in

我希望此查询返回查询#2未返回的所有ID和关联的电子邮件:

select my_table.id, my_table.email
from my_table join another_table on my_table.id=another_table.mytable_id
where my_table.id not in (select array (select my_table.id 
             from my_table join yetanother_table 
             on my_table.id = yetanother_table.mytable_id 
             where yetanother_table.time1 between '2015-01-26T08:00:00.000Z'
                                              and '2015-02-02T07:59:59.999Z'
             group by my_table.id))

当我运行它时,我在第3行的选择附近出现以下错误:

operator does not exist: integer = integer[]   
You might need to add explicit type casts.

我尝试将数组转换为整数并得到了这个:

cannot cast type integer[] to integer

我还尝试将my_table.id和数组都投射到varchar。这摆脱了错误,但返回的行数少于我的预期!

第一个问题:为什么我不能将integer[]投射到integer?数组的默认数据类型是什么?除了将my_table.id和数组同时转换为varchar之外,是否有更清晰的方法来摆脱“运算符不存在”错误?

跟进:现在我想知道为什么我的行数太少了。它看起来像我写的方式会返回我想要的吗?即查询#2未返回的所有ID?

另一个限制 - 我需要用一个语句来做所有事情。

2 个答案:

答案 0 :(得分:1)

删除错放的array constructor后,您会收到有效的查询 INNOT IN构造要求右边的普通子查询产生匹配类型 - 数组。

但查询仍然是扭曲和低效的。改为使用:

select m.id, m.email
from   my_table m
join   another_table a on a.mytable_id = m.id
left   join yetanother_table y on y.mytable_id = m.id
                              and y.time1 >= '2015-01-26 08:00'
                              and y.time1 <  '2015-02-02 08:00'
where  y.mytable_id IS NULL;

更多信息:

答案 1 :(得分:0)

你需要摆脱select arrayIN运算符正在查找单个列查询结果,而不是数组。