Проверяя работы наших студентов на курсе, мы раз за разом сталкиваемся с одними и теми же ошибками. И сейчас мы расскажем вам об одной из таких ошибок при написании SQL-запросов в PostgreSQL.
✅ Описание проблемы
Мы привыкли, что в математике можно просто разделить одно число на другое и получить результат, даже если нацело числа не делятся — получится десятичная дробь. Однако SQL не всегда работает так, как мы ожидаем…
Например, в PostgreSQL, если вы делите два целых числа, результат будет целым числом, без дробной части:
SELECT a/b FROM demo
# если a и b целые, получаем столбец целых чисел
SELECT 1 / 2
# такое деление вернет 0
Примеры кажутся синтетическими, однако если вы делаете какую-то сложную агрегацию и вычисления с операцией деления, то вы можете даже не заметить эту ошибку, так как получите некий результат. Просто он будет неверным.
Примечание: в большинстве других СУБД, таких как MySQL, подобные запросы вернут десятичные дроби, как и ожидается.
✅ Решение проблемы
Чтобы избежать неоднозначностей при выполнении вычислений, всегда лучше явно указывать преобразование типов. Например:
SELECT a::NUMERIC/b FROM demo
SELECT a*1.0/b FROM demo
SELECT CAST(1 AS FLOAT)/2 FROM demo
Используя любую из этих конструкций, вы приводите числитель (можно знаменатель) к дробному формату, а значит и результатом деления будет дробь.
🛎️ Если вы хотите познакомиться с SQL и узнать ещё больше классных фишек, приходите на наш бесплатный интенсив по SQL с менторской поддержкой! Вы научитесь писать первые SQL-запросы и решать задачи, положите первый проект в портфолио и получите сертификат о прохождении курса.
Записывайтесь, стартуем уже завтра!
📌 Зарегистрироваться на интенсив
📈 Симулейтив | 📱 ВК | 📱 YouTube | 📱 Канал о DS