Деление целых чисел в PostgreSQL Когда мы делим одно целое чи | IT Resume
Деление целых чисел в PostgreSQL
Когда мы делим одно целое число на другое, мы всегда ожидаем увидеть правильный результат - даже если он дробный. Однако, в PostgreSQL это работает не так.
Простой пример:
select 1/2
# 0
В чем подвох?
Все очень просто - по умолчанию, в PostgreSQL деление целых чисел друг на друга дает также целое число:
select pg_typeof(1/2)
# integer
А в реальности это встречается?
Если говорить про практическую составляющую - это может негативно сказаться при расчете маржинальности, например:
select revenue/cost
# 0
Здесь и доход (revenue), и розничная цена (cost) представлены целыми числами, а маржинальность предполагается менее 100%.
Как быть?
Что делать и как избежать этой неприятной ошибки?
Очень просто - достаточно преобразовать числитель или знаменатель к дробному числу. Вот несколько способов:
* Умножить на дробное число (например, 1.0)
* Выполнить явное преобразование типов с помощью cast
* Выполнить преобразование типов с помощью ::
select 1*1.0/2
# 0.5
select cast(1 as numeric)/2
# 0.5
select 1::numeric/2
# 0.5
Мы обычно используем первый или третий варианты, т.к. второй просто объемней.
- - - - -
Еще больше фишечек вы узнаете в нашем Симуляторе по SQL https://vk.cc/cfT9wd