首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >trim sql变体

trim sql变体
EN

Stack Overflow用户
提问于 2016-09-19 15:21:12
回答 2查看 1.1K关注 0票数 3

我有列sql变体,它有以下含义:100, 150, D1,我试图根据特定的逻辑将列中的所有数字转换为字母(例如D1),以防何时发生。但是150有空格,CASE WHEN不能工作。

下面是我使用的查询:

代码语言:javascript
复制
Select  *,
        Case When LTrim(Cast(AttributeValue As NVarchar(Max))) Between 0 And 200 Then 'D1'
             Else 'Other'
        End
From    MyTable As SCR With (NoLock); 

我尝试了以下方法

代码语言:javascript
复制
LTRIM(CAST column AS VARCHAR(MAX))

但现在我错了:

将nvarchar值“D1”转换为数据类型int时,转换失败

如何从sql_variant中删除空格?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-19 15:30:32

根据您编辑的注释使用BIGINT,因为它有较大的数字,如果列不是在0到400之间,则保持原样。

代码语言:javascript
复制
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

下面是一个完整的示例,向您展示它是如何工作的:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-09-19 15:34:49

使用sql替换函数选择替换(columnnName,‘','')

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39576713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档