powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Глюк не глюк с Postgres
3 сообщений из 3, страница 1 из 1
Глюк не глюк с Postgres
    #40016643
vadim_maklakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, всем привет!
Заметил тут любопытную вещь
Итого изучаю самостостоятельно SQL по книжке Alan Beaulieu Learning SQL 3edition
Не планирую быть DBA, смотрю в сторону DS которым нужен SQL для извлечения данных с их последующей обработкой.
Поставил на Linux из репо постгресса 12 версию, потом она проапгрейдилась до 13, но на 13 версию базу не перетаскивал, база сама крутится под 12.4
вот данные по версии сервера
===========================
postgres@debian:/home/mvg$ psql
psql (13.0 (Debian 13.0-1.pgdg100+1), server 12.4 (Debian 12.4-1.pgdg100+1))
Type "help" for help.
===========================
поставил dvdrental и набиваю руку на запросах через DBeaver плагин Eclipse
Заметил один не обычный баг (или не баг)
Глава 11, оператор CASE, раздел Case Expression Examples

Оригинал запроса на MySQL
авторSELECT
monthname(rental_date) rental_month, count(*) num_rentals
FROM
rental
WHERE rental_date BETWEEN '2005-05-01' AND '2005-08-01' GROUP BY monthname(rental_date);


Переводим в Postgres меняя monthname(rental_date) -> TO_CHAR(rental_date, 'Month' )

авторSELECT
TO_CHAR(rental_date, 'Month' ) AS "Month", COUNT(*) AS num_rentals
FROM
rental AS r
WHERE
rental_date BETWEEN '2005-05-01' AND '2005-08-01'
GROUP BY "Month";
Запускаем запрос, выдает все как в книжке

автор Month | num_rentals
------------+-------------
June | 2311
May | 1156
July | 6709

Далее автор хочет показать как можно транспонировать вывод выше при помощи CASE, по образцу и подобию ранее конвертим monthname(rental_date) -> TO_CHAR(rental_date, 'Month' )
авторSELECT
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Month') = 'May' THEN 1
ELSE 0
END
) AS May_rentals,
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Month') = 'June' THEN 1
ELSE 0
END
) AS June_rentals,
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Month') = 'July' THEN 1
ELSE 0
END
) AS July_rentals
FROM rental AS r
WHERE rental_date BETWEEN '2005-05-01' AND '2005-08-01';

Вывод почему то нулевой без ошибок

авторmay_rentals | june_rentals| july_rentals
-----------------------------------------------------
0 | 0 | 0


берем и меняем TO_CHAR(rental_date, 'Month') -> TO_CHAR(rental_date, 'Mon')
правим запрос
авторSELECT
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Mon') = 'May' THEN 1
ELSE 0
END
) AS May_rentals,
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Mon') = 'Jun' THEN 1
ELSE 0
END
) AS June_rentals,
SUM (
CASE
WHEN TO_CHAR(rental_date, 'Mon') = 'Jul' THEN 1
ELSE 0
END
) AS July_rentals
FROM rental AS r
WHERE rental_date BETWEEN '2005-05-01' AND '2005-08-01';
Вывод абсолютно другой, правильный вывод
авторmay_rentals | june_rentals | july_rentals
-----------------------------------------------------
1 156 | 2 311 | 6 709

Так что будьте бдительны...Может кому то будет полезно
...
Рейтинг: 0 / 0
Глюк не глюк с Postgres
    #40016650
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadim_maklakov, TO_CHAR(rental_date, 'Month') возвращает строку длиной 9 символов. Более короткие значения дополнены справа пробелами. То есть требуется либо усечь левое значение TRIM(TO_CHAR(rental_date, 'Month')), либо дополнить правое пробелами до 9 сиволов
...
Рейтинг: 0 / 0
Глюк не глюк с Postgres
    #40016668
vadim_maklakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий, большое спасибо за подсказку...
Просто когда-то прогонял этот запрос на MySQL 8 - все работало без проблем, и в мозгу так и отложилось что должно работать без проблем
Век живи - век учись и читай мануалы
Модераторы, плиз переименуйте тему в использование TRIM с TO_CHAR или снесите если никому она больше не интересна

авторSELECT
SUM (
CASE
WHEN TRIM(TO_CHAR(rental_date, 'Month')) = 'May' THEN 1
ELSE 0
END
) AS May_rentals,
SUM (
CASE
WHEN TRIM (TO_CHAR(rental_date, 'Month')) = 'June' THEN 1
ELSE 0
END
) AS June_rentals,
SUM (
CASE
WHEN TRIM(TO_CHAR(rental_date, 'Month')) = 'July' THEN 1
ELSE 0
END
) AS July_rentals
FROM rental AS r
WHERE rental_date BETWEEN '2005-05-01' AND '2005-08-01';

Вывод сейчас правильный
may_rentals | june_rentals | july_rentals
-----------------------------------------------------
1 156 | 2 311 | 6 709
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Глюк не глюк с Postgres
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]