我有列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中删除空格?
发布于 2016-09-19 15:30:32
根据您编辑的注释使用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()函数来确定哪些是整数,哪些不是整数。
您的代码之所以失败,并不是因为使用了trim,而是因为您正在将VARCHAR与整数进行比较,因此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-19 15:34:49
使用sql替换函数选择替换(columnnName,‘','')
https://stackoverflow.com/questions/39576713
复制相似问题