根据您的评论,由于数字较大而编辑为使用 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