修剪sql变种

时间:2016-09-19 15:21:13

标签: sql sql-server 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))

但现在我收到错误:

  

转换nvarchar值时转换失败' D1'到数据类型int

如何从sql_variant中删除空格?

2 个答案:

答案 0 :(得分:4)

根据您的评论编辑使用BIGINT,因为数字较大,如果不是BETWEEN 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

答案 1 :(得分:-2)

使用sql替换功能 select replace(columnnName,'','')