sql - 检查列表中的每个数字是否与 int4range[] 中的范围匹配

标签 sql arrays postgresql range postgresql-9.2

我有一个字段:ages pg_catalog.int4range[][][]
示例值为 {"[0,6)","[8,10)"}这意味着 2 个范围 0-6 和 8-10。
如何向 WHERE 子句添加正确的条件以进行检查:

  • 9和3拟合示例值
  • 9 和 9 不适合(每个范围应该只有一个值)

类似于 WHERE ages <@ ARRAY[9,3] , WHERE ages <@ ARRAY[9,9]

更新
该逻辑描述了应用 child 年龄规则的契约(Contract)条件。我认为将所有数据保存在一个字段中并避免检查和比较的多个阶段是有吸引力的 - 只是为了交叉值和范围。
范围的数量通常是可变的,可以是 1、2、3、4 等。检查的值被计算并仅应用于匹配的范围数量 - 如果 3 个年龄,则只有内部具有 3 个范围的数组。

最佳答案

阐明问题

你的问题显示一个一维数组。所以使用适当的列定义:

ages int4range[]

除了令人困惑之外,它没有任何区别。我引用章节Declaration of Array Types来自手册:

The current implementation does not enforce the declared number of dimensions either. Arrays of a particular element type are all considered to be of the same type, regardless of size or number of dimensions. So, declaring the array size or number of dimensions in CREATE TABLE is simply documentation; it does not affect run-time behavior.

此外,问题本身是模棱两可的。例如:

INSERT INTO tbl(ages) VALUES ('{"[0,6)","[5,9)","[8,10)"}')

测试:'{5,8,7}'::int[] .

如果按顺序应用,检查失败:
5适合第一个范围 [0,6) .
8适合第二个范围 [5,9) .
7不适合第三个范围[8,10) .

但是,应用顺序不同5,7,8 ,检查成功。你需要

  1. 要么保证不重叠的间隔。
  2. 或按定义的顺序应用检查。
  3. 阐明两边的元素数量始终匹配。

最后,编辑关于您要对问题执行的操作的解释。不要在评论中隐藏重要信息。

回答

根据评论,假设 1.、2. 和 3. 来自上面的目录。 此查询测试所有 ages ( array of int4range ) 来自 tbl它们是否适合提供的 age_list ( int[] ):

WITH tbl(id, ages) AS (
   VALUES
     (1, '{"[0,2)","[4,6)","[8,10)"}'::int4range[])
    ,(2, '{"[2,4)","[6,8)","[9,10)"}')
   )                                    -- stand-in for table
SELECT id, bool_and(i <@ r) AS passes_test
FROM  (
   SELECT id
         ,unnest('{1,5,9}'::int[]) AS i -- supply age_list here
         ,unnest(ages)             AS r
   FROM tbl
   ) AS sub
GROUP  BY 1

返回:

 id | passes_test
----+------------
  1 | t
  2 | f

要点

  • CTE tbl只是您 table 的替代品。如果tbl,您可以删除它确实存在。

  • 两个 unnest() 函数并排解除两个数组的嵌套。我添加 id (任何唯一列)来标识行。

  • 检查每个元素是否包含在 <@ operator 的范围内并重新聚合 bool_and .返回TRUE当且仅当所有检查都是 TRUE .

关于sql - 检查列表中的每个数字是否与 int4range[] 中的范围匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665109/

相关文章:

sql - 如何检索用户输入的特定合作伙伴 ID 的电子邮件并将其发送回 Controller 。

javascript - 如何一次显示所有回调结果(格式化)

java - postgresql(set role user)命令在SSM项目中如何使用?

mysql - 将多条sql更新语句合二为一

sql - postgresql - 将字符串转换为时间

c# - Oracle/SQL 命令仅显示条件发生更改的行

arrays - 在 UITableview swift 中使用两个数组

arrays - 从 mongodb 中的数组中按名称删除一个元素

sql - 我可以在逻辑复制中使用 .pgpass 吗?

postgresql - 为 IDatabaseConnection (HSQLDB) 设置数据库配置属性时出错