如果有人想知道,我正在循环使用我自己回答的另一个问题,因为我意识到我的问题的根本原因与我想象的不同:
我的问题实际上看起来很简单,但我找不到方法。
如果数组的任何元素在两个值之间,如何查询 postgres?
该文档指出a BETWEEN b and c
相当于a > b and a < c
然而,这不适用于数组,因为
ANY({1, 101}) BETWEEN 10 and 20
必须false
while
ANY({1,101}) > 10 AND ANY({1,101}) < 20
必须true.
{1,101} 表示包含两个元素 1 和 101 的数组。
我怎样才能解决这个问题,而不诉诸解决方法?
regards,
BillDoor
编辑:为了清楚起见:
我遇到的情况是,我通过 xpath() 查询 xml 文档,但对于这个问题,包含 int[] 类型数组的列可以完成这项工作。
id::int | numbers::int[] | name::text
1 | {1,3,200} | Alice
2 | {21,100} | Bob
我想要所有的名字,其中有number
那是之间20
and 30
-所以我想要Bob
查询
SELECT name from table where ANY(numbers) > 20 AND ANY(numbers) < 30
将返回Alice
and Bob
,显示 alice 有大于 20 的数字以及小于 30 的其他数字。
在这种情况下不允许使用 BETWEEN 语法,但是 Between 无论如何都只能在内部映射到 > 20 AND
引用关于 Between Operators 映射到 > 和 文档:
除了形式不同之外,两种形式之间没有区别
将第一个重写为第二个所需的 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 的第二个操作数必须是正则表达式。