SQL Как правильно реализовать конструкцию IF ELSE?

IF ((SELECT since FROM temp_table) IS NULL) 
THEN (SELECT 1) 
ELSE (SELECT 2)

Если в строке значение since IS NULL, то нужно посчитать максимум pdate для каждого cid, иначе нужно посчитать максимум since для каждого cid. Сейчас по отдельности запросы отрабатывают как надо, но если для одного cid в разных строках таблицы срабатывает условия since IS NULL, GETDATE() between since and upto. Тогда в обе таблицы попадает cid, а должно только в таблицу со 2 условием. Как лучше реализовать?

SELECT 1

SELECT 
    cid,
    max(pdate) AS pdate 

INTO dbo.temp_table_max_pdate_not_open_retail

FROM 
    temp_table

WHERE 
    since IS NULL 

GROUP BY 
    cid
END

SELECT 2

SELECT 
    cid, 
    max(since) AS since

INTO 
    dbo.temp_table_max_open_retail

FROM 
    temp_table

WHERE 
    GETDATE() between since and upto 
    
GROUP BY cid
END

Ответы (2 шт):

Автор решения: Aziz Umarov

Посмотрите на функцию Exists в sql server

IF Exists(
    SELECT 
      since 
    FROM temp_table)   
BEGIN
   SELECT 
    cid, 
    max(since) AS since

  INTO 
    dbo.temp_table_max_open_retail

  FROM 
    temp_table    
  WHERE 
    GETDATE() between since and upto         
  GROUP BY cid;

 SELECT * FROM dbo.temp_table_max_open_retail;
END
ELSE
BEGIN
   SELECT 
    cid,
    max(pdate) AS pdate 

   INTO dbo.temp_table_max_pdate_not_open_retail

   FROM 
     temp_table

   WHERE 
    since IS NULL     

   GROUP BY 
    cid
 
  SELECT * FROM dbo.temp_table_max_pdate_not_open_retail;
END
→ Ссылка
Автор решения: Олег
  • В условии IF у вас просто проверка на наличие записей в целом в таблице temp_table если хоть одна запись есть то значение select cid from temp_table уже не будет = null

  • правильно ли я понимаю, что в зависимости от значение поля since в каждой строке таблицы temp_table вы хотите применить два разных вычисления?

если да, то я бы остановился на курсоре, хотя, возможно, специлаисты подскажут более эффективную маханику.

И akina прав - у вас в двух наборах два разных поля с виичинами (мах) - обратите внимание при обработке результатов т.к. фактически это разные велиины и в одно поле их группировать не следует. возможно лушче будет потом сделать выборку из этих двух таблиц и раскинуть на три поля. в таком случае можно сделать что-то типа select table1.field1, table1.field2, '' as field3 from table 1 union select table2.field1, '' as field2, '' as table2.field3 from table 2 where field1 not in (select field1 from table1) такая конструкция примерно

→ Ссылка