trim sql 变体

trim sql variant

我有第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))

但现在我得到错误:

Conversion failed when converting the nvarchar value 'D1' to data type int

如何删除 sql_variant 中的空格?

根据您的评论编辑为使用 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 中哪些是整数,哪些不是。

您的代码失败的原因不是因为 trim,而是因为您正在将 VARCHAR 与 INTEGER 进行比较,因此 SQL 试图自动将您的最终字符串重新转换为整数,在 D1 的情况下不是数字,因此会导致转换错误。

另请注意,您不能在 ISNUMERIC() 函数中直接使用 sql_variant,因此请先转换为 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替换功能 select 替换(列名,' ','')