Pull to refresh

Comments 11

Есть небольшие различия в использовании CAST и CONVERT. Например, CAST обрезает FLOAT до двух знаков после запятой, тогда как при использовании CONVERT можно указать кол-во знаков после запятой.
Нет, функции CONVERT и CAST ведут себя аналогично, в этом можно убедиться выполнив простой тест:

SELECT
  ID,
  CAST(ID AS float) Col1, -- float
  CONVERT(float,ID) Col2, -- float

  CAST(ID AS float)/100 Col3, -- float
  CONVERT(float,ID)/100. Col4, -- float

  ID*1. Col5, -- numeric(12, 0) - 0 знаков после запятой
  ID*1.0 Col6, -- numeric(13, 1) - 1 знак
  ID*1.00 Col7, -- numeric(14, 2) - 2 знака

  ID*1./100 Col8, -- numeric(18, 6)
  
  ID/1. Col9 -- numeric(16, 6)
INTO _TestType -- посмотрите на столбцы этой таблицы
FROM Employees


А если мы используем (/1.) то идет неявное преобразование в тип numeric(16, 6) – оттуда и взялись шесть цифр после запятой, скорее всего вы это и увидели.

Вообще на тему преобразований можно написать отдельный раздел, правда я не знаю стоит ли сейчас этим грузить начинающих? Т.к. я намерено не стал пока упоминать разные числовые типы, а разделил их просто на вещественные и целые. В первую очередь мне хочется донести суть конструкций языка DML.
При приведении типов они себя ведут совсем не аналогично. Попробуйте выполнить те же операции, но на исходных данных в varchar. Cast '25.2525' -> 25.25, Convert '25.2525' -> 25.2525.
Попробовал, у меня результат одинаков:

SELECT
  CAST('25.2525' AS float), -- 25.2525
  CONVERT(float,'25.2525') -- 25.2525


У меня MS SQL 2014.
Немного уже подзабыл, но нашел код при котором можно увидеть отличия, много времени на это убил.
declare @lastValue money

set @lastValue = 25.2525

select CAST(@lastValue as varchar(20))--25.25
select Convert(varchar(20), @lastValue)--25.25
select Convert(varchar(20), @lastValue, 2)--25.2525

Тестил на 2008r2
Большое спасибо, что уделили свое время!

Да, здесь вы правы, в зависимости от преобразуемого типа данных и возможности использования разных стилей, функция CONVERT может возвращать разный результат. Причем, для каждого типа данных может использоваться свой набор стилей. Конечно, в случае преобразования целого числа в вещественное (которое я привел в целях демонстрации целочисленного и вещественного деления) это не так критично, но в некоторых случаях это действительно важно, например, в указанном вами случае, когда делается преобразование числового значения в строку (varchar).

Про функции CAST, CONVERT и стили можно подробно почитать в MSDN – «Функции CAST и CONVERT (Transact-SQL)»: msdn.microsoft.com/ru-ru/library/ms187928.aspx

Хотел расширить ваш пример и показать в виде комментария, но объем для комментария получился немного большим. Поэтому, давайте я добавлю небольшой раздел про нюансы преобразования непосредственно в статью. Возможно данная информация, кому-то будет полезна.
Добавил раздел посвященный этой теме — «Немного о числах и их преобразованиях».
Спасибо. Даже я узнал несколько новых вещей.
Возможно еще стоило упомянуть об опасности NOT IN, если перечень значений включает NULL. Довольно частая ошибка.
Спасибо! Очень полезное дополнение. Я как-то совсем забыл об этом.

Очень скрупулезно и при этом доступно написано, спасибо!

Есть пара уточняющих вопросов.

  1. Используется ли при вычислении логических выражений оптимизация (как в C и C++)? Т.е. если в выражении "a AND b" значение a равно false, то b не вычисляется и не проверяется, т.к. результат всего выражения уже известен. Аналогично, если в "a OR b" значение a равно true.

  2. В условии
    WHERE DepartmentID<>1 AND DepartmentID IS NOT NULL
    зачем нужна проверка IS NOT NULL? Если DepartmentID равен NULL, то выражение DepartmentID<>1 даст NULL, и строка тоже не попадет в выборку.

Sign up to leave a comment.

Articles