如何使用 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 ;
我有一个 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 ;