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

How to use SQL so the one Select is used if one condition and another Select if another condition

我有一个 table A,它是在我使用 SELECT_A 代码和 Table B 时创建的,它与 SELECT_B 代码一起使用。此外,我还有 table C,其中一列是 DATE。 我想创建一个查询,以便如果 Table C 中的最大(最新)日期(假设它在 table SELECT_C 中)低于今天,那么 SQL 运行s SELECT_A query else SELECT_B query.

但是,我不知道它在技术上如何可能。我想用这个方法,但是没有用:


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);

因此,由于 table 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。它是一种描述性,而不是一种过程或面向对象的语言。任何过滤数据的布尔计算都发生在 WHERE 条件中。如果 WHERE 条件无条件为真,则返回查询的所有行(或者,在我们的例子中,有问题的 UNION SELECT 的分支)。

我只是无耻地利用 select_c 是 single_row table,@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 ;