SQL

Поиск клиентов с ФИО на латинице

Время прочтения: 3 мин.

В разных базах данных информация может отображаться как на кириллице, так и латинице. Например, у клиентов компании может быть ФИО указано на английском языке и что если возникнет задача посчитать количество таких людей в выборке с ФИО на кириллице?

Пример таблицы с данными, где ФИО клиентов может быть указана как на кириллице:

Один из вариантов поиска — это использовать оператор LIKE в SQL. Им можно перебрать все латинские буквы на наличие их в ФИО. Запрос будет выглядит следующим образом:

SELECT [Компания]
      ,[Статус Клиента]
      ,[Продукт]
      ,[ДР]
      ,[ФИО]
  FROM [Клиенты]
  where             [ФИО] like '%A%'
			or [ФИО] like '%P%'
			or [ФИО] like '%S%'
			or [ФИО] like '%V%'
			or [ФИО] like '%W%'
			or [ФИО] like '%M%'
			or [ФИО] like '%C%'
			or [ФИО] like '%K%'
                                     ………. и так далее по всем латинским буквам

После выполнения такого запроса будет сформирована таблица со списком клиентов с ФИО на латинице:

Но этот вариант по структуре написания выглядит громоздко, поэтому для решения подобных задач был написан скрипт для перевода. Далее прилагаем сам скрипт.

При первом запуске скопируйте себе эту функцию:

CREATE FUNCTION [arb].[Translate]
(
	@@String VarChar(max)
)
RETURNS VarChar(max)
AS
BEGIN
DECLARE @TransTable TABLE 
(
		 Rus char
		,Lat VarChar(2)
		)
INSERT @TransTable 
          SELECT 'А','A'
UNION ALL SELECT 'Б','B'
UNION ALL SELECT 'В','V'
UNION ALL SELECT 'Г','G'
UNION ALL SELECT 'Д','D'
UNION ALL SELECT 'Е','E'
UNION ALL SELECT 'Ё','YO' 
UNION ALL SELECT 'Ж','ZH'
UNION ALL SELECT 'З','Z'
UNION ALL SELECT 'И','I'
UNION ALL SELECT 'Й','Y'
UNION ALL SELECT 'К','K'
UNION ALL SELECT 'Л','L'
UNION ALL SELECT 'М','M'
UNION ALL SELECT 'Н','N'
UNION ALL SELECT 'О','O'
UNION ALL SELECT 'П','P'
UNION ALL SELECT 'Р','R'
UNION ALL SELECT 'С','S'
UNION ALL SELECT 'Т','T'
UNION ALL SELECT 'У','U'
UNION ALL SELECT 'Ф','F'
UNION ALL SELECT 'Х','KH'
UNION ALL SELECT 'Ц','C'
UNION ALL SELECT 'Ч','CH'
UNION ALL SELECT 'Ш','SH'
UNION ALL SELECT 'Щ','SH'
UNION ALL SELECT 'Ъ',''''
UNION ALL SELECT 'Ы','Y'
UNION ALL SELECT 'Ь',''''
UNION ALL SELECT 'Э','E'
UNION ALL SELECT 'Ю','YU'
UNION ALL SELECT 'Я','YA'

DECLARE @Result Varchar(max)
SET @Result = @@String

SELECT @Result = Replace(@Result,Upper(Rus) COLLATE Cyrillic_General_CS_AS,Upper(Lat))
FROM @TransTable WHERE @@String like '%' + Rus + '%'
SELECT @Result = Replace(@Result,Lower(Rus) COLLATE  Cyrillic_General_CS_AS,Lower(Lat))
FROM @TransTable WHERE @@String like '%' + Rus + '%'
RETURN @Result
END

После выполнения скрипта, в вашей базе данных отобразится функция:

Чтобы ее использовать, нужно ввести

[База Данных].[Ваша_схема].[Translate](СтолбецНаКоторыйПрименяемФункцию)

В скрипте это выглядит так:

SELECT [Компания]
      ,[Статус Клиента]
      ,[Продукт]
      ,[ДР]
      ,[ФИО]
  FROM [Клиенты]
  WHERE [ФИО] = [DB_Name].[dbo].[Translate]([ФИО])

Чтобы воспользоваться этой функцией снова, в другой задаче, нет необходимости писать скрипт заново. Она будет храниться у вас в базе данных до тех пор, пока вы ее сами не удалите. Ей может пользоваться любой сотрудник, имеющий доступ к этой базе данных, для этого ему нужно всего лишь знать путь к функции и ее название. В нашем случае она называется так – [База Данных].[Ваша_схема].[Translate]

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

Советуем почитать