簡體   English   中英

修剪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))

但現在我得到錯誤:

將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM