我的问题实际上看起来很简单,但我找不到办法。
如果数组中的任何元素介于两个值之间,那么查询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
介于20
和30
之间 - 所以我想要Bob
查询
SELECT name from table where ANY(numbers) > 20 AND ANY(numbers) < 30
将返回Alice
和Bob
,显示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的第二个操作数必须是正则表达式。
答案 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