代码之家  ›  专栏  ›  技术社区  ›  ironsand

如何在postgres中使用数组列的between条件?

  •  1
  • ironsand  · 技术社区  · 5 年前

    我有一个 multiple_dates Postgres数据库中的列。
    为了在某个特定日期之前找到我这样写的:

    SELECT * FROM companies
    WHERE  '2019-06-30' = ANY (multiple_dates)
    

    但我想通过使用 BETWEEN 这样的条款:

    SELECT * FROM companies
    WHERE  (ANY (multiple_dates) BETWEEN '2019-06-01' AND '2019-06-30')  -- pseudo-code
    

    这个sql不起作用。我怎么用 ANY 之间 同时条款?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Erwin Brandstetter    5 年前

    “问题”在于 ANY construct 作品 算子 ,不适用于其他 建构 -和 BETWEEN 是另一个 建造 .

    相关:

    有一个 容易解决 不过,为了这个。构建一个 daterange 从给定的边界使用 contains operator @> .

    相关:

    那么查询可以是:

    SELECT *
    FROM   companies
    WHERE  daterange('2019-06-01', '2019-06-30', '[]') @> ANY (multiple_dates)
    

    注意第三个论点 '[]' 包容的 之间 .


    替代方案: 规范化架构。创建一个n:1表,如下所示:

    CREATE TABLE company_date
       company_id  int NOT NULL REFERENCES companies
     , single_date date NOT NULL
     , PRIMARY KEY (company_id, single_date)
    );
    

    在上添加索引 (single_date, company_id) 也。见:

    那么您的查询可以是:

    SELECT c.*
    FROM   companies c
    WHERE  EXISTS (
       SELECT FROM company_date cd
       WHERE  single_date BETWEEN '2019-06-01' AND '2019-06-30'
       AND    cd.company_id = c.company_id
       );
    

    占用更多的磁盘空间,更详细的查询,但对于大型表和更通用的更快。