powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз
25 сообщений из 53, страница 2 из 3
Приведение таблицы строк к единому виду, помогите плиз
    #32637413
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за режим чата, но правильно всё же
[N,Х,№]

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

Example
LIKE 'abc[def]' - Means abcd, abce, and abcf
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637951
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё верно, а у меня либо Х50, либо №50, либо N50
Значит через запятую, тем более у меня сработало :)
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637959
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
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! Х русская везде!

для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638023
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня тоже...странно... Но ладно, теперь я буду дозировку искать, там сложнее - МКГ, МГ, Г и МЛ стоят сзади цифры.
reverse помог
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638057
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё верно, а у меня либо Х50, либо №50, либо N50
Значит через запятую, тем более у меня сработало :)

Запятая в вашем случае означает что будут искаться варианты
Х50
№50
N50
и ,50
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638076
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня тоже...странно... Но ладно, теперь я буду дозировку искать, там сложнее - МКГ, МГ, Г и МЛ стоят сзади цифры.
reverse помог

By the way
Я бы для начала распарсил строку на лексемы.
Каждой лексеме сопоставил бы еще скажем так глобальную лексему, т.е. все МКГ, МГ, Г и МЛ свел к лексеме ну скажем МГ.
А вопрос о совпадение наименований решал бы на основе того, сколько лексем из конкретного имени совпадает с минимально допустимым для данного имени.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638179
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory
Я бы для начала распарсил строку на лексемы.
так я и хочу сделать уже 4 месяца :))
Glory
Каждой лексеме сопоставил бы еще скажем так глобальную лексему, т.е. все МКГ, МГ, Г и МЛ свел к лексеме ну скажем МГ.
Так и сделаю - мкг превращу в граммы, мг тоже в граммы. Из-за того, что некоторые поставщики пишут граммы без Г - 1.0 и всё.
Glory
А вопрос о совпадение наименований решал бы на основе того, сколько лексем из конкретного имени совпадает с минимально допустимым для данного имени.

Ой, вот тут фиг его знает...
Я хочу вообще полного совпадения достичь...Но есть мусор типа точки-запятые, думаю 500-1000 преобразований мне гарантированы.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638190
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так вы разбирайте по несколько заходов... в первый заход находятся жестко определенные лексемы... а за второй то что осталось... и куда это можно присобачить... а лексемы хранить в той же таблице... поля небольшого размера...


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638242
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так я и хочу сделать уже 4 месяца :))
Ну так в чем проблема? Принимаем что разделить лексем - это пробел. Определяем список шумовых симвоов/слов. И вперед
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32638430
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я поступил несколько иначе - я заменил пробел, точку, запятую косую на ^символ^
Т.о. слова гарантированно разделены крышками
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32643229
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поднимаю тему еще по одному вопросу:
как мне сделать множественный реплейс типа
заменить "таб.", "табл." на "таблетка"?
делать 2 реплейса или есть возможность одним?
и второе - тут вы сказали, что если я пишу [АБВ], то имеются ввиду буквы А, Б и В.
А если надо сочетания найти? Типа [ТАБЛ, ТАБ] и т.п.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32643254
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
организовать типа этого... :)


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32644478
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица в кач-ве аргумента? Хм...
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650054
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не выходит каменный цветок
Вот функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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
Вот временная таблица (как реализовать ее иначе - не знаю) с тем, что и на что надо менять:
Код: plaintext
1.
2.
create table #TrashSymb (Was Char( 10 ), Will Char( 10 ))
INSERT INTO #TrashSymb VALUES ('(*)','')
INSERT INTO #TrashSymb VALUES ('@','')
А вот запрос:
Код: plaintext
1.
2.
update DictP
set Mname=dbo.fn_ReplaceTrash(Sname,was,will) from #TrashSymb
select Top  10  * from DictP
Так вот - если во временной таблице одна строка, то всё меняет, но это и без функции можно реализовать.
А если больше одной строки - то не меняет.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650057
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дополнение - изменения происходят только согласно последней паре.
Т.е. @ меняется, а (*) нет

wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650078
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно использовать как аргумент функции таблицу?
CREATE FUNCTION dbo.fn_ReplaceTrash(@Where char(255), @Tab Table)
не прокатило

wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650104
Лео
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не прав, но мне кажется, что можно разложить имя на составляющие. После разглядывания примера названий лекарств приходит желание их систематизировать по категориям. Ведь каждое слово названия относится к определенной категории (вес, производитель, название). Разделить на слова можно пробелами, табуляторами переводами каретки и проч., что у Вас может оказатся. Составляем список категорий +1 на мусор. делим строку на слова. У каждой категоии есть маска, проверяем и относим слово к одной или нескольким категориям. Просматриваем список категорий, там, где есть дублирование, разбираемся вручную. Просматриваем список того, что не вошло никуда, дополняем маски категорий. В идеале должно остаться только небольшое кол-во исключений, из-за дублирования одних лексем в разных категориях. Карегориможно связать с поставщиками, если они используют одинаковую аббревиатуру во всех наименованиях у себя. Но это сильно увеличит объем ручных работ.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650108
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно этим я щас и занят.
Есть проблемы - например некоторые дозировки указаны без граммов, придется ломать голову над этим.
Но вопрос для меня - как использовать в кач-ве входного параметра функции таблицу.
Хочу сделать таблицу ("что менять", "на что менять") и давать ее в кач-ве входного параметра. Можно ли это?
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650122
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникло еще два вопроса:
1.Можно ли использовать функцию внутри себя (рекурсия)
2. Может ли быть таблийца входным и выходным параметром функции.
Если да на оба, то это здорово
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650205
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу таблицы замещения, эту фичу можно использовать только для переменных, для таблиц она не подходит, потому как каждая строка сопоставляется с каждой... таким образом замещается или (*) или @

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

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

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

теперь по функциям... заведите постоянную таблицу замещения, в функции ей можно будет пользоваться... функция получается такая
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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
у вас же не заменяется, потому что нужно значение реплейсов нужно присваивать тойже переменной.

таблица
Код: plaintext
1.
2.
3.
4.
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 ','')

Код: plaintext
1.
2.
update DictP
set Mname=dbo.fn_ReplaceTrash(Sname)
select Top  10  * from DictP

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

Код: plaintext
select @Where=Replace(@Where,Was,Will) from TrashSymb where type = isnull(@type,type) order by ord

для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650368
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей2003рекурсию использовать можно, но вложенность не более 32 уровней.
Да, эту месагу она мне выдала, но так и не вышло у меня использовать рекурсию. Я хотел заменять зяпятые на точки в местах, где и слева и справа - цифры.
Написал функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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, которая будет указывать порядок при выборке в функции

Разве того порядка, который в самой таблице - недостаточно? Я имею ввиду порядок добавления.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650428
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. еще раз говорю, что чтобы обновлялась не только на первом вхождении, нужно присваивать значение тойже переменной, которую используете (строковая) справа от знака равенства
2. может и не хватит =\ может выбрать записи в той последовательности, в которой ему удобно... (с точки зрения быстродействия)
зачем анализировать, что это первая запись, это вторая... если таблица больше одной страницы, то в принципе они могут чередоваться.


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650593
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@s)

Как же тут присвоить то? Я ж число в рез-те получу, а не строку.
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650596
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а пример функции с рекурсией? там нет рекурсии на нее саму :)
или я чего недопонял


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32650692
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как я хотел:
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
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]