使用T-SQL从字符串中删除字母
这是我们拥有的SQL Server存储过程的一部分使用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
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