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

Откуда:
Сообщений: 104760
Сорри за режим чата, но правильно всё же
[N,Х,№]

BOL - LIKE
[ ] - Any single character within the specified range ([a-f]) or set ([abcdef]).

Example
LIKE 'abc[def]' - Means abcd, abce, and abcf
5 авг 04, 16:48    [862617]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Всё верно, а у меня либо Х50, либо №50, либо N50
Значит через запятую, тем более у меня сработало :)
6 авг 04, 09:01    [863570]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
declare @symb varchar(100), @p1 int, @s varchar(100)
select @s = 'asdf Х56 rewq'
set @Symb='[NХ№]'
set @p1=patindex('% '+@Symb+'[0-9]%',@s)
select @p1
у меня выдает 5! Х русская везде!

для спящего время бодрствования равносильно сну
6 авг 04, 09:05    [863579]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Да, у меня тоже...странно... Но ладно, теперь я буду дозировку искать, там сложнее - МКГ, МГ, Г и МЛ стоят сзади цифры.
reverse помог
6 авг 04, 09:58    [863725]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Glory
Member

Откуда:
Сообщений: 104760
Всё верно, а у меня либо Х50, либо №50, либо N50
Значит через запятую, тем более у меня сработало :)

Запятая в вашем случае означает что будут искаться варианты
Х50
№50
N50
и ,50
6 авг 04, 10:11    [863773]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да, у меня тоже...странно... Но ладно, теперь я буду дозировку искать, там сложнее - МКГ, МГ, Г и МЛ стоят сзади цифры.
reverse помог

By the way
Я бы для начала распарсил строку на лексемы.
Каждой лексеме сопоставил бы еще скажем так глобальную лексему, т.е. все МКГ, МГ, Г и МЛ свел к лексеме ну скажем МГ.
А вопрос о совпадение наименований решал бы на основе того, сколько лексем из конкретного имени совпадает с минимально допустимым для данного имени.
6 авг 04, 10:23    [863815]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Glory

Я бы для начала распарсил строку на лексемы.

так я и хочу сделать уже 4 месяца :))
Glory

Каждой лексеме сопоставил бы еще скажем так глобальную лексему, т.е. все МКГ, МГ, Г и МЛ свел к лексеме ну скажем МГ.

Так и сделаю - мкг превращу в граммы, мг тоже в граммы. Из-за того, что некоторые поставщики пишут граммы без Г - 1.0 и всё.
Glory

А вопрос о совпадение наименований решал бы на основе того, сколько лексем из конкретного имени совпадает с минимально допустимым для данного имени.

Ой, вот тут фиг его знает...
Я хочу вообще полного совпадения достичь...Но есть мусор типа точки-запятые, думаю 500-1000 преобразований мне гарантированы.
6 авг 04, 11:16    [863983]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
так вы разбирайте по несколько заходов... в первый заход находятся жестко определенные лексемы... а за второй то что осталось... и куда это можно присобачить... а лексемы хранить в той же таблице... поля небольшого размера...


для спящего время бодрствования равносильно сну
6 авг 04, 11:19    [864004]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Glory
Member

Откуда:
Сообщений: 104760
так я и хочу сделать уже 4 месяца :))
Ну так в чем проблема? Принимаем что разделить лексем - это пробел. Определяем список шумовых симвоов/слов. И вперед
6 авг 04, 11:37    [864115]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Я поступил несколько иначе - я заменил пробел, точку, запятую косую на ^символ^
Т.о. слова гарантированно разделены крышками
6 авг 04, 12:39    [864446]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Поднимаю тему еще по одному вопросу:
как мне сделать множественный реплейс типа
заменить "таб.", "табл." на "таблетка"?
делать 2 реплейса или есть возможность одним?
и второе - тут вы сказали, что если я пишу [АБВ], то имеются ввиду буквы А, Б и В.
А если надо сочетания найти? Типа [ТАБЛ, ТАБ] и т.п.
10 авг 04, 17:17    [872136]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
declare @t table (id int identity(1,1), src varchar(100), dest varchar(100), type tinyint)
insert into @t values ('таб.','таблица', 1)
insert into @t values ('табл.','таблица', 1)

