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

使用T-SQL从字符串中删除字母,sql,sql-server,tsql,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

这是我们拥有的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-211

我该怎么做呢?

我想你只要把
'-'
添加到你自己的代码中就可以了

 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>, '-', '')
REPLACE(,'-','')

您发布的代码是案例陈述的一部分。对于else情况,由于直接连接,您所询问的问题永远不会发生:

ltrim(rtrim(C.building))+'-'+'0000'=>将始终以'-0000'结尾

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

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

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

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


一些样本数据和预期结果将有助于澄清问题,但是,如果我跟踪你,看起来这可能会满足你的要求

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

Room   Result
P211   001-0211
P212   001-0212
P2123  001-0000
P21    001-0021
2142   001-2142
AB42   001-0042
我在现有代码中添加了一个新的大小写表达式,以检查房间号开头是否有字符。如果它们存在,我们就把它们去掉(我不确定你是否总是有一个字母字符,或者可能有更多,所以我让它更有效)。如果它们不存在,则只使用房间值。它不会在末尾去掉字母,因此如果您有P21A房间,它会返回021A

我的示例中的第三个案例返回0000,因为您的
LEN(LTRIM(RTRIM(c.room))
I已删除-
当C.Room不为空且LTRIM(RTRIM(C.Room))!=“”

和LEN(LTRIM(RTRIM(c.room)))提示:
REPLACE
Room   Result
P211   001-0211
P212   001-0212
P2123  001-0000
P21    001-0021
2142   001-2142
AB42   001-0042
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
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
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