2017-01-17 5 views
0

У меня есть столбец, который содержит большую текстовую строку, такие как:SQL Server - Анализировать строка с разделителем и «п» символами

некоторую уникальное имя строка/другой уникальное имя строки/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, то вы можете сделать:

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

В противном случае, вы будете нуждаться в более тяжелое оборудование - табличное значение UDF, чтобы разбить строку , рекурсивный CTE или фантастический синтаксический анализ XML.

+0

Это работает, но только для первого случая, когда найден разделитель «.jpg». Мне нужно, чтобы он прошел. Пока я работаю над циклом for. Я вижу, что вы упоминали рекурсивный CTE. Поэтому nvm я буду смотреть на это – 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 

Я вернусь позже и дополню т. е. этот ответ с помощью используемого скрипта, тем временем, попробуйте перекреститься с ним с вашей таблицей.

Смежные вопросы