【问题标题】:How to use SQL so the one Select is used if one condition and another Select if another condition如何使用 SQL,以便在一个条件下使用一个 Select,如果另一个条件则使用另一个 Select
【发布时间】:2020-04-28 12:51:27
【问题描述】:

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

你能帮忙吗?

【问题讨论】:

  • 您的问题对读者来说不是很清楚。你能添加几行样本数据和预期的结果吗?否则我可以看到您的问题已关闭。
  • @TheImpaler 谢谢,我添加了进一步的描述。

标签: sql vertica


【解决方案1】:

请,请 - 在创建 Vertica 示例时使用 Vertica 语法!

请停止使用 TEXT 作为数据类型。这让我很紧张......

我还建议您阅读初学者的 SQL 教程。关系数据库中没有层次结构本身......

@Gordon Linoff 的回答有效。 SQL 没有 IF。它是一种描述性,而不是过程或面向对象的语言。过滤数据的任何布尔评估都发生在 WHERE 条件中。如果 WHERE 条件无条件为 TRUE,则返回查询的所有行(或者,在我们的例子中,相关 UNION SELECT 的分支的行)。

我只是无耻地利用select_c 是一个单行表,@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 ;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,此查询同时包含表 A 和 B。但是行 where ``` (select max(c.date) from table_c) >= current_date ``` 无助于为 B 选择行。我认为这里应该是一种 If 语句,一种层次结构/树。跨度>
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2013-04-04
    • 2021-11-20
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多