loading..
Русский    English
09:09
листать

Целочисленное деление

Иногда недоумение у начинающих работать с  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server вызывают результаты подобных запросов:

Консоль
Выполнить
  1. SELECT 1/3 AS a, 5/3 AS b;

Одни (подозреваю, что это пользователи MySQL или Oracle) ожидают результаты типа

a      b
0.3333 1.6667
т.е. вещественное число, другие - 

a      b
0      2
т.е. округления к ближайшему целому. В то время как SQL Server дает

a       b
0    1

Чтобы развеять это недоумение, скажу, что операция "/" просто обозначает целочисленное деление (а именно, дает в результате неполное частное), если операнды являются целыми числами. Т.е. отдельного обозначения для этой операции нет, и используется символ "обычного" деления. Если же вы хотите получить десятичное число, то нужно привести хотя бы один операнд к вещественному типу явно (первый столбец) или неявно (второй столбец):

Консоль
Выполнить
  1. SELECT CAST(1 AS DEC(12,4))/3 AS a, 5./3 AS b;

a        b
0.333333    1.666666

Операция получения остатка от деления в SQL Server обозначается "%":

Консоль
Выполнить
  1. SELECT 1 % 3 AS a, 5 % 3 AS b;

a    b
1    2

Теперь что касается некоторых других СУБД.

PostgreSQL ведет себя аналогично SQL Server.

В MySQL для получения неполного частного используется специальный оператор DIV:

  1. SELECT 1 DIV 3 AS a, 5 DIV 3 AS b;

Остаток от деления можно также получить в стиле а-ля Паскаль:

  1. SELECT 1 MOD 3 AS a, 5 MOD 3 AS b;

Хотя будет работать и "общепринятое"

  1. SELECT 1 % 3 AS a, 5 % 3 AS b;

В Oracle вообще нет операции для получения неполного частного, поэтому результат деления

  1. SELECT 1/3 AS a, 5/3 AS b FROM dual;

a    b
.333333333333333    1.66666666666667
потребуется вручную приводить к целому типу с желаемым результатом, например, так:

  1. SELECT CEIL(1/3) AS a, CEIL(5/3) AS b FROM dual;

a    b
1    2
или так

  1. SELECT FLOOR(1/3) AS a, FLOOR(5/3) AS b FROM dual;

a    b
0   

Для получения остатка от деления в Oracle используется функция MOD:

  1. SELECT MOD(1,3) AS a, MOD(5,3) AS b FROM dual;

Наконец, если делитель равен нулю:

Консоль
Выполнить
  1. SELECT 1/0 AS a;
то MySQL возвращает NULL, в то время как другие рассматриваемые здесь СУБД дают ошибку деления на ноль.

Рекомендуемые упражнения: 137

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
вчера
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100