@LakeForest

Почему SELECT CASE WHEN возвращает только первое значение?

Подскажите, пожалуйста, что не так? Переводит на русский только первое значение - остальные пропускает.
И получится же сгруппировать по week, написав `GROUP BY created_date;`? ибо week не принимает...

SELECT
    AVG(value) AS avg_value,
    CASE LOWER(TO_CHAR(created_date, 'Day'))
        WHEN 'monday' THEN 'Понедельник'
        WHEN 'tuesday' THEN 'Вторник'
        WHEN 'wednesday' THEN 'Среда'
        WHEN 'thursday' THEN 'Четверг'
        WHEN 'friday' THEN 'Пятница'
        WHEN 'saturday' THEN 'Суббота'
        WHEN 'sunday' THEN 'Воскресенье'
    END week
FROM results
GROUP BY created_date;
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
А вот если заглянуть в документацию...
Day full capitalized day name (blank-padded to 9 chars)

Действительно непонятно, почему же так срабатывает сравнение двух разных строк
'monday' = 'monday '

Что попросили у to_char - то вполне ожидаемо и получили. При том, в чём вообще смысл получать название дня недели, а не его номер? А вдруг Day окажется locale-specific штукой?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
idShura
@idShura
SELECT
    AVG(value) AS avg_value,
    CASE WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'monday' THEN 'Понедельник'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'tuesday' THEN 'Вторник'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'wednesday' THEN 'Среда'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'thursday' THEN 'Четверг'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'friday' THEN 'Пятница'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'saturday' THEN 'Суббота'
         WHEN  LOWER(TO_CHAR(created_date, 'Day')) = 'sunday' THEN 'Воскресенье'
    END week
FROM results
GROUP BY created_date;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы