powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли упростить код?
11 сообщений из 11, страница 1 из 1
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #39592872
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail,

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

крайне странно, что у вас не различаются ФЛ и ЮЛ,
посмотрите ваши таблицы, может найдется признак
Такого признака точно нет, это данные из файла Excel, которые нужно импортировать в некую программу для дальнейшей подготовки писем клиентам. Поэтому "Уважаемый(ая) ООО "Рога и копыта" будут исключаться, останутся только Иваны Иванычи, по ЮЛ будет отдельная рассылка.
...
Рейтинг: 0 / 0
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #39592912
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первые 2 записи выводит как надо
Третью тоже как надо, ибо не надо всяких кис в кавычках в имя вписывать, да и не встречал я в документах имён в кавычках.
Четрвёртую отфильтровало т.к. есть ОО и кавычки - это тоже нормально.
Даже если что-то лишнее окажется без значения, всё равно легче пробежаться по данным после импорта и поправить, чем вручную вносить все записи.

Всё работает как надо! Компактнее код сделать возможно?
...
Рейтинг: 0 / 0
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #39592989
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичВообще-то я намекаю, что твоя задача - из разряда тыканья пальцем в небо.
Это я понимаю, вот только для этой задачи решение ещё никто не придумал, а очень хочется заменить ручной ввод хоть какой-то автоматизацией...
...
Рейтинг: 0 / 0
Возможно ли упростить код?
    #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
Возможно ли упростить код?
    #39593399
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,
это будет требоваться может раз в полгода, а то и реже, а лагов и тормозов не надо
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли упростить код?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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