在单个查询中获取多个日期范围之间的数据



我经常必须从实时数据库中获取数据,其中数据位于产品的两个日期之间。如果我一遍又一遍地为不同的日期范围抓取同一产品的数据,并且必须在excel表格之间来回切换,这是非常单调的。我如何将日期范围组合到单个查询中,以便我的工作量在excel中更轻?

这个问题是由一个同事启发的,他真的不应该被允许接近数据库(现在没有)

实际发生的情况是,当您拉出数据范围时,PostgreSQL会根据该字段的条目检查布尔表达式值。如果它满足所有被认为有效的条件,它将被删除。

在PostgreSQL

中的示例
SELECT
    fields
FROM
    table
WHERE
    (fieldX BETWEEN lower_bounds1 AND upper_bounds1
OR
    fieldX BETWEEN lower_bounds2 AND upper_bounds2)
;

正如您所看到的,当您为要比较的值设置边界(between语句)时,它最终计算为布尔值。当你想计算一个以上的值时,你也需要有多个布尔值来比较。这意味着您需要决定应该如何比较。如果它是相同的字段,并且它在不同的比较中,并且其中至少有一个需要为真,那么您需要使用语句将两个布尔值连接到一个单独的比较中。

BETWEEN语句和范围

Between实际上是小于大于的组合,以一种更方便的方式编写,使得更容易看到值必须在哪个范围内才能被认为是有效的。

between语句可以按照以下方式重写

SELECT
    fields
FROM
    table
WHERE
    fieldX >= lower_bounds
AND
    fieldX <= upper_bounds
;

组合示例

SELECT *
FROM table t
WHERE
    t.field1 = value
AND
    (
        (t.field2 BETWEEN lower1 AND uppper1)
    OR
        (t.field2 BETWEEN lower2 AND uppper2)
    )
;

实际上,这非常接近下面的IF语句

if(exp1 && (exp2 || exp3){
//do things here because it's valid
}

此示例将选择值满足第一个条件的所有行,并在第二个条件中选择两个条件中的任何一个。

为什么它工作

这些概念起作用的原因是由于一种叫做布尔逻辑的东西。这有很多要解释的,但网上有很多人对此有很好的指导。满足这些表达式,你就可以拉出非常复杂的数据集。

其他类型的比较

在PostgreSQL的文档中可以很容易地找到更多的信息,但是WHERE子句实际上只是寻找一个可以计算为真值的表达式。您可以使用连词(AND)、选项(OR)、排他(XOR1)或分隔符(NAND2)在单个查询中连接多个表达式。除了在WHERE子句中嵌套条件外,您还可以创建一些非常复杂的查询来获取所需的数据。


1: XOR实际上不是PostgreSQL的一部分。要使用类似的东西,你需要将多个边界连接在一起,并使用排除符,例如

SELECT
A,
B
FROM
(
VALUES
    (false, false),
    (false, true),
    (true, false),
    (true, true)
)
AS data(A, B)
WHERE
    ( A and not B) or ( not A and B)
;

2: NAND表示NOT AND。它与OR的区别在于,它也会将全假条件计算为true

SELECT
A,
B
FROM
(
VALUES
    (false, false),
    (false, true),
    (true, false),
    (true, true)
)
AS data(A, B)
WHERE
    not A or not B
;

相关内容

  • 没有找到相关文章

最新更新