declare @s varchar(100)
set @s = 'моя табл. не моя таб.'
--2
select *, charindex(src, @s) from @t where type = 1 and charindex(src, @s)=(select min(isnull(charindex(src, @s),0)) from @t where charindex(src, @s)>0 and type = 1)
--1
select @s = replace(@s, src, dest) from @t where type = 1
select @s
организовать типа этого... :)


для спящего время бодрствования равносильно сну
10 авг 04, 17:31    [872177]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
таблица в кач-ве аргумента? Хм...
wBr Grigoriy Gruben
11 авг 04, 13:23    [874108]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
не выходит каменный цветок
Вот функция:
CREATE FUNCTION dbo.fn_ReplaceTrash(@Where char(255),@Was char(255),@Will char(255))
returns char(255)
AS
BEGIN
Declare @ret char(255)
select @Ret=Replace(@Where,@Was,@Will)  
Return (@ret)
END
Go
Вот временная таблица (как реализовать ее иначе - не знаю) с тем, что и на что надо менять:
create table #TrashSymb (Was Char(10), Will Char(10))
INSERT INTO #TrashSymb VALUES ('(*)','')
INSERT INTO #TrashSymb VALUES ('@','')
А вот запрос:
update DictP
set Mname=dbo.fn_ReplaceTrash(Sname,was,will) from #TrashSymb
select Top 10 * from DictP
Так вот - если во временной таблице одна строка, то всё меняет, но это и без функции можно реализовать.
А если больше одной строки - то не меняет.
15 авг 04, 17:01    [882695]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
дополнение - изменения происходят только согласно последней паре.
Т.е. @ меняется, а (*) нет

wBr Grigoriy Gruben
15 авг 04, 17:14    [882704]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
А можно использовать как аргумент функции таблицу?
CREATE FUNCTION dbo.fn_ReplaceTrash(@Where char(255), @Tab Table)
не прокатило

wBr Grigoriy Gruben
15 авг 04, 17:51    [882738]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Может я не прав, но мне кажется, что можно разложить имя на составляющие. После разглядывания примера названий лекарств приходит желание их систематизировать по категориям. Ведь каждое слово названия относится к определенной категории (вес, производитель, название). Разделить на слова можно пробелами, табуляторами переводами каретки и проч., что у Вас может оказатся. Составляем список категорий +1 на мусор. делим строку на слова. У каждой категоии есть маска, проверяем и относим слово к одной или нескольким категориям. Просматриваем список категорий, там, где есть дублирование, разбираемся вручную. Просматриваем список того, что не вошло никуда, дополняем маски категорий. В идеале должно остаться только небольшое кол-во исключений, из-за дублирования одних лексем в разных категориях. Карегориможно связать с поставщиками, если они используют одинаковую аббревиатуру во всех наименованиях у себя. Но это сильно увеличит объем ручных работ.
15 авг 04, 20:09    [882899]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Именно этим я щас и занят.
Есть проблемы - например некоторые дозировки указаны без граммов, придется ломать голову над этим.
Но вопрос для меня - как использовать в кач-ве входного параметра функции таблицу.
Хочу сделать таблицу ("что менять", "на что менять") и давать ее в кач-ве входного параметра. Можно ли это?
wBr Grigoriy Gruben
15 авг 04, 20:31    [882908]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Возникло еще два вопроса:
1.Можно ли использовать функцию внутри себя (рекурсия)
2. Может ли быть таблийца входным и выходным параметром функции.
Если да на оба, то это здорово
wBr Grigoriy Gruben
15 авг 04, 21:43    [882938]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
по поводу таблицы замещения, эту фичу можно использовать только для переменных, для таблиц она не подходит, потому как каждая строка сопоставляется с каждой... таким образом замещается или (*) или @

как аргумент использовать нельзя, в функциях можно работать только с табличными переменными.

рекурсию использовать можно, но вложенность не более 32 уровней.

таблица выходным параметром быть может, входным нет.
БОЛ Create Function.

