SQL Server - 使用分隔符和“n”字符解析字符串

时间:2017-01-17 04:23:45

标签: sql sql-server

我有一个包含大文本字符串的列,例如:

  

一些唯一的名称字符串/另一个唯一名称   string / string_12345.jpg,一些唯一的名称字符串/另一个唯一的名称   string / string_45765.jpg,一些唯一的名称字符串/另一个唯一的名称   串/ string_98765.jpg

唯一存在的模式是我需要的子串包含文件类型“.jpg”之前的5个数字。我需要的每个子字符串也以“,”

结尾

我需要使用.jpg分隔符的东西(可能在字符串的其他地方使用“。”)和分隔符之前的5个索引。 有关从哪里开始的任何建议或指示?字符串可以更长,包含数十个“.jpg”或一个。

预期结果

这样的事情:

     "12345.jpg45765.jpg98765.jpg"

最终结果是经过一些更多的清理后,它可能会如下所示。但是我不想让原来的问题复杂化。上面的结果可以满足我的需求。

     "12345.jpg - 45765.jpg - 98765.jpg"

3 个答案:

答案 0 :(得分:1)

如果你只需要在第一个.jpg之前的五个字符,那么你可以这样做:

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

否则,您将需要更重的设备 - 一个表值UDF来分割字符串,递归CTE或花哨的XML解析。

答案 1 :(得分: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

答案 2 :(得分: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

我稍后会回来并用一个可利用的脚本完成这个答案,同时尝试与你的桌子交叉加入。