Упражнение 3

Найдите номер модели, объем памяти и размеры экранов ноутбуков, цена которых превышает 1000 долларов.

Еще одна простая задача. Однако и здесь была допущена одна поучительная ошибка. Вот то решение, которое ее содержит:

SELECT model, ram, screen
FROM Laptop
WHERE price > '1000';
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Строковые константы в операторах SQL заключаются в одинарные кавычки. Константы числовых типов в кавычки не заключаются. Таким образом, последний предикат следовало бы записать как price > 1000. Однако здесь есть одна особенность, связанная с неявным преобразованием типов. Подробнее об этом вы можете почитать в главе “Преобразование типов и оператор CAST”. Здесь же следует сказать, что в SQL Server 2000 не выполнялось неявное преобразование строки к значению типа money (деньги). Поэтому рассматриваемый запрос приводил к появлению сообщения об ошибке:

Disallowed implicit conversion from data type varchar to data type money, table 'Laptop', column 'price'. Use the CONVERT function to run this query.

(«Запрещено неявное преобразование типа данных varchar к типу данных money; таблица Laptop, столбец price. Используйте функцию CONVERT для выполнения этого запроса».)

Заметим, что если бы столбец price был любого другого числового типа, например, float, то неявное преобразование было выполнено, и ошибки бы не возникало. Конечно, можно выполнить явное преобразование типа; вот вполне корректная версия данного запроса:

SELECT model, ram, screen
FROM Laptop
WHERE price > CAST('1000' AS MONEY);
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Если вы сейчас выполните запрос, вызывавший ошибку, то он вернет результирующий набор, а не указанное выше сообщение об ошибке. Дело в том, что на сайте периодически происходит обновление версий, и уже в SQL Server 2005 это странное отличие поведения типа money от других числовых типов при неявном приведении было устранено.

Таким образом, вы получите правильный результат, используя неявное приведение типа. Вот только зачем заставлять сервер тратить на это ресурсы, если можно вообще обойтись без приведения типов?

Решить задачу на SQL-EX.RU