Триммерный вариант 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, ' ', '')

Другие вопросы по тегам