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

时间:2016-06-27 21:37:28

标签: postgresql conditional boundary

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

这个问题的灵感来自一位真正不应该被允许在数据库附近的同事(现在不是这样)

1 个答案:

答案 0 :(得分:1)

当您提取一系列数据时实际发生的事情是PostgreSQL正在针对条目检查该字段的布尔表达式值。如果它满足被认为有效的所有条件,它将被拉动。

PostgreSQL中的示例

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

正如您所看到的,当您为要比较的值设置边界(在语句之间)时,它最终会计算为布尔值。如果要评估多个值,则需要使用多个布尔值进行比较。这意味着您需要决定他们应该如何进行比较。如果它是相同的字段,并且它处于不同的比较中并且至少其中一个需要为真,那么您希望使用 OR 语句来加入两个布尔值将值组合在一起进行单一比较。

报表与范围之间

之间实际上是小于大于的组合,以更方便的方式编写它,这样可以更轻松地查看内容范围值必须被认为是有效的。

可以用以下方式重写之间的语句

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 ),排他性( XOR 1 )或分色( NAND 2 )在单个查询中连接多个表达式。除了 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
;
相关问题