簡體   English   中英

使用 T-SQL 從字符串中刪除字母

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM