Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 получить n-вхождение подстроки  [new]
relief
Member

Откуда:
Сообщений: 1197
есть строки вида Country-City-Zip-Street или Country-City-Zip-Street-House

как вытащить все zip?
24 июл 12, 15:10    [12908843]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А "вытащить" в вашем понимании - это что?
24 июл 12, 15:12    [12908854]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
как вытащить все zip?

Распарсить строки и взять каждый 3ий элемент
24 июл 12, 15:12    [12908855]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
relief
Member

Откуда:
Сообщений: 1197
Гавриленко Сергей Алексеевич
А "вытащить" в вашем понимании - это что?


получить все значения zip
24 июл 12, 15:18    [12908895]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
relief
Гавриленко Сергей Алексеевич
А "вытащить" в вашем понимании - это что?


получить все значения zip
На почту получить? Через запятую? Еще как-нибудь?
24 июл 12, 15:21    [12908916]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
relief,

а разве не бывает названий с тире?
Как же определить границы разных частей строки?
24 июл 12, 15:21    [12908920]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief,

а разве не бывает названий с тире?
Как же определить границы разных частей строки?


разделитель тут непринципиально пока. пока хочу понять как получить данные
24 июл 12, 15:24    [12908955]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
relief
iap
relief,

а разве не бывает названий с тире?
Как же определить границы разных частей строки?


разделитель тут непринципиально пока. пока хочу понять как получить данные
substring()
24 июл 12, 15:25    [12908958]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
relief
Member

Откуда:
Сообщений: 1197
Гавриленко Сергей Алексеевич
relief
пропущено...


разделитель тут непринципиально пока. пока хочу понять как получить данные
substring()


ну вот я не понял какой это должен быть substring
24 июл 12, 15:29    [12908989]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
relief
ну вот я не понял какой это должен быть substring
С нужными параметрами.
24 июл 12, 15:30    [12908996]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
relief,

4223008
24 июл 12, 16:47    [12909620]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
user89
Member

Откуда:
Сообщений: 2083
relief,

Держите готовые примеры. Отдельное спасибо iap !

+ Примеры парсинга
-- Выбрать 3-е слово из строки
DECLARE @S VARCHAR(100)
set @s ='слово1   слово2       слово3  слово4'
;WITH CTE(N,[number]) AS
(
 SELECT ROW_NUMBER()OVER(ORDER BY [number]),[number]
 FROM master.dbo.spt_values
 WHERE [type]='P' AND [number] BETWEEN 0 AND LEN(@S)
   AND STUFF(' '+@S,1,[number],'') LIKE ' [^ ]%'
)
SELECT SUBSTRING(@S,[number]+1, CHARINDEX(' ',@S+' ',[number]+1)-[number]-1)
FROM CTE
WHERE N=3
/* ====================================================================================================================== */



/* ====================================================================================================================== */
-- Разбить `Фамилия Имя Отчество` на составляющие части

-- Вариант 1. В один столбец, три строки
declare @p varchar (200), @s varchar(max)
set @p = '   Иванов    Иван    Иванович   '

set @p = replace(replace(replace(ltrim(rtrim(@p)), '  ', ' '+CHAR(1)), CHAR(1)+' ', ''), CHAR(1),'')
set @s = 'select ''' + replace(ltrim(rtrim(@p)), ' ', ''' union all select ''') + ''''
exec (@s)
go


-- Вариант 2. В одну строку, три столбца
declare @p varchar (200), @vSubstring varchar(200)      

set @p = '   Иванов    Иван    Иванович   '

select @vSubstring = replace(LTRIM(RTRIM(replace(replace(replace(@p,'  ',' '),'  ',' '),'  ',' '))),' ','.')      
select parsename(@vSubstring,3),parsename(@vSubstring,2),parsename(@vSubstring,1)


-- Вариант 3. Здесь предполагается, что имя и отчетсво последние два слова. Фамилия может быть многосложной, она вначале строки
declare @f nvarchar(200), @rf nvarchar(200)

set @f = 'Бюль-Бюль Оглы Николай Петрович'
set @rf = reverse(@f)

select left(@f, len(@f) - charindex(' ', @rf, charindex(' ', @rf) + 1)) [Ф]
, reverse(left(@rf, charindex(' ', @rf, charindex(' ', @rf) + 1) - 1)) [ИО]
go

-- Ну и в продолжение "Варианта 3", уберем отчество, а Имя поставим на первое место, так, что получится Имя-Фамилия:
declare @fio nvarchar(500), @rf nvarchar(500)

set @fio = 'Сложная-сложная фамилия Николай Петрович'
set @rf = reverse(@fio)

select reverse(substring(@rf, charindex(' ', @rf)+1,  charindex(' ', @rf, charindex(' ', @rf) + 1) - charindex(' ', @rf)-1)) 
+ ' ' + left(@fio, len(@fio) - charindex(' ', @rf, charindex(' ', @rf) + 1))
/* ====================================================================================================================== */



/*****************************************************************************************************************************************************/ 
 -- В одном поле есть Фамилия Имя Отчество  для печати надо получить Фамилию И. О. 
/*****************************************************************************************************************************************************/
-- Простой вариант
declare @name nvarchar (128), @strf int, @strs int

set @name = '         Петров-Водкин        Кузьма          Сергеевич       '

-- Уберем лишние пробелы
set @name = replace(replace(replace(rtrim(ltrim(@name)), '  ', ' '+CHAR(1)), CHAR(1)+' ', ''), CHAR(1),'')

select parsename(replace(@name,' ','.'),3)+' '+
  left(parsename(replace(@name,' ','.'),2),1)+'. '+
  left(parsename(replace(@name,' ','.'),1),1)+'.'
go


-- Крутой вариант. Можно задать любые разделители, которые могут стоять где угодно в строке в любом количестве.
DECLARE @S VARCHAR(500), @Delimiters VARCHAR(200);

SET @Delimiters=CHAR(10)+CHAR(13)+CHAR(9)+',.; :=+';
SET @S='=Петров-Водкин.=,,, Кузьма++	;;: Сергеевич,...';

SELECT
 STUFF
 (
  (
   SELECT ' '+CASE ROW_NUMBER()OVER(ORDER BY N) WHEN 1 THEN S ELSE LEFT(S,1)+'.' END FROM
   (
    SELECT V.number, SUBSTRING(@S,V.number,
     (
      SELECT MIN(VV.number)
      FROM master.dbo.spt_values VV
      WHERE VV.type='P' AND VV.number BETWEEN V.number AND LEN(@S)+1
      AND SUBSTRING(@S+LEFT(@Delimiters,1),VV.number,1) LIKE '['+@Delimiters+']'
     )-V.number
    )
    FROM master.dbo.spt_values V
    WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(@S)+1
    AND SUBSTRING(LEFT(@Delimiters,1)+@S,V.number,1) LIKE '['+@Delimiters+']'
   ) T(N,S)
   WHERE S>''
   ORDER BY N
   FOR XML PATH('')
  ),1,1,''
 );
24 июл 12, 17:26    [12909968]     Ответить | Цитировать Сообщить модератору
 Re: получить n-вхождение подстроки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Функция, которая делит строку на слова

Можно и без функции - поищите по форуму.
Недавно только было. Там и способ с типом XML был показан.
А вот статья полезная
24 июл 12, 17:27    [12909975]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить