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

Я пытаюсь понять и переписать запрос. Стиль SQL - это то, что я не могу понять. Ниже приведен запрос:

SELECT wc1.id AS category_id, wc1.name AS category_name,
        if(wc3.parent_id is not null, wc4.name, 
           if(wc2.parent_id is not null, wc3.name, 
              if(wc1.parent_id is not null, wc2.name, wc1.name))) as ultimate_parent
    FROM CATEGORIES wc1
    LEFT JOIN categories wc2 ON wc1.parent_id = wc2.id
    LEFT JOIN categories wc3 ON wc2.parent_id = wc3.id
    LEFT JOIN categories wc4 ON wc3.parent_id = wc4.id;

Я не могу понять IF, IF, IF, часть запроса. Этот запрос также дает мне ошибки, когда я запускаю его в Dbeaver - снежинка. Это первый раз, когда я вижу этот тип условий IF. И объяснение и помощь в переписывании запроса. Данные представляют собой простую таблицу отношений родитель-потомок.

Я пытаюсь сделать следующее:

SELECT wc1.id AS category_id, wc1.name AS category_name,
        if wc3.parent_id is not null then wc4.name, 
           if wc2.parent_id is not null then wc3.name, 
              else wc1.parent_id is not null Then wc2.name, wc1.name as ultimate_parent -- I am having issues with splitting the last if clause
    FROM CATEGORIES wc1
    LEFT JOIN categories wc2 ON wc1.parent_id = wc2.id
    LEFT JOIN categories wc3 ON wc2.parent_id = wc3.id
    LEFT JOIN categories wc4 ON wc3.parent_id = wc4.id;

1 Ответ

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

Используйте выражение case:

SELECT wc1.id AS category_id, wc1.name AS category_name,
       (case when wc3.parent_id is not null then wc4.name 
             when wc2.parent_id is not null then wc3.name 
             when wc1.parent_id is not null then wc2.name
             else wc1.name
        end) as ultimate_parent
FROM CATEGORIES wc1 LEFT JOIN
     categories wc2 ON wc1.parent_id = wc2.id LEFT JOIN
     categories wc3 ON wc2.parent_id = wc3.id LEFT JOIN
     categories wc4 ON wc3.parent_id = wc4.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...