Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли упростить код? / 11 сообщений из 11, страница 1 из 1
29.01.2018, 16:33
    #39592856
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Здравствуйте.
При создании поля использую следующий код:
Код: sql
1.
SELECT  (CASE WHEN Owner LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN OR Owner LIKE '%"%' THEN '' ELSE STUFF(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(Owner)), ' ', CHAR(1) + ' '), ' ' + CHAR(1), ''), CHAR(1), ''),1,CHARINDEX(' ',REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(Owner)), ' ', CHAR(1) + ' '), ' ' + CHAR(1), ''), CHAR(1), ''),1),'') END) AS LastName FROM Table



Таблица с клиентами, которые записаны как Иванов Иван Иванович или ООО "Рога и копыта". Использую
CASE - для исключения организаций
LTRIM(RTRIM(Owner) - для удаления пробелов в начале и конце строки
REPLACE(REPLACE(REPLACE... - для удаления лишних пробелов внутри строки
STUFF - для обрезки фамилий

Код работает, но больно уж громоздкий получился, можно ли его как-то упростить, сделать компактнее?
...
Рейтинг: 0 / 0
29.01.2018, 16:50
    #39592872
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
ypmail,

крайне странно, что у вас не различаются ФЛ и ЮЛ,
посмотрите ваши таблицы, может найдется признак
...
Рейтинг: 0 / 0
29.01.2018, 17:04
    #39592885
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Критикypmail,

крайне странно, что у вас не различаются ФЛ и ЮЛ,
посмотрите ваши таблицы, может найдется признак
Такого признака точно нет, это данные из файла Excel, которые нужно импортировать в некую программу для дальнейшей подготовки писем клиентам. Поэтому "Уважаемый(ая) ООО "Рога и копыта" будут исключаться, останутся только Иваны Иванычи, по ЮЛ будет отдельная рассылка.
...
Рейтинг: 0 / 0
29.01.2018, 17:14
    #39592887
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
ypmail,
Пришли тут, вывалили свое дендро-фекальное решение... Не код - а жуть какой-то - ни одного переноса строки!

Ну, поржали, и хватит.

подсказка есть CROSS APPLY ( SELECT [name] = ... ) и есть всякие CHARINDEX/PATHINDEX, REVERSE.
Можно и без последнего.

Что должен возвращать запрос на тестовых данных? Например таких?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
WITH
t AS (
  SELECT
    [name] = 'Муаммар Мохаммед Абдель Салям Хамид Абу Меньяр аль-Каддафи'
  UNION ALL
  SELECT
    [name] = 'Бендер-Задунайский Остап Ибрагимович'
  UNION ALL
  SELECT
    [name] = 'Воробьянинов Ипполит "Киса" Матвеевич'
  UNION ALL
  SELECT
    [name] = 'ООО "Рога и Копыта"'
)
SELECT
  [LastName] = CASE 
    WHEN [name] LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN OR [name] LIKE '%"%' THEN '' 
    ELSE STUFF( REPLACE( REPLACE( REPLACE( LTRIM( RTRIM( [name] ) ), ' ', CHAR(1) + ' ' ), ' ' + CHAR(1), '' ), CHAR(1), '' ), 1, CHARINDEX( ' ',REPLACE( REPLACE( REPLACE( LTRIM( RTRIM( [name] ) ), ' ', CHAR(1) + ' ' ), ' ' + CHAR(1), '' ), CHAR(1), '' ),1 ),'' )
  END 
FROM
  t
...
Рейтинг: 0 / 0
29.01.2018, 17:39
    #39592912
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Первые 2 записи выводит как надо
Третью тоже как надо, ибо не надо всяких кис в кавычках в имя вписывать, да и не встречал я в документах имён в кавычках.
Четрвёртую отфильтровало т.к. есть ОО и кавычки - это тоже нормально.
Даже если что-то лишнее окажется без значения, всё равно легче пробежаться по данным после импорта и поправить, чем вручную вносить все записи.

Всё работает как надо! Компактнее код сделать возможно?
...
Рейтинг: 0 / 0
29.01.2018, 17:44
    #39592914
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
ypmailКомпактнее код сделать возможно?
Компактнее - нет. Нагляднее - да.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  [LastName] = CASE 
    WHEN [name] LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN OR [name] LIKE '%"%' THEN '' 
    ELSE RIGHT( [clean_name], LEN( [clean_name] ) - CHARINDEX( ' ', [clean_name] ) )
  END 
FROM
  t
  CROSS APPLY (
    SELECT
      [clean_name] = REPLACE( REPLACE( REPLACE( LTRIM( RTRIM( [name] ) ), ' ', CHAR(1) + ' ' ), ' ' + CHAR(1), '' ), CHAR(1), '' )
  ) ss


Но... в целом решение так себе, если например, вдруг появится "XXI-век Технолоджис ПАО"
...
Рейтинг: 0 / 0
29.01.2018, 17:54
    #39592918
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Руслан ДамировичНо... в целом решение так себе, если например, вдруг появится "XXI-век Технолоджис ПАО"
Согласен, все LIKE не пропишешь, но лучше уж так чем вручную
Код: sql
1.
    WHEN [name] LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN OR [name] LIKE '%[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN OR [name] LIKE '%"%' THEN ''
...
Рейтинг: 0 / 0
29.01.2018, 18:47
    #39592941
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
ypmailСогласен, все LIKE не пропишешь, но лучше уж так чем вручную

Вообще-то я намекаю, что твоя задача - из разряда тыканья пальцем в небо.
Без всякого сарказма желаю удачи в нелегком деле E T L.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH
t AS (
  SELECT
    [name] = 'Муаммар Мохаммед Абдель Салям Хамид Абу Меньяр аль-Каддафи'
  UNION ALL
  SELECT
    [name] = 'Бендер-Задунайский Остап Ибрагимович'
  UNION ALL
  SELECT
    [name] = 'Воробьянинов Ипполит "Киса" Матвеевич'
  UNION ALL
  SELECT
    [name] = 'ООО "Рога и Копыта"'
  UNION ALL
  SELECT
    [name] = 'XXI-век Технолоджис ПАО'
  UNION ALL
  SELECT
    [name] = '109-й мотострелковый стройбат'
  UNION ALL
  SELECT
    [name] = 'Sith-Lord Vaider Darth'
)
SELECT
  [LastName] = CASE 
    WHEN ss.[possible_type] = 'Individual' THEN RIGHT( [clean_name], LEN( [clean_name] ) - CHARINDEX( ' ', [clean_name] ) )
    ELSE ''
  END,
  [Type] = ss.[possible_type]
FROM
  t
  CROSS APPLY (
    SELECT
      [clean_name] = REPLACE( REPLACE( REPLACE( LTRIM( RTRIM( [name] ) ), ' ', CHAR(1) + ' ' ), ' ' + CHAR(1), '' ), CHAR(1), '' ),
      [possible_type] = CASE
        WHEN [name] LIKE '%"%' THEN 'Legal'
        WHEN [name] LIKE '%[0-9]%' THEN 'Legal'
        WHEN [name] LIKE '%[IVXLCDM]%' AND [name] NOT LIKE '%[ABEFGHJKNOPQRSTUWYZ]%' THEN 'Legal'
        WHEN [name] LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN THEN 'Legal'
        ELSE 'Individual'
      END
  ) ss
...
Рейтинг: 0 / 0
29.01.2018, 20:34
    #39592989
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Руслан ДамировичВообще-то я намекаю, что твоя задача - из разряда тыканья пальцем в небо.
Это я понимаю, вот только для этой задачи решение ещё никто не придумал, а очень хочется заменить ручной ввод хоть какой-то автоматизацией...
...
Рейтинг: 0 / 0
30.01.2018, 10:46
    #39593155
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
ypmailвот только для этой задачи решение ещё никто не придумал, а очень хочется заменить ручной ввод хоть какой-то автоматизацией...
Да тебе прямая дорога в создатели искусственного интеллекта.
Бросай это гиблое дело - автоматизировать не автоматизируемое.
Надо было ограничивать формат данных на этапе ввода, чтобы шаг влево, шаг вправо - расстрел. Ввод двух пробелов подряд - провокация.

Если твоя работа разовая, то "и так сойдет".

Если нет - твой вариант. Тогда слушай сюда:
Найди справочник ОПФ (организационно-правовых форм), сделай из него таблицу полных и сокращенных наименований.
Вот это из кода убери -
Код: sql
1.
WHEN [name] LIKE '[А-Я][А-Я]%' COLLATE Cyrillic_General_BIN THEN 'Legal'


Добавь проверку
Код: sql
1.
WHEN EXISTS( SELECT 1 FROM opf_table opf WHERE t.[name] LIKE '%' + opf.[short_name] + '%' OR t.[name] LIKE '%' + opf.[full_name] + '%' ) THEN 'Legal'


Вот тогда оно заиграет новыми красками лагов и тормозов.
...
Рейтинг: 0 / 0
30.01.2018, 15:13
    #39593399
ypmail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли упростить код?
Руслан Дамирович,
это будет требоваться может раз в полгода, а то и реже, а лагов и тормозов не надо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли упростить код? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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