这是我们拥有的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
我该怎么做?
答案 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))