我经常必须从实时数据库中获取数据,其中数据位于产品的两个日期之间。如果我一遍又一遍地为不同的日期范围抓取同一产品的数据,并且必须在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
;