如何使用SQL,以便在一个条件下使用一个Select,在另一个条件下使用另一个Select

问题描述 投票:-1回答:2

我有一个表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

您能帮忙吗?

sql vertica
2个回答
0
投票

假设“ 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;

0
投票

[请,请-在创建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 ;

© www.soinside.com 2019 - 2024. All rights reserved.