Как заменить подвыбор соединением в операторе case в SQL? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть SQL-запрос с оператором case.Оператор case имеет подзапрос.Я хочу заменить (удалить) подвыбор с объединением.Это возможно?Как я могу это сделать?

Запрос:

SELECT tablex.Abnumber, CASE WHEN Abdate is not null AND isnull(Abnumber,0) > 1 AND Abdate < (SELECT Abdate FROM t_tablex WHERE Annumber = @Annumber AND Abnumber= @Abnumber-1) THEN 'bla bla' ELSE '' END
FROM t_tablex AS tablex
WHERE (@Annumber IS NULL OR tablex.Annumber= @Annumber)
  AND (@AbnumberIS NULL OR tablex.Abnumber= @Abnumber)

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Я подозреваю, что LAG() делает то, что вы хотите:

SELECT x.Abnumber,
       (CASE WHEN x.Abdate is not null AND  
                  x.Abnumber > 1 AND
                  x.Abdate < prev_Abdate
             THEN 'bla bla'
             ELSE '' 
        END)
FROM (SELECT x.*, 
             LAG(Abdate) OVER (PARTITION BY Annumber ORDER BY Abnumber) as prev_Abdate)
      FROM t_tablex x
     ) x
WHERE (@Annumber IS NULL OR x.Annumber= @Annumber) AND
      (@Abnumber IS NULL OR x.Abnumber = @Abnumber);

Это не точно эквивалентно вашему запросу, если только не сделаны некоторые предположения относительно данных.Тем не менее, я подозреваю, что это именно то, что вы намерены.

0 голосов
/ 18 апреля 2019

Спасибо за ответы. Я попробовал некоторые вещи и нашел следующие решения:

Решение 1 (заменить подвыбор внутренним соединением):

SELECT tablex.Abnumber, 
    CASE WHEN tablex.Abdate is not null 
        AND isnull(tablex.Abnumber,0) > 1 
        AND tablex.Abdate < tablex2.Abdate 
    THEN 'bla bla' 
    ELSE '' END 
FROM t_tablex AS tablex
INNER JOIN t_tablex as tablex2
    ON tablex.Annumber = tablex2.Annumber
    AND tablex.Abnumber = tablex2.Abnumber + 1 
WHERE tablex.Annumber = ISNULL( @Annumber, tablex.Annumber)
AND tablex.Abnumber = ISNULL( @Abnumber, tablex.Abnumber)

Решение 2 (с LAG ()):

SELECT base.*
FROM ( 
    SELECT tablex.Abnumber, 
        CASE WHEN tablex.Abdate is not null 
            AND tablex.Abnumber > 1 
            AND tablex.Abdate < LAG( tablex.Abdate, 1 ) OVER ( PARTITION BY tablex.Annumber ORDER BY tablex.Abnumber) 
        THEN 'bla bla' 
        ELSE '' END AS ERG
    FROM t_tablex AS tablex
    WHERE tablex.Annumber = ISNULL( @Annumber, tablex.Annumber )
    AND tablex.Abnumber BETWEEN ISNULL( @Abnumber , tablex.Abnumber) - 1 
    AND ISNULL( @Abnumber, tablex.Abnumber )
    ) base
WHERE
base.Abnumber = ISNULL( @Abnumber, base.Abnumber )

0 голосов
/ 16 апреля 2019
SELECT tablex.Abnumber, 
        CASE WHEN  isnull(Abnumber,0) > 1 AND Abdate < a.Abdate THEN 'bla bla' ELSE '' END  
FROM t_tablex AS tablex 
LEFT JOIN (SELECT Abdate 
           FROM  t_tablex
           WHERE Annumber = @Annumber AND Abnumber= @Abnumber-1
) A ON A.Annumber = tablex.Annumber AND a.Abnumber = tablex.Abnumber
 WHERE tablex.Annumber= @Annumber 
AND  tablex.Abnumber= @Abnumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...