Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Доброго времени суток. С mssql практически не знаком и всех инструментов могу знать, поэтому прошу помощи.
Есть несколько таблиц, связка которых дает набор данных. В этом наборе данных необходимо найти 1 единственно верную строку. Покажу на примере:
select fs.stName, fc.imDoc
 from stMain m, stVersions v, stFileContent fc, stFileDescs fd, stFSOs fs 
 where m.inId = v.inIdMain 
 and fc.inIdFile = fd.inIdFSO
 and fd.inIdDocument = v.inId 
 and fs.inIdFSO = fc.inIdFile 
 and m.stKeyAttr like '%Инв. № 1599%' 
 and m.inIdType in (26, 38)

Этот селект даст следующий набор(imDoc блоб файл. Вставлять не буду):
stName
--------
Поз.4,5,6,7,8,9,18,19,26
Поз.61,62,63С1,63С2,64,65,66,68
Поз. 313, 314С1+314С2, 315, 316, 318С1+318С2
Поз. 38-44
поз 102
поз98-101


найти в этом наборе строку, например по позиции 101 не составляет труда, написал stName like '%101%'. Но проблема состоит в том, как найти стороку с позицией 100?

Собственно, прощу помочь написать парсинг строк для нахождения промежуточных номеров. заранее благодарю
7 окт 13, 11:57    [14932928]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mlc
найти в этом наборе строку, например по позиции 101 не составляет труда, написал stName like '%101%'

А чтобы найти строку по позиции 4, вы напишете stName like '%4%' ?
7 окт 13, 12:00    [14932965]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
mlc
Но проблема состоит в том, как найти стороку с позицией 100?

Особенно, если ее нет ? Или какие другие различия между like '%101%' и like '%100%' ?
7 окт 13, 12:01    [14932978]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
qwerty112
Guest
mlc
найти в этом наборе строку, например по позиции 101 не составляет труда, написал stName like '%101%'. Но проблема состоит в том, как найти стороку с позицией 100?

ты номекаешь, что 100 должно быть найденно, потому что оно содержится в этом "диапазоне"
поз98-101

?
7 окт 13, 12:02    [14932989]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
qwerty112,

да.98-101 это есть диапазон инвентарных номеров
7 окт 13, 12:04    [14933018]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Гость333,

согласен не совсем тривиально писать like, но на большее ума пока не хватило
7 окт 13, 12:05    [14933025]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
mlc
да.98-101 это есть диапазон инвентарных номеров

Тогда -101 означает от -бескаонечности до 101 ?
А 101- означает от 101 до +бесконечности ?
7 окт 13, 12:06    [14933039]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Glory,

если пишется диапазон, то он всегда имеет начальное и конечное значения.
7 окт 13, 12:08    [14933060]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Гость333
Member

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

А как понять такие значения: 63С1,63С2?
Чем это отличается от 314С1+314С2?
Могут ли такие значения быть границами диапазонов?
7 окт 13, 12:11    [14933085]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
mlc
если пишется диапазон, то он всегда имеет начальное и конечное значения.

Ага. А отсутствующий пробел и написание в разных регистрах как бы намекает, что ошибки воода никогда не может быть
7 окт 13, 12:12    [14933096]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Гость333,

63С1,63С2 - это краткие наименования позиций.
314С1+314С2 - это является таким же наименованием одной позиции. (просто она состоит из двух)
63С1,63С2 такие позиции не могут быть записаны в виде диапазонов.

Диапазонами могут быть записаны наименования позиций, состоящие только из цифр
7 окт 13, 12:15    [14933121]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
mlc, а что означают плюсы?

а вообще, может стоит разобраться в структуре данных? Из чего-то же формируются поля stName. Где-то там и должны быть числовые данные, которые вас интересуют и которые можно получить более приличным для SQL методом, чем парсинг строк. :)
7 окт 13, 12:17    [14933139]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Glory,

ошибки ввода никто не отменяет. Существующий регламент конструкторов соблюдается по максимуму, однако есть индивидуумы, которые упорно не хотят его соблюдать.
7 окт 13, 12:18    [14933144]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
mlc
Существующий регламент конструкторов соблюдается по максимуму, однако есть индивидуумы, которые упорно не хотят его соблюдать.

