使用T-SQL从字符串中删除字母

时间:2019-01-08 18:04:53

标签: sql sql-server tsql

这是我们拥有的SQL Server存储过程的一部分

WHEN C.Room IS NOT NULL AND LTRIM(RTRIM(C.ROOM)) != '' 
               AND LEN(LTRIM(RTRIM(c.room))) <= 4
   THEN LTRIM(RTRIM(C.building)) + '-' + LEFT('0000', 4 - LEN(LTRIM(RTRIM(c.room)))) + LTRIM(RTRIM(c.room))
   ELSE LTRIM(RTRIM(C.building)) + '-' + '0000'
END AS Location_ID

这将返回以下结果:

001-P211

我想删除-之后的字母以得到:

001-211

我该怎么做?

4 个答案:

答案 0 :(得分:0)

我认为您只是将自己的'-'添加到自己的代码中

 THEN LTRIM(RTRIM(C.building)) + '-' + LEFT('0000', 4 - LEN(LTRIM(RTRIM(c.room)))) + LTRIM(RTRIM(c.room))
   ELSE LTRIM(RTRIM(C.building)) + '-' + '0000

因此,删除+ '-' +

如果不是这种情况,则可以将REPLACE()函数用作

REPLACE(<Your CASE expression here>, '-', '')

答案 1 :(得分:0)

一些示例数据和预期结果将有助于澄清,但是,如果我关注您,看来这可能会满足您的要求。

我使用了一些虚拟数据来测试建筑物的总位置为001

Room   Result
P211   001-0211
P212   001-0212
P2123  001-0000
P21    001-0021
2142   001-2142
AB42   001-0042

我在您现有的代码中添加了一个新的CASE表达式,以检查房间号开头是否存在字符。如果它们存在,则我们将其剥离(我不确定您是否始终具有1个字母字符,或者是否可能具有更多的alpha字符,所以我使它可以工作更多)。如果它们不存在,则仅使用“房间”值。它不会在末尾去除字母,因此,如果您有房间P21A,它将返回021A。

由于您的LEN(LTRIM(RTRIM(c.room))) <= 4条件,本例中的第三种情况返回0000。

此外,您在左侧特别使用“ 0000”也不会得到001-211。

您可以在这里进行测试:https://rextester.com/PUI69939

WITH cte AS
(
    SELECT '001' AS Building, 'P211' AS Room
    UNION ALL 
    SELECT '001 ' AS Building, 'P212 ' AS Room
    UNION ALL 
    SELECT '001 ' AS Building, 'P2123' AS Room
    UNION ALL 
    SELECT '001 ' AS Building, 'P21' AS Room
    UNION ALL 
    SELECT '001 ' AS Building, '2142' AS Room
    UNION ALL 
    SELECT '001 ' AS Building, 'AB42' AS Room
)

SELECT 
CASE 
WHEN C.Room IS NOT NULL AND LTRIM(RTRIM(C.ROOM)) != '' 
               AND LEN(LTRIM(RTRIM(c.room))) <= 4
   THEN LTRIM(RTRIM(C.building)) + '-' +  
        CASE 
            WHEN c.room LIKE '[a-z]%' THEN LEFT('0000', 4 -LEN(SUBSTRING(LTRIM(RTRIM(c.room)),PATINDEX('%[0-9]%',c.room),LEN(c.room)))) + SUBSTRING(LTRIM(RTRIM(c.room)),PATINDEX('%[0-9]%',c.room),LEN(c.room))
            ELSE LEFT('0000', 4 -LEN(LTRIM(RTRIM(c.room)))) + LTRIM(RTRIM(c.room))
        END
   ELSE LTRIM(RTRIM(C.building)) + '-' + '0000'
END AS Location_ID
 FROM  cte c

如果您想要类似...的结果

Room   Result
P211   001-211
P212   001-212
P2123  001-0000
P21    001-21
2142   001-2142
AB42   001-42

...您可以删除LEFT逻辑,使它看起来像这样

SELECT 
CASE 
WHEN C.Room IS NOT NULL AND LTRIM(RTRIM(C.ROOM)) != '' 
               AND LEN(LTRIM(RTRIM(c.room))) <= 4
   THEN LTRIM(RTRIM(C.building)) + '-' +  
        CASE 
            WHEN c.room LIKE '[a-z]%' THEN SUBSTRING(LTRIM(RTRIM(c.room)),PATINDEX('%[0-9]%',c.room),LEN(c.room))
            ELSE LTRIM(RTRIM(c.room))
        END
   ELSE LTRIM(RTRIM(C.building)) + '-' + '0000'
END AS Location_ID
 FROM  cte c

答案 2 :(得分:0)

I removed - 

   WHEN C.Room IS NOT NULL AND LTRIM(RTRIM(C.ROOM)) != '' 
                   AND LEN(LTRIM(RTRIM(c.room))) <= 4
       THEN LTRIM(RTRIM(C.building)) + LEFT('0000', 4 - LEN(LTRIM(RTRIM(c.room)))) + LTRIM(RTRIM(c.room))
       ELSE LTRIM(RTRIM(C.building))  + '0000'
    END AS Location_ID

答案 3 :(得分:-1)

您发布的代码是CASE语句的一部分。在其他情况下,由于直接串联,您所要询问的内容将永远不会发生:

  

ltrim(rtrim(C.building))+'-'+'0000'=>总是以'-0000'

结尾

对于第一种情况,我们可以使用CHARINDEX函数获得字母“-”后的字符索引:

  

CHARINDEX('-',目标表达式)+ 1

要删除'-'之后的字母,我们可以创建两个子字符串,一个子字符串在字母的左侧,另一个在字母右侧,并将它们连接在一起:

  

LEFT(目标表达式,CHARINDEX('-',目标表达式))+右(目标表达式,LEN(目标表达式)-(CHARINDEX('-',目标表达式)+ 1))