2017-01-17 113 views
0

我有一個包含大量的文本字符串,如柱:SQL服務器 - 解析字符串分隔符和字符「n」

一些獨特的名稱字符串/另一個唯一的名稱 串/ string_12345.jpg,一些唯一的名稱的字符串/另一個唯一的名稱 串/ string_45765.jpg,一些獨特的名稱字符串/另一個唯一的名稱 串/ string_98765.jpg

唯一圖案目前是子串我需要精確地包含5文件前面的數字鍵入「.jpg」。我需要的每個子串還以「,」結尾,我需要使用.jpg分隔符(可能在字符串中的其他地方使用「。」)以及該分隔符之前的5個索引。 任何建議或指示從哪裏開始?字符串可以更長,幷包含數十個「.jpg」或一個。

預期結果

事情是這樣的:

 "12345.jpg45765.jpg98765.jpg" 

最終的結果將經過一些清理工作,它可能會像下面。但是我不想讓原來的問題複雜化。以上結果適合我目前的需求。

 "12345.jpg - 45765.jpg - 98765.jpg" 
+0

這會間接回答你的問題,但更好的表格結構應該是爲每個文件名都有一個記錄。在數據庫中使用逗號分隔值是非常糟糕的。 – JRLambert

+1

根據您的樣本數據,預期結果是什麼? –

+0

在這裏添加2或3個預期輸出的樣本數據 –

回答

1

如果你只想在第一.jpg前5個字符,那麼你可以做:

select (case when str like '%_____.jpg%' 
      then substring(str, charindex('.jpg', str) - 5, 5) 
     end) as char5 

否則,你將需要重裝備 - 表值UDF分割字符串,遞歸的CTE,或花哨的XML解析。

+0

這適用,但僅適用於找到「.jpg」分隔符的第一種情況。我需要它來循環。我正在使用while來處理for循環。我看到你提到了遞歸CTE。所以我會仔細研究一下 – Cjust689

0

這只是一個想法:

declare @text varchar(max)='some unique name string/another unique name string/string_12345.jpg,some unique name string/another unique name string/string_45765.jpg,some unique name string/another unique name string/string_98765.jpg' 
print @text 
declare @new varchar(max) 
while (charindex('.jpg',@text))>0 
begin 
select substring(@text,charindex('.jpg',@text)-5,5) 
set @text=SUBSTRING(@text,charindex('.jpg',@text)+5,len(@text)) 
end 
0

我給你推薦一個關於理貨表和它的好處後對操作字符串:

http://sql-question.blogspot.com.ar/2012/10/what-is-tally-table-in-sql-server.html

這是你如何建立一個符合或數字表:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1  --use sys.columns if you don't get enough rows returned to generate all the numbers you need 
    CROSS JOIN sys.objects s2 --use sys.columns if you don't get enough rows returned to generate all the numbers you need 
ALTER TABLE Numbers ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number) 

select count(*) from Numbers 

我稍後再回來補全同時用一個可用的腳本來回答這個問題,同時嘗試將它與你的表交叉。