Поэтому одним like-ом вы не обойдетесь
Придется писать парсер, который попытается учесть все многообразие ваших вводов
7 окт 13, 12:20    [14933155]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
Да. И лучше, чтоыб этот парсер делал свою работу при вводе данных. А ен при каждой выборке
7 окт 13, 12:21    [14933162]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mlc
однако есть индивидуумы, которые упорно не хотят его соблюдать.

А программа им в этом потакает, никак не верифицируя пользовательский ввод?
7 окт 13, 12:22    [14933169]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Уленшпигель
mlc, а что означают плюсы?

а вообще, может стоит разобраться в структуре данных? Из чего-то же формируются поля stName. Где-то там и должны быть числовые данные, которые вас интересуют и которые можно получить более приличным для SQL методом, чем парсинг строк. :)


Плюсы означают формирование одной новой позиции из нескольких. К сожалению, те строки что я привел вносятся вручную . данная строка является названием блоб файла. В качестве блоба прикрепляется чертеж перечисленных деталей. Поэтому, получение числовых данных из более доступных мест не представляется возможным.
7 окт 13, 12:23    [14933173]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Гость333,

К сожалению да.

Моя работа состоит в том, чтобы работать с конкретным шаблонов, описанным в нормах, а именно Поз. 313, 314С1+314С2, 315, 316, 318С1+318С2.

Соответственно и парсинг строки стоит писать под такой формат данных
7 окт 13, 12:25    [14933179]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
KRS544
Member

Откуда:
Сообщений: 497
Нужно понимать, что для работы с задачей нужен инструмент, предназначенный для этого.
И в данном случае инструмент выбран неправильно.
Можно конечно страуса заставить летать (сегодня в новостях показывали...), но лучше копать в другую сторону.
7 окт 13, 12:45    [14933273]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
KRS544,

хорошо. В какую, по-вашему, сторону стоит копать?
7 окт 13, 12:46    [14933279]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
qwerty112
Guest
mlc,

declare @t table(id int identity, stName varchar(max))
declare @search_val int

insert into @t (stName)
select 'Поз.4,5,6,7,8,9,18,19,26
Поз.61,62,63С1,63С2,64,65,66,68
Поз. 313, 314С1+314С2, 315, 316, 318С1+318С2
Поз. 38-44
поз 102
поз98-101'

----
set @search_val=100

select a.id /*, b.* */, c.*
from @t a
cross apply
	(select cast('<a>'+replace(replace(replace(replace(replace(a.stName, 'поз', ''), '.', ''), ' ', ''), ',', '</a><a>'), char(13)+char(10), '</a><a>')+'</a>' as xml) as stName_xml) b
cross apply 
	(select t.c.value('text()[1]', 'varchar(20)') as val, 
		case when charindex('-',t.c.value('text()[1]', 'varchar(20)'),1)>0 then cast(left(t.c.value('text()[1]', 'varchar(20)'), charindex('-',t.c.value('text()[1]', 'varchar(20)'),1)-1) as int) end as start,
		case when charindex('-',t.c.value('text()[1]', 'varchar(20)'),1)>0 then cast(right(t.c.value('text()[1]', 'varchar(20)'), len(t.c.value('text()[1]', 'varchar(20)'))-charindex('-',t.c.value('text()[1]', 'varchar(20)'),1)) as int) end as finish
	from b.stName_xml.nodes('a') as t(c)) c
where	c.val=cast(@search_val as varchar)
	or	@search_val between c.start and c.finish

id          val                  start       finish
----------- -------------------- ----------- -----------
1           98-101               98          101
7 окт 13, 12:50    [14933309]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
KRS544,

Насколько я понимаю, смысл данной задачи состоит в парсинге строки. После которого, нужно понять удовлетворяет ли текущая строка заданному условию - есть ли там искомая позиция или нет. И по вашим словам mssql для этого не приспособлен?
7 окт 13, 12:51    [14933317]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
mlc
. И по вашим словам mssql для этого не приспособлен?

Лучше всего mssql работает с данными. А не парсит строки произвольного формата.
Но если вам пофиг на производительность, то вы можете на mssql написать любой код.
7 окт 13, 12:53    [14933329]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
qwerty112,

огроменное человеческое спасибо!
7 окт 13, 12:54    [14933335]     Ответить | Цитировать Сообщить модератору
 Re: Поиск нужного элемента. Парсинг строки  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 499
Glory,

а парсинг тех самых данных по вашему это не относится к работе с данными? Или по вашему "работа с данными" это есть их простое хранение?
7 окт 13, 12:55    [14933343]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить