SQL CASE Expression - PullRequest
       20

SQL CASE Expression

0 голосов
/ 23 марта 2020

Мне нужно написать оператор sql (Oracle), где я могу извлечь данные из двух таблиц diff, проверить условие и вернуть определенную строку. Мое утверждение выглядит так:

Select review.comments as comments,resort.resortid,resort.resortname 
case review.comments 
when resort.starrating>=4.5 and resort.starrating<5 then 'Excellent'
when resort.strarating>=4 and resort.starrating<4.5 then 'Great'
else 'Good'
end
from review, resort 
order by resort.resortid;

Когда я запускаю это, я получаю сообщение об ошибке: «Ключевое слово FROM не найдено там, где ожидается» и указывает на c в строке 2. и если я изменяю значение с на на в строке 2 выдается ошибка: «SQL команда не завершена должным образом». и указывает на строку 3 r в "case review.comments"

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Требуется JOIN, агрегация и исправление синтаксиса выражения CASE. Я предполагаю, что вы хотите что-то вроде этого:

Select res.resortid, res.resortname, 
       (case when avg(rev.starrating) >= 4.5 then 'Excellent'
             when avg(rev.starrating) >= 4 then 'Great'    
            else 'Good'
        end) as category
from review rev join
     resort res
     on rev.resortid = res.resortid
group by res.resortid, res.resortname 
order by res.resortid;
1 голос
/ 23 марта 2020

Синтаксис для case равен

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

, поэтому ваш код должен выглядеть следующим образом ..

SELECT review.comments AS comments, 
           resort.resortid, 
           resort.resortname, 
           CASE
             WHEN resort.starrating >= 4.5 
                  AND resort.starrating < 5 THEN 'Excellent' 
             WHEN resort.strarating >= 4 
                  AND resort.starrating < 4.5 THEN 'Great' 
             ELSE 'Good' 
           END 

    FROM   review, 
               resort 
           ORDER  BY resort.resortid;

Также просто для вашей информации, запятая между двумя таблицами означает CROSS JOIN.

Таким образом, ваш запрос эквивалентен:

select * from
FROM   review
       CROSS JOIN resort
1 голос
/ 23 марта 2020

Вы смешиваете два варианта синтаксиса case. Если вы собираетесь указывать условия (а не только значения), у вас не должно быть выражения после ключевого слова case:

case -- review.comments should be removed from here
when resort.starrating>=4.5 and resort.starrating<5 then 'Excellent'
when resort.strarating>=4 and resort.starrating<4.5 then 'Great'
else 'Good'
end
...