gpt4 book ai didi

postgresql - 带有 BETWEEN 条件的 postgres ANY()

转载 作者:行者123 更新时间:2023-11-29 11:59:35 25 4
gpt4 key购买 nike

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

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

如果数组的任何元素在两个值之间,如何查询 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 两个元素的数组。

如何在不求助于解决方法的情况下解决这个问题?

问候,

比尔门

编辑:为清楚起见:

我遇到的情况是,我正在通过 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

将返回 AliceBob , 显示 alice 的数字 > 20 以及其他数字 < 30。

在这种情况下不允许使用 BETWEEN 语法,但是 between 无论如何只能在内部映射到 > 20 AND < 30

引用有关 Between Operators 映射到 > 和 < documentation 的文档:

There is no difference between the two respective forms apart from the CPU cycles required to rewrite the first one into the second one internally.

附言:

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

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 的第二个操作数必须是正则表达式。

最佳答案

 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

关于postgresql - 带有 BETWEEN 条件的 postgres ANY(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34328723/

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