Как использовать SQL, чтобы один Select использовался, если одно условие, а другой Select, если другое условие - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть таблица 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);

Итак, поскольку дата в столбце DATE в таблице SELECT_ C ниже, чем сегодня, SQL должен запустить SELECT_B

if ((select(max(DATE::TIMESTAMP) from SELECT_C)<current_date) then SELECT_A else SELECT_B

Вы можете помочь?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Пожалуйста, используйте синтаксис Vertica при создании примера Vertica!

И, пожалуйста, прекратите использовать TEXT в качестве типа данных. Это заставляет меня нервничать ...

Я также предлагаю вам прочитать учебник для начинающих SQL. В реляционной базе данных нет ничего иерархического как такового ...

@ Ответ Гордона Линоффа работает. SQL не имеет IF. Это описательный , а не процедурный или объектно-ориентированный язык. Любая логическая оценка для фильтрации данных происходит в условии WHERE. И если условие WHERE безусловно ИСТИНА, возвращаются все строки запроса (или, в нашем случае, ветви рассматриваемого 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 ;
0 голосов
/ 28 апреля 2020

Предполагая, что "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;
...