2013-12-20 58 views
11

假設我有一個字符串1,2,3,我想刪除最後的,或者如果字符串看起來像,1,2,3,,1,2,3我仍然想要得到1,2,3作爲我的結果。 請在答案中儘量做一點解釋。我不只是想在不理解的情況下複製粘貼的東西。謝謝。如何從字符串中刪除特定字符,僅當它是字符串中的第一個或最後一個字符時。

+0

爲什麼你需要在字符串的開始或結尾刪除額外的逗號?我問,最終目標可能指向其他可能的解決方案。 –

+0

我發送一個很長的字符串,看起來像'a,b,c'到我的存儲過程,我在'IN子句'中使用了這個字符串,我從後面的代碼中移除了最後一次逗號,我很好奇可以在SQL中做同樣的事情。 – Arbaaz

+0

在SQL Server 2017中查看[TRIM](https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql)方法 – HuBeZa

回答

18

一種方式來應對「微調」這樣的逗號將使用CASE聲明:

CASE 
    WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2) 
    WHEN str LIKE ',%' THEN RIGHT(str, LEN(str)-1) 
    WHEN str LIKE '%,' THEN LEFT(str, LEN(str)-1) 
    ELSE str 
END 

這是非常不言自明:在CASE聲明認爲三種情況 -

  • 當字符串str雙方都有逗號時,
  • 當字符串str以逗號開頭,但不以1結尾,
  • 字符串str以逗號結尾,但不以1開頭。

在第一種情況下,第一個和最後一個字符被刪除;在第二種情況下,最左邊的字符被刪除;在最後一種情況下,尾隨字符被刪除。

Demo on sqlfiddle.

+0

你的解決方案在大多數情況下都能正常工作,但是如果我的字符串看上去像'1,2,3,'或'a,b,c ,,'怎麼辦?我知道這不太可能,但讓我們假設它會發生什麼呢? +1 btw – Arbaaz

+0

@Arbaaz由於SQL Server 2008缺乏對正則表達式的「普通」支持,處理未知長度的字符序列是一個棘手的問題。你可以編寫你自己的函數,或者使用黑客方法:用空格替換逗號,在兩端修剪空格,最後再用逗號替換空格,就像這樣'REPLACE(LTRIM(RTRIM(REPLACE(str,',',') '))),'',',')'([demo](http://sqlfiddle.com/#!6/1fbef/1))。 **注意:**原始字符串必須*不包含空格才能使此黑客工作。 – dasblinkenlight

+0

@Arbaaz,這不完全是你的公平。你的問題是具體處理第一個和/或最後一個字符。請更新您的問題的措辭,以便給出的答案可能更合適。 –

0

dept_name是列名稱,'I'是您要替換的字符。

SELECT REPLACE(Dept_Name,'I','') 
FROM [Newone].[dbo].[Department] 
where Dept_Name like 'I%' or Dept_Name like '%I' 
+1

他只想要第一個和最後一個。 – Jade

0

CASE就在這裏工作。我想是這樣的:

CASE 

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 AND ISNUMERIC(LEFT(YourString, 1)) <> 1 
THEN SELECT MID(YourString, 2, LEN(YourString) - 2) 

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 
THEN SELECT LEFT(YourString, LEN(YourString) -1) 

WHEN ISNUMERIC(LEFT(YourString, 1)) <> 1 
THEN SELECT RIGHT(YourString, LEN(YourString) - 1) 

ELSE SELECT YourString 

END 

此作品無論性格就是因爲它檢查是否第一個和最後一個是數字第一,如果沒有得到你的新的字符串,否則檢查,看看是否如果沒有選擇除末尾之外的字符串,則末尾爲數字;否則,檢查開頭是否爲數字,如果不選擇除開頭以外的字符串,則還要獲取字符串。

1
declare @str varchar(20)=',1,2,3,' 

select case 
     when @str like ',%,' then stuff(stuff(@str, 1, 1, ''),LEN(stuff(@str, 1, 1, '')),1,'') 

     when @str like ',%' then stuff(@str, 1, 1, '') 

     when @str like '%,' then stuff(@str, LEN(@str), 1, '') 

     else @str 
     end 
0

如果您需要在開始或結束時再更換隻是一個逗號(,因爲它是在你原來的問題):

CASE 
    WHEN str LIKE '%,%' THEN 
     SUBSTRING(str, IIF(LEFT(str,1)=',',2,1), 
         LEN(str)-IIF(LEFT(str,1)=',',1,0) 
           -IIF(RIGHT(str,1)=',',1,0)) 
    ELSE str 
END 

如果,,,,1,2,3,,,,可以再使用PATINDEX()函數'%[0-9]%面膜:

CASE 
    WHEN str LIKE '%,%' THEN 
     SUBSTRING(str, PATINDEX('%[0-9]%',str), 
         LEN(str)-(PATINDEX('%[0-9]%',str)-1) 
           -(PATINDEX('%[0-9]%',REVERSE(str))-1)) 
    ELSE str 

END 

SQLFiddle demo

+0

雖然他想要第一個和最後一個,但是如果是這樣的話,,, 1,,2 ,,,,, 3 ,, – Jade

+0

@Jade然後'1,,2 ,,,,, 3'將保留。只有當它是字符串中的第一個或最後一個字符時,@Arbaaz纔會刪除',''。 – valex

+0

是的,這就是爲什麼我說,但如果。 – Jade

0

有幾個選項全部使用SQLCLR,如果這是你不被拒絕訪問的東西。您可以編寫自己的函數來完成這些工作,但我將展示的示例基於SQL# (SQLsharp)庫。我是SQL#庫的作者,但前兩個示例使用Free版本中提供的函數。使用TrimChars()的第三個例子不是免費的,但是爲了完整性,我將它包含在內,因爲它非常簡單;-)。在每個示例中,前或後額外逗號內的字符可以是任何內容。

  1. 一個稍微簡單的在一個捕獲組使用正則表達式通過的最後一個非逗號價值得到一切從第一非逗號值:

    SELECT SQL#.RegEx_CaptureGroup(N',,12,123,12334,567,,,,,', 
               N'^,*(.+?),*$', -- Regular Expression 
               1, -- Capture Group to return 
               '', -- not found replacement 
               1, -- Start At position 
               -1, -- Length 
               '' -- RegEx Options 
               ) 
    
  2. 如果去除的原因額外的逗號是要得到一個清晰的分割列表,你可以拆分它們並讓分割函數爲你刪除空值,因此不需要擔心空值在哪裏,即使在中間:

    SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2) 
    -- 2 = remove empty values 
    
  3. 你可以做一個簡單的修剪,消除雙方指定的字符,直到找到一個字符不修剪字符:

    SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',') 
    
0

如果你只是想刪除一個結尾逗號,在SQL Server中,我會使用STUFF函數,它看起來像這樣:

SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring 
from yourtable 
0

試試這個。 REVERSE(SUBSTRING(REVERSE(fld),2,LEN(fld))) 無論如何,它總會佔用最後一個字符。 你可以放一個CASE WHEN語句,通過簡單地說CASE WHEN REVERSE(SUBSTRING(fld,1,1))=','then'REVERSE(SUBSTRING(REVERSE(fld),2,LEN(fld) )))ELSE fld END fld

相關問題