Триммерный вариант sql
У меня есть столбец SQL вариант, который имеет следующие значения: 100, 150, D1
Я пытаюсь преобразовать все числа в столбцах в буквы (например, D1
) согласно конкретной логике в случае, когда. Но 150
имеет пробелы и CASE WHEN
не работает
Вот запрос, который я использую:
Select *,
Case When LTrim(Cast(AttributeValue As NVarchar(Max))) Between 0 And 200 Then 'D1'
Else 'Other'
End
From MyTable As SCR With (NoLock);
Я попробовал следующее
LTRIM(CAST column AS VARCHAR(MAX))
но теперь я получаю ошибку:
Ошибка преобразования при преобразовании значения nvarchar 'D1' в тип данных int
Как я могу удалить пробелы из sql_variant?
2 ответа
В соответствии с вашими комментариями, отредактированными для использования BIGINT из-за больших чисел и оставьте столбец таким же, если он не между 0 и 400
SELECT *
,CASE
WHEN ISNUMERIC(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX)))) = 1
AND CAST(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX))) AS BIGINT) BETWEEN 0 AND 400 THEN 'D1'
ELSE AttributeValue
END
FROM
MyTable AS SCR WITH (NOLOCK)
Вы можете использовать ISNUMERIC()
функция, чтобы определить, какой из ваших sql_variants
являются целыми числами, а которые нет.
Причина, по которой ваш код дает сбой, не из-за усечения, а из-за того, что вы сравниваете VARCHAR с INTEGER, поэтому SQL пытается автоматически преобразовать вашу окончательную строку как целое число, которое в случае D1 не является числовым, поэтому это вызывает ошибка преобразования.
Также обратите внимание, что вы не можете использовать sql_variant
прямо в ISNUMERIC()
функция так приведена к varchar
первый.
Вот вам целый пример, чтобы показать вам, как это работает:
DECLARE @MyTable AS TABLE (AttributeValue SQL_VARIANT)
INSERT INTO @MyTable VALUES
(CAST(' 150' AS VARCHAR(100)))
,(CAST('D1' AS VARCHAR(100)))
SELECT *
,CASE
WHEN ISNUMERIC(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX)))) = 1
AND CAST(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX))) AS INT) BETWEEN 0 AND 200 THEN 'D1'
ELSE 'Other'
END
FROM
@MyTable AS SCR
Использовать функцию замены sql выбрать заменить (columnnName, ' ', '')