postgres ANY()与BETWEEN条件

时间:2015-12-17 07:15:19

标签: postgresql

如果有人想知道,我正在回收我自己回答的另一个问题,因为我意识到我的问题与我的想法有着不同的根本原因:

我的问题实际上看起来很简单,但我找不到办法。

如果数组中的任何元素介于两个值之间,那么查询postgres怎么办?

文档指出a BETWEEN b and c等同于a > b and a < c

然而,这不适用于数组,如

ANY({1, 101}) BETWEEN 10 and 20必须 false

ANY({1,101}) > 10 AND ANY({1,101}) < 20必须 true

{1,101}表示包含两个元素1和101的数组。

如何解决这个问题,而无需求助于解决方法?

的问候,

BillDoor

编辑:为清晰起见:

我的方案是,我通过xpath()查询xml文档,但是对于这个问题,包含int []类型数组的列可以完成这项工作。

id::int | numbers::int[]  | name::text
1       | {1,3,200}       | Alice
2       | {21,100}        | Bob

我想要所有名称,其中number介于2030之间 - 所以我想要Bob

查询

SELECT name from table where  ANY(numbers) > 20 AND ANY(numbers) < 30

将返回AliceBob,显示alice有数字&gt; 20以及其他数字&lt; 30。

在这种情况下不允许使用BETWEEN语法,但是只会将它们映射到&gt; 20 AND&lt;内部30反正

引用Between Operators映射到&gt;的文档和&lt; documentation

  

两种形式之间没有区别   将第一个重写为第二个所需的CPU周期   内部。

PS:

为了避免为此添加新问题:我该如何解决

id::int | numbers::int[]  | name::text
1       | {1,3,200}       | Alice
2       | {21,100}        | Alicia

SELECT id FROM table WHERE ANY(name) LIKE 'Alic%'
result: 1, 2

我只能找到将一个值与多个正则表达式匹配的示例,但不能将一个正则表达式与一组值匹配:/。除了显示的语法无效外,ANY必须是第二个操作数,但LIKE的第二个操作数必须是正则表达式。

1 个答案:

答案 0 :(得分:4)

 exists (select * from (select unnest(array[1,101]) x ) q1 where x between 10 and 20 ) 

您可以根据此查询创建一个功能

第二种方法:

 select  int4range(10,20,'[]') @> any(array[1, 101])

表示时间戳和日期:

 select tsrange( '2015-01-01'::timestamp,'2015-05-01'::timestamp,'[]') @> any(array['2015-05-01', '2015-05-02']::timestamp[])

了解更多信息:range operators