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 替换(列名,' ','')
我有第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 替换(列名,' ','')