[英]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))
但現在我得到錯誤:
將nvarchar值'D1'轉換為數據類型int時轉換失敗
如何從sql_variant中刪除空格?
根據你的評論編輯使用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的情況下,它不是數字,因此它會導致轉換錯誤。
另請注意,您不能直接在ISNUMERIC()
函數中使用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
使用sql替換函數select replace(columnnName,'','')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.