3

我有列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 中删除空格?

4

2 回答 2

4

根据您的评论,由于数字较大而编辑为使用 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
于 2016-09-19T15:30:32.693 回答
-2

使用 sql 替换函数 select replace(columnnName, ' ', '')

于 2016-09-19T15:34:49.763 回答