теперь по функциям... заведите постоянную таблицу замещения, в функции ей можно будет пользоваться... функция получается такая
alter FUNCTION dbo.fn_ReplaceTrash(@Where char(255), @type varchar(100) = null)
returns char(255)
AS
BEGIN
select @Where=Replace(@Where,Was,Will) from TrashSymb where type = isnull(@type,type)
Return (@Where)
END
у вас же не заменяется, потому что нужно значение реплейсов нужно присваивать тойже переменной.

таблица
create table TrashSymb (Was Char(10), Will Char(10), type varchar(100) default '')
INSERT INTO TrashSymb VALUES ('(*)','')
INSERT INTO TrashSymb VALUES ('@','')
create table dictp (sname varchar(100), mname varchar(100))
insert into dictp values('fdsajklrew @ fdreui (*) fdsre ((*)) fdsrew ','')

update DictP
set Mname=dbo.fn_ReplaceTrash(Sname)
select Top 10 * from DictP

и на последок
если добавите
INSERT INTO TrashSymb VALUES ('((*))','')
то до этой строки у вас дело не дойдет... для того чтобы дошло, нужно я предполагаю добавить колонку в TrashSymb ord, которая будет указывать порядок при выборке в функции

select @Where=Replace(@Where,Was,Will) from TrashSymb where type = isnull(@type,type) order by ord

для спящего время бодрствования равносильно сну
16 авг 04, 07:56    [883069]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Алексей2003
рекурсию использовать можно, но вложенность не более 32 уровней.
Да, эту месагу она мне выдала, но так и не вышло у меня использовать рекурсию. Я хотел заменять зяпятые на точки в местах, где и слева и справа - цифры.
Написал функцию:
Create Function dbo.fn_Cup2Dot (@S varchar(255))
returns varchar(255)
as 
Begin
declare @p1 int
declare @Symb varchar(1)
declare @retu varchar(255)
 set @Symb=','
 set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@s)
 if @p1>0 
  begin
    set @retu= substring(@s,0, @p1+1)+'.'+substring(@s,@p1+2, Len(@s)-@p1+3)
  end else 
  begin
    set @retu=@S
  end
Return @Retu
End
Go
Но она сработает лишь на первом вхождении.
Алексей2003

... для того чтобы дошло, нужно я предполагаю добавить колонку в TrashSymb ord, которая будет указывать порядок при выборке в функции

Разве того порядка, который в самой таблице - недостаточно? Я имею ввиду порядок добавления.
16 авг 04, 10:30    [883332]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
1. еще раз говорю, что чтобы обновлялась не только на первом вхождении, нужно присваивать значение тойже переменной, которую используете (строковая) справа от знака равенства
2. может и не хватит =\ может выбрать записи в той последовательности, в которой ему удобно... (с точки зрения быстродействия)
зачем анализировать, что это первая запись, это вторая... если таблица больше одной страницы, то в принципе они могут чередоваться.


для спящего время бодрствования равносильно сну
16 авг 04, 10:51    [883407]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@s)

Как же тут присвоить то? Я ж число в рез-те получу, а не строку.
wBr Grigoriy Gruben
16 авг 04, 11:59    [883660]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а пример функции с рекурсией? там нет рекурсии на нее саму :)
или я чего недопонял


для спящего время бодрствования равносильно сну
16 авг 04, 12:01    [883666]     Ответить | Цитировать Сообщить модератору
 Re: Приведение таблицы строк к единому виду, помогите плиз  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Вот как я хотел:
Create Function dbo.fn_Cup2Dot (@S varchar(255))
returns varchar(255)
as
Begin
declare @p1 int
declare @Symb varchar(1)
declare @retu varchar(255)
set @Symb=','
set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@s)
if @p1>0
begin
While dbo.fn_Cup2Dot (@retu)<>@retu
begin
set @retu= substring(@s,0, @p1+1)+'.'+substring(@s,@p1+2, Len(@s)-@p1+3)
set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@s,@p1+1)
end
end else
begin
set @retu=@S
end
Return @Retu
End
Go
wBr Grigoriy Gruben
16 авг 04, 12:33    [883810]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить