powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз
53 сообщений из 53, показаны все 3 страниц
Приведение таблицы строк к единому виду, помогите плиз
    #32635221
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hell'0 W0RLD! :)
Есть таблица с кучей строк - наименования препаратов от разных поставщиков , Сводный прайс поставщиков(СПП). 35000 строк
И есть таблицы - номенклатурный справочник предприятия(НСП). 5 000 строк
Необходимо для каждой позиции из НСП найти все аналоги из СПП, если они есть.
Проблема заключается в том, что каждый поставщик использует свой стиль написания наименований.
Вот пример из СПП, где один препара имеет несколько написаний:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
5-НОК 0,05 N50 ДРАЖЕ
5-НОК 50МГ N50 ТАБЛ П/ОБ
5-НОК 50МГ ТАБ. Х50
5-НОК №50,ТАБ
5-Нок др. 50мг N50
5-НОК ТАБ. П/О 50МГ №50
5-НОК ТАБ. П/О 50МГ №50
5-НОК ТАБ.П/О 0.05Г N50
5-НОК ТАБЛ. П/О 50МГ N50  РОССИЯ-СЛОВЕНИЯ
5-НОК ТАБЛ. П/О 50МГ N50 СЛОВЕНИЯ
Попытка вытянуть все явные одинаковости неудачна - из 35 000 СПП лишь 300 четко соответсвуют наименованиям из НСП.
Т.о. приходится решать задачу унификации написания наименований.
Если сокращения я еще могу исправить - напишу запрос для каждого поставщика, где буду исправлять "таб", "табл", "тб." на "таблетка"(или ампула, флакон, крем, гель и т.п.), то с цифрами ГОРАЗДО сложнее - как видно из примера, даже Номер все пишут по-разному (Х50, N50, №50), не говоря уже о разделителе дробной части (, или . ) и дозировке ( 50 МГ, 0,05 Г)
И еще есть проблема порядкового следования - у одного идет 0,05 и потом ТАБ, а у другого наоборот.
---
Сначала мне казалось, что replace, patindex, charindex меня спасут...
Но когда я накорябал 200 строк одних реплейсов и кол-во уникальных записей упало с 35 до 32 тыс, я понял - неправильным путем иду.
Может кто-то решал подобную задачу, мож у кого есть свежие идеи или ссылки на свежие идеи...
Хелп...
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635321
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только вручную.
Или потребуйте от поставщиков критерий - пусть шлют артикул какой-нибуть.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635403
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое уточнение - поставщики плевать хотели на мои требования - "мы не станем менять справочники из-за такой мелочи".
второе уточнение- сейчас я решаю задачу именно ручным методом. Но если мне удасться автоматически уменьшить кол-во неидентичных записей до меньшего, чем в НСП, то это уже успех, т.к. можно уже выставлять соответсвия в обратную сторону, а это много быстрее...
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635422
Chuveljov Andrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У каждого поставщика свой справочник?
Так составьте таблицу соответствия.

А вообще на лекарства (я правильно понял, это лекартсва) существует вполне едиообраный способ написания - так как они внесены в реестр Минздрава. Всё остальное - от лукавого.

___________________
Всё вышеизложенное есть моё частное мнение и не претендует на полноту изложения.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635466
r2d2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать функцию нечеткого сравнения, в инете где-то болтается.
на входе две строки на выходе степень схождения
если ну очень надо, а искать лень - могу скинуть
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635467
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваша проблема очень хорошо рассмотрена в топике "Убей двойника". Там речь немного о другом, но смысл тот же.
Если вкратце -- человеческие ошибки придется исправлять человекам, вы можете лишь ускорить этот процесс с помощью крутых алгоритмов подбора вероятных двойников.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635497
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можете попробовать функцию DIFFERENCE, она только для латинских букв, но не в этом проблема. Она очень грубая, толку никакого...
Если решитесь попробовать, могу Вам кинуть свою функцию замены русских букв на латинские.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635574
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечу всем по порядку.
1. Chuveljov AndrewУ каждого поставщика свой справочник?
Так составьте таблицу соответствия.

А вообще на лекарства (я правильно понял, это лекартсва) существует вполне едиообраный способ написания - так как они внесены в реестр Минздрава. Всё остальное - от лукавого.
Представляете себе 35 000 раз выставлять соответсвия? Я почти так и делаю, но это же гемор невообразимый!
А насчет реестра Минздрава - да, я тоже эту мантру знаю и повторяю ее. Но реальность такова, какой ее чувствует орган, а не какой изображает фотография :))
2. r2d2Можно попробовать функцию нечеткого сравнения, в инете где-то болтается.
на входе две строки на выходе степень схождения
если ну очень надо, а искать лень - могу скинуть
Это дело я долго изучал - не годится. Дело в том, что для этой функции разница в номере (№10, №20) равнозначна разнице в написании номера (№10, Х10) Что не есть гут.
Николай МВВаша проблема очень хорошо рассмотрена в топике "Убей двойника". Там речь немного о другом, но смысл тот же.
...
Еще можете попробовать функцию DIFFERENCE, она только для латинских букв, но не в этом проблема. Она очень грубая, толку никакого...

Надо посмотреть. Только это не ошибки.
А Difference здесь никак.
---
Мне ведь что надо? Разобрать строку, выделить из нее лексемы и занести их в другие поля. А потом собрать строку из этих полей.
В итоге я просто Напишу
Select Имя+ФормаВыпуска+Дозировка+Номер+Остальное From MySuperTable
Вот дожить бы до "В итоге"...
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635597
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grigoriyпервое уточнение - поставщики плевать хотели на мои требования - "мы не станем менять справочники из-за такой мелочи".
Им не нужно менять справочники, у них уже есть свои идентификаторы товаров, и нужно всего-лишь попросить их прислать. Обычно это так. Разве-что поставщики ваши - челноки, везущие аспирин по таблетке. :-)
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635602
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ай мин, что ДАЖЕ если они будут присылать свой артикульный номер - какая мне разница?
Ну придется сопоставлять артикульные номера, которые у каждого свои. Жэто еще хуже. ЕДИНЫЙ НОМЕР не используется. Такова правда жизни. Таковы программы отсылки прайсов на той стороне.
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32635687
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyАй мин, что ДАЖЕ если они будут присылать свой артикульный номер - какая мне разница?
Ну придется сопоставлять артикульные номера, которые у каждого свои. Жэто еще хуже. ЕДИНЫЙ НОМЕР не используется. Такова правда жизни. Таковы программы отсылки прайсов на той стороне.
wBr Grigoriy Gruben
Разумеется, ЕДИНЫЙ НОМЕР не используется.
Нужно сделать таблицу соответствий НСП артикульным номерам по поставщикам. Для каждого товара - список записей артикул+код_поставщика. Далее при импорте (обновлении прайсов) они будут обновляться по этим номерам. Новые товары, для которых сопоставления нет, будете заносить вручную. Первичная привязка - тоже вручную. Других вариантов всё-равно нет.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636181
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Первичная привязка - вручную."
В этом то и проблема...
Т.е. механизмов, позволяющих? к примеру, вырезать из строки цифры между % и стоящей ранее ^ нет?
Только средствами дельфей смогу?
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636251
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот уже обсуждали подобное:

http://www.sql.ru/forum/actualthread.aspx?tid=89526&hl=%e0%f1%ef%e8%f0%e8%ed
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636432
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grigoriy"Первичная привязка - вручную."
В этом то и проблема...
Т.е. механизмов, позволяющих? к примеру, вырезать из строки цифры между % и стоящей ранее ^ нет?
Только средствами дельфей смогу?
Почему, кое-какие есть, хотя на дельфях проще. А ещё проще с регулярными выражениями, если вы с ними работали.
Можно сделать предварительную обработку, 80-90 % обработается правильно. Но всё-равно нужно будет вручную всё проверить.
В MSSQL для работы со строками см. PATINDEX и SUBSTRING.

Кстати, для этой обработки можно создать правила лдя каждого поставщика отдельно, если их немного и если каждый поставщик использует строго определённое написание, скажем, если у одного всегда 50МГ, а у другого всегда 0.05Г.
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636585
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет patindex и т.д. - см первый постинг темы :)
Насчет раздельного форматирования- именно так я и поступлю
10 постащиков - не проблема
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636804
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу регулярных выражений...
есть в серваке механизмы, позволяющие мне
вместо
реплейса
Х1
Х2
Х3
использовать более короткую форму типа replace(ИМЯ, 'Х[0-9]','№[0-9]')
?
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32636878
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create function dbo.substr(@s varchar( 100 ), @p1 int, @p2 int)
returns varchar( 100 )
as begin
 return substring(@s, @p1, @p2-@p1)
end
go
declare @s varchar ( 100 )
set @s = 'fdsag X3 fdrewq'
select dbo.substr(@s, patindex('%X[0-9]%', @s), charindex(' ', @s, patindex('%X[0-9]%', @s)))
go
drop function dbo.substr
примерно так

для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637119
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patindex не работает в этой функции
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637133
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня "Х" англицкая


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637136
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...Что неудивительно при Ха напечатанном буквой Икс :)
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637227
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create function dbo.findNum(@s varchar( 255 ))
returns varchar( 100 )
as begin
declare @p1 int
declare @p2 int
declare @retu varchar( 255 )
 set @s=@s+' '
 set @p1=patindex('% Х[0-9]%',@s)
 if @p1> 0  
  begin
    set @p2=charindex(' ', @s, @p1+ 2 )
    set @retu= substring(@s, @p1+ 2 , @p2-@p1- 2 ) --+'|'+Str(@p1)+'|'+Str(@p2)+'|'+@s 
  end else 
  begin
    set @retu='NULL'
  end
  if ISNUMERIC(@retu)= 1   set @retu=@retu else  set @retu='NULL'
  return @retu
end
go
declare @s varchar ( 255 )
select dbo.FindNum(NAimEN) From  NewPrice 
Where dbo.FindNum(NAimEN)<>'NULL'
drop function dbo.FindNum

Вот что я сделал из вашей функции - с учетом номера в конце строки и другими неожиданностями :)
Нормально?
Неудобно то, что в Where я тоже юзаю эту функцию - это неверно наверное?
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637261
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос
можно ли переделать функцию так, чтобы вторым парметром шел не просто символ (Х или N), а набор символов, который может означать номер?
Например, [Х, N, №]

wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637273
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patindex не работает в этой функции
Не все что угодно можно использовать в качестве параметров для функций и процедур

Например, [Х, N, №]
Собственно и [ХN№]
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637310
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с Patindex разобрались, всё ОК
А вот с [NХ№] не совсем...
set @Symb='[NХ№]'
set @p1=patindex('% '+@Symb+'[0-9]%',@s)
дает 0 всегда.
т.е.
[NХ№][0-9]
недопустимая конструкция?
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32637319
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за режим чата, но правильно всё же
[N,Х,№]
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #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
Приведение таблицы строк к единому виду, помогите плиз
    #32651025
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 @retu = @s
 set @Symb=','
 set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@retu)
 if @p1> 0  begin
  While dbo.fn_Cup2Dot (@retu)<>@retu begin
   set @retu= substring(@retu, 0 , @p1+ 1 )+'.'+substring(@retu,@p1+ 2 , Len(@retu)-@p1+ 3 )
   set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@retu,@p1+ 1 )
  end 
 end else begin
  set @retu=@S
 end
 Return @Retu
End
а так??


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32651030
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но тут и рекурсия не нужна...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 @retu = @s
 set @Symb=','
 set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@retu)
 while @p1> 0  begin
  set @retu= substring(@retu, 0 , @p1+ 1 )+'.'+substring(@retu,@p1+ 2 , Len(@retu)-@p1+ 3 )
  set @p1=patindex('%[0-9]'+@Symb+'[0-9]%',@retu,@p1+ 1 )
 end
 Return @Retu
End


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Приведение таблицы строк к единому виду, помогите плиз
    #32651786
Grigoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, этот вариант проще и правда
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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