我有一个表A,该表是在我使用SELECT_A代码时创建的,而表B是与SELECT_B代码一起使用的。另外,我有表C,其中的一列是DATE。我想创建一个查询,以便如果表C中的最大(最新)日期(例如,它在表SELECT_C中)小于今天,那么SQL运行SELECT_A查询,否则运行SELECT_B查询。
但是,我不知道这在技术上是怎么可能的。我当时正在考虑使用这种方法,但是它没有用:
CREATE temp TABLE SELECT_A (DATE TEXT, PRICE INTEGER);
INSERT INTO SELECT_A VALUES
('2019-04-27 01:00', 1), ('2019-04-27 02:30', 3), ('2019-04-27 18:00',2),
CREATE temp TABLE SELECT_B (DATE TEXT, PRICE INTEGER);
INSERT INTO SELECT_B VALUES
('2019-05-02 21:00', 6);
CREATE temp TABLE SELECT_C (DATE TEXT, PRICE INTEGER);
INSERT INTO SELECT_C VALUES
('2020-05-02', 55555);
因此,由于表SELECT_C中DATE列中的日期比今天短,因此SQL应该运行SELECT_B
if ((select(max(DATE::TIMESTAMP) from SELECT_C)<current_date) then SELECT_A else SELECT_B
您能帮忙吗?
假设“ a”和“ b”具有相同的列,则可以使用union all
:
select a.*
from table_a a
where (select max(c.date) from table_c) < current_date
union all
select b.*
from table_b b
where (select max(c.date) from table_c) >= current_date;
[请,请-在创建Vertica示例时使用Vertica语法!
并且请停止使用TEXT作为数据类型。这让我感到紧张...
我还建议您阅读初学者的SQL教程。关系数据库本身没有层次结构。...
@@ Gordon Linoff的答案起作用。 SQL没有IF。它是一种[[descriptive,而不是面向过程或面向对象的语言。任何用于过滤数据的布尔值运算都在WHERE条件下发生。并且,如果WHERE条件无条件为TRUE,则返回查询的所有行(或在我们的情况下为所讨论的UNION SELECT分支的行)。
[我只是无耻地利用了select_c
是single_row表,其中@Gordon Linoff比我更小心。 1 WITH
2 select_a (dt, price) AS (
3 SELECT TIMESTAMP '2019-04-27 01:00', 1
4 UNION ALL SELECT TIMESTAMP '2019-04-27 02:30', 3
5 UNION ALL SELECT TIMESTAMP '2019-04-27 18:00', 2
6 )
7 ,
8 select_b (dt, price) AS (
9 SELECT TIMESTAMP '2019-05-02 21:00', 6
10 )
11 ,
12 select_c (dt, price) AS (
13 SELECT DATE '2020-05-02', 55555
14 )
15 SELECT
16 a.*
17 FROM select_a a CROSS JOIN select_c c
18 WHERE c.dt < CURRENT_DATE
19 UNION ALL SELECT
20 b.*
21 FROM select_b b CROSS JOIN select_c c
22 WHERE c.dt >= CURRENT_DATE
23 ;