#sql-server
#sql-сервер
Вопрос:
Запрос
SELECT TOP 1000
CASE WHEN VRI.Square_Footage <> ''
THEN VRI.Square_Footage
ELSE
CASE WHEN VRI.Property_Type = 'LAND'
THEN CAST((CONVERT(NUMERIC(38, 3),VRI.Acres)*43560) AS DECIMAL)
ELSE
VRI.Lot_Size
END
END
FROM View_Report_Information_Tables AS VRI
Даже если я проверил VRI.Acres
с isnumeric()
помощью, это все равно выдает ту же самую ошибку? Как я могу исправить эту проблему?
Комментарии:
1. @Conrad Frix: Спасибо за редактирование! Кстати, у тебя очень классный аватар ;)!
Ответ №1:
ISNUMERIC
не гарантирует, что он будет успешно приведен к decimal
.
SELECT ISNUMERIC('£100') /*Returns 1*/
SELECT CONVERT(NUMERIC(38, 3),'£100') /*Error*/
Кроме того, все ветви case
инструкции должны возвращать совместимые типы данных. Похоже, что VRI.Square_Footage
это строка.
Работает ли это для вас?
SELECT TOP 1000 CASE
WHEN ISNUMERIC(VRI.Square_Footage 'e0') = 1 THEN
VRI.Square_Footage
WHEN VRI.Property_Type = 'LAND'
AND ISNUMERIC(VRI.Acres 'e0') = 1 THEN CAST((
CONVERT(NUMERIC(38, 3), VRI.Acres) * 43560 ) AS DECIMAL)
WHEN ISNUMERIC(VRI.Lot_Size 'e0') = 1 THEN VRI.Lot_Size
END
FROM View_Report_Information_Tables AS VRI
Комментарии:
1. @Martin: Спасибо. Да,
VRI.Square_Footage
это на самомvarchar
деле. Как я могу обойти эту проблему?2. Это. Вы не можете смешивать строки и числа в одном столбце. Один из них должен быть преобразован в другой.
3. @Джерри Ритси: Так это значит, что я должен преобразовать все
varchar
в десятичное число?4. @Chan — Единственным способом смешивания (нечисловых) строк и чисел было бы приведение к
sql_variant
или приведение чисел в виде строк. Можете ли вы привести пример данных, из-за которых произошел сбой?5. @Conrad Frix: Я бы согласился с вами. К сожалению, это принадлежит команде SQL, я за это не отвечаю. Кстати, я только что преобразовал его обратно в
varchar
, и sql-запрос выполняется нормально.
Ответ №2:
Здесь запустите это
SELECT ISNUMERIC('d25')
Это может быть преобразовано в значение с плавающей запятой, но не в десятичную / числовую
SELECT CONVERT(FLOAT,'2d5')
Как вы можете видеть, вы не можете зависеть от numeric для десятичных / числовых типов данных
Взгляните на IsNumeric, IsInt, IsNumber, чтобы найти некоторый код, который покажет вам, как вы можете проверить