[英]Remove letter from string using T-SQL
這是我們擁有的 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
我怎樣才能做到這一點?
我想你只需添加'-'
你自己,看看你的代碼
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>, '-', '')
一些示例數據和預期結果將有助於澄清,但是,如果我關注您,看起來這可能會滿足您的要求。
我使用了一些虛擬數據來測試建築物始終為 001 的位置
Room Result
P211 001-0211
P212 001-0212
P2123 001-0000
P21 001-0021
2142 001-2142
AB42 001-0042
我在您現有的代碼中添加了一個新的 CASE 表達式,以檢查房間號開頭是否存在字符。 如果它們存在,那么我們將它們剝離(我不確定你是否總是有 1 個字母字符或可能有更多,所以我讓它工作更多)。 如果它們不存在,那么它只是按原樣使用 Room 值。 它不會在最后去掉字母,所以如果你有一個房間 P21A,它會返回 021A。
由於LEN(LTRIM(RTRIM(c.room))) <= 4
條件,我示例中的第三種情況返回 0000。
此外,您不會得到 001-211,因為您在 LEFT 中專門使用了“0000”。
你可以在這里測試: 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
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
您發布的代碼是 CASE 語句的一部分。 對於 else 情況,由於直接連接,您所詢問的將永遠不會發生:
ltrim(rtrim(C.building)) + '-' + '0000' => 總是以 '-0000' 結尾
對於第一種情況,我們可以使用 CHARINDEX 函數獲取“-”后字母的字符索引:
CHARINDEX('-',目標表達式) + 1
要刪除“-”之后的字母,我們可以創建兩個子字符串,一個在字母的左側,另一個在字母的右側,並將它們連接在一起:
LEFT(目標表達式, CHARINDEX('-',目標表達式)) + RIGHT (目標表達式, LEN(目標表達式) - (CHARINDEX('-',目標表達式) + 1) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.