Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Генерация фамилий и отчеств SQL  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
-- Вот, возникла задачка написать генераторы фамилий, отчеств разных родов. Особо ничего в помощь не нашел, посему рожал самостоятельно. Цель было сделать нечто более-менее похожее на реальные данные, идеального соответствия грамматическим правилам не добивался.
-- Выкладываю тут, может кому пригодится, как основа для своих вариантов.
--
-- Итак дано:
-- 1. Таблица фамилий (м. род)
-- 2. Таблица имен (м. род)
-- 3. Таблица имен (ж. род)
-- Имена и фамилии не долго думая надергал тут: http://www.vse-imena.com/ и тут: http://www.vse-familii.com/
-- Дергалка на php откуда-то стянута тоже и слегка доработана напильником, во вложении
-- Для примера будет:

IF OBJECT_ID('tempdb..#tstSurname') IS NOT NULL
    BEGIN 
        DROP TABLE #tstSurname
    END
CREATE TABLE #tstSurname(id BIGINT IDENTITY(1,1),name NVARCHAR(100) NOT NULL,sex TINYINT NULL)
-- SELECT TOP 20 'SELECT N'''+name+''', 0 UNION ALL' FROM tstSurname WHERE id%1500=0 AND sex=0

INSERT INTO #tstSurname
        ( name, sex )
SELECT N'Ардельянов', 0 UNION ALL
SELECT N'Барзман', 0 UNION ALL
SELECT N'Бибикман', 0 UNION ALL
SELECT N'Бохонков', 0 UNION ALL
SELECT N'Бывальцев', 0 UNION ALL
SELECT N'Вилинец', 0 UNION ALL
SELECT N'Гайзлер', 0 UNION ALL
SELECT N'Гладых', 0 UNION ALL
SELECT N'Граков', 0 UNION ALL
SELECT N'Дардалан', 0 UNION ALL
SELECT N'Довжук', 0 UNION ALL
SELECT N'Еманов', 0 UNION ALL
SELECT N'Ионел', 0 UNION ALL
SELECT N'Кокошников', 0 UNION ALL
SELECT N'Кушик', 0 UNION ALL
SELECT N'Маруценко', 0 UNION ALL
SELECT N'Нечесов', 0 UNION ALL
SELECT N'Поваляев', 0 UNION ALL
SELECT N'Русин', 0 UNION ALL
SELECT N'Солосенко', 0

-- Женские фамилии
-- INSERT INTO dbo.#tstSurname
--         ( name,sex )
SELECT  --a,
        CASE WHEN a2 IN ( 'ов', 'ев', 'ин' ) THEN a + 'а'
             WHEN a2 IN ( 'ий', 'ый', 'ой' ) THEN am2 + 'ая'
             ELSE a
        END b, 1
FROM    ( SELECT    name a,
                    RIGHT(name, 2) a2,
                    RIGHT(name, 1) a1,
                    STUFF(name, LEN(name) - 1, 2, '') am2
          FROM      #tstSurname
        ) t

-----------------------------------------------------------

IF OBJECT_ID('tempdb..#tstFirstName') IS NOT NULL
    BEGIN 
        DROP TABLE #tstFirstName
    END
CREATE TABLE #tstFirstName(id BIGINT IDENTITY(1,1),name NVARCHAR(100) NOT NULL,sex TINYINT NULL)
--SELECT TOP 20 'SELECT N'''+name+''', 0 UNION ALL' FROM tstFirstName WHERE id%700=0 AND sex=0

INSERT INTO #tstFirstName
        ( name, sex )
SELECT N'Абдулмаджид', 0 UNION ALL
SELECT N'Авраамий', 0 UNION ALL
SELECT N'Азимджон', 0 UNION ALL
SELECT N'Алекий', 0 UNION ALL
SELECT N'Альбист', 0 UNION ALL
SELECT N'Андриен', 0 UNION ALL
SELECT N'Арин', 0 UNION ALL
SELECT N'Атин', 0 UNION ALL
SELECT N'Бели', 0 UNION ALL
SELECT N'Веньямин', 0 UNION ALL
SELECT N'Гамишабахар', 0 UNION ALL
SELECT N'Дариан', 0 UNION ALL
SELECT N'Ерема-владимир', 0 UNION ALL
SELECT N'Изосим', 0 UNION ALL
SELECT N'Конрад', 0 UNION ALL
SELECT N'Мартин Пол', 0 UNION ALL
SELECT N'Маджд', 0 UNION ALL
SELECT N'Павел-гейза', 0 UNION ALL
SELECT N'Светозар', 0 UNION ALL
SELECT N'Теофиль', 0

-----------------------------------------------------------

IF OBJECT_ID('tempdb..#tstLastName') IS NOT NULL
    BEGIN 
        DROP TABLE #tstLastName
    END
CREATE TABLE #tstLastName(id BIGINT IDENTITY(1,1),name NVARCHAR(100) NOT NULL,sex TINYINT NULL)

-- Мужские отчества
-- INSERT INTO dbo.#tstLastName
--         ( name, sex )
SELECT  --a,
        CASE WHEN CHARINDEX(a1, 'бвгджзклмнпрстфхцчшщ') >= 1 THEN a + 'ович'
        WHEN a1='й' THEN am1+'евич'
        WHEN a1 IN ('ь','а','и','ы','е','у','э','ю') THEN a+'евич'
        WHEN a2 IN ('ия','йя') THEN am1+'евич'
        WHEN a2 IN ('ья','ня') THEN am1+'ич'
        WHEN a1 IN ('я') THEN a+'евич'
        WHEN a1 IN ('о') THEN a+'вич'
        ELSE
        a + 'ович'
        END b, 0
FROM    ( SELECT    name a,
                    RIGHT(name, 1) a1,
                    RIGHT(name, 2) a2,
                    STUFF(name, LEN(name), 1, '') am1
          FROM      #tstFirstName
          WHERE     sex = 0
        ) t

-- Женские отчества
-- INSERT INTO dbo.tstLastName
--         ( name, sex )
SELECT  --a,
        CASE WHEN CHARINDEX(a1, 'бвгджзклмнпрстфхцчшщ') >= 1 THEN a + 'овна'
        WHEN a1='й' THEN am1+'евна'
        WHEN a1 IN ('ь','а','и','ы','е','у','э','ю') THEN a+'евна'
        WHEN a2 IN ('ия','йя') THEN am1+'евна'
        WHEN a2 IN ('ья','ня') THEN a+'новна'
        WHEN a1 IN ('я') THEN a+'евна'
        WHEN a2 IN ('ио') THEN am1+'ева'
        WHEN a2 IN ('ло','ро','до','но','со','то','фо','хо') THEN a+'вна'
        WHEN a1 IN ('о') THEN a+'ева'
        ELSE
        a + 'овна'
        END b, 1
FROM    ( SELECT    name a,
                    RIGHT(name, 1) a1,
                    RIGHT(name, 2) a2,
                    STUFF(name, LEN(name), 1, '') am1
          FROM      #tstFirstName
          WHERE     sex = 0
        ) t


К сообщению приложен файл (index.php - 5Kb) cкачать
1 июл 11, 19:49    [10909070]     Ответить | Цитировать Сообщить модератору
 Re: Генерация фамилий и отчеств SQL  [new]
batic
Member

Откуда: Миллионер из трущоб
Сообщений: 4
kDnZP,

Мне 'Павел-гейза' понравилось. )
1 июл 11, 20:23    [10909215]     Ответить | Цитировать Сообщить модератору
 Re: Генерация фамилий и отчеств SQL  [new]
AndrewVL
Member

Откуда:
Сообщений: 815
есть такая dll-ка

падежи в udf из padeg.dll
2 июл 11, 11:14    [10910908]     Ответить | Цитировать Сообщить модератору
 Re: Генерация фамилий и отчеств SQL  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
AndrewVL
есть такая dll-ка

падежи в udf из padeg.dll
ахтунг!
Новый вирус для MSSQL!
))))))))))))))
2 июл 11, 12:06    [10911049]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Генерация фамилий и отчеств SQL  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Немного под себя заделал

+
declare @Sex char(1)='F' --M или F
declare @FIO varchar(400) 

;WITH F as
(
	select F from (VALUES
	('Смирнов'),('Иванов'),('Кузнецов'),('Попов'),('Соколов'),('Лебедев'),('Козлов'),('Новиков'),('Морозов'),('Петров'),('Волков'),('Соловьев'),('Васильев'),('Зайцев'),('Павлов'),('Семенов'),('Голубев'),('Виноградов'),('Богданов'),('Воробьев'),('Федоров'),('Михайлов'),('Беляев'),('Тарасов'),('Белов'),('Комаров'),('Орлов'),('Киселев'),('Макаров'),('Андреев'),('Ковалев'),('Ильин'),('Гусев'),('Титов'),('Кузьмин'),('Кудрявцев'),('Баранов'),('Куликов'),('Алексеев'),('Степанов'),('Яковлев'),('Сорокин'),('Сергеев'),('Романов'),('Захаров'),('Борисов'),('Королев'),('Герасимов'),('Пономарев'),('Григорьев'),('Лазарев'),('Медведев'),('Ершов'),('Никитин'),('Соболев'),('Рябов'),('Поляков'),('Цветков'),('Данилов'),('Жуков'),('Фролов'),('Журавлев'),('Николаев'),('Крылов'),('Максимов'),('Сидоров'),('Осипов'),('Белоусов'),('Федотов'),('Дорофеев'),('Егоров'),('Матвеев'),('Бобров'),('Дмитриев'),('Калинин'),('Анисимов'),('Петухов'),('Антонов'),('Тимофеев'),('Никифоров'),('Веселов'),('Филиппов'),('Марков'),('Большаков'),('Суханов'),('Миронов'),('Ширяев'),('Александров'),('Коновалов'),('Шестаков'),('Казаков'),('Ефимов'),('Денисов'),('Громов'),('Фомин'),('Давыдов'),('Мельников'),('Щербаков'),('Блинов'),('Колесников'),('Карпов'),('Афанасьев'),('Власов'),('Маслов'),('Исаков'),('Тихонов'),('Аксенов'),('Гаврилов'),('Родионов'),('Котов'),('Горбунов'),('Кудряшов'),('Быков'),('Зуев'),('Третьяков'),('Савельев'),('Панов'),('Рыбаков'),('Суворов'),('Абрамов'),('Воронов'),('Мухин'),('Архипов'),('Трофимов'),('Мартынов'),('Емельянов'),('Горшков'),('Чернов'),('Овчинников'),('Селезнев'),('Панфилов'),('Копылов'),('Михеев'),('Галкин'),('Назаров'),('Лобанов'),('Лукин'),('Беляков'),('Потапов'),('Некрасов'),('Хохлов'),('Жданов'),('Наумов'),('Шилов'),('Воронцов'),('Ермаков'),('Дроздов'),('Игнатьев'),('Савин'),('Логинов'),('Сафонов'),('Капустин'),('Кириллов'),('Моисеев'),('Елисеев'),('Кошелев'),('Костин'),('Горбачев'),('Орехов'),('Ефремов'),('Исаев'),('Евдокимов'),('Калашников'),('Кабанов'),('Носков'),('Юдин'),('Кулагин'),('Лапин'),('Прохоров'),('Нестеров'),('Харитонов'),('Агафонов'),('Муравьев'),('Ларионов'),('Федосеев'),('Зимин'),('Пахомов'),('Шубин'),('Игнатов'),('Филатов'),('Крюков'),('Рогов'),('Кулаков'),('Терентьев'),('Молчанов'),('Владимиров'),('Артемьев'),('Гурьев'),('Зиновьев'),('Гришин'),('Кононов'),('Дементьев'),('Ситников'),('Симонов'),('Мишин'),('Фадеев'),('Комиссаров'),('Мамонтов'),('Носов'),('Гуляев'),('Шаров'),('Устинов'),('Вишняков'),('Евсеев'),('Лаврентьев'),('Брагин'),('Константинов'),('Корнилов'),('Авдеев'),('Зыков'),('Бирюков'),('Шарапов'),('Никонов'),('Щукин'),('Дьячков'),('Одинцов'),('Сазонов'),('Якушев'),('Красильников'),('Гордеев'),('Самойлов'),('Князев'),('Беспалов'),('Уваров'),('Шашков'),('Бобылев'),('Доронин'),('Белозеров'),('Рожков'),('Самсонов'),('Мясников'),('Лихачев'),('Буров'),('Сысоев'),('Фомичев'),('Русаков'),('Стрелков'),('Гущин'),('Тетерин'),('Колобов'),('Субботин'),('Фокин'),('Блохин'),('Селиверстов'),('Пестов'),('Кондратьев'),('Силин'),('Меркушев'),('Лыткин'),('Туров')
	) FIO(F)
),
N_M as (

	select * from (VALUES
	('Алан'),('Александр'),('Алексей'),('Альберт'),('Анатолий'),('Андрей'),('Антон'),('Арсен'),('Арсений'),('Артем'),('Артемий'),('Артур'),('Богдан'),('Борис'),('Вадим'),('Валентин'),('Валерий'),('Василий'),('Виктор'),('Виталий'),('Владимир'),('Владислав'),('Всеволод'),('Вячеслав'),('Геннадий'),('Георгий'),('Герман'),('Глеб'),('Гордей'),('Григорий'),('Давид'),('Дамир'),('Даниил'),('Демид'),('Демьян'),('Денис'),('Дмитрий'),('Евгений'),('Егор'),('Елисей'),('Захар'),('Иван'),('Игнат'),('Игорь'),('Илья'),('Ильяс'),('Камиль'),('Карим'),('Кирилл'),('Клим'),('Константин'),('Лев'),('Леонид'),('Макар'),('Максим'),('Марат'),('Марк'),('Марсель'),('Матвей'),('Мирон'),('Мирослав'),('Михаил'),('Назар'),('Никита'),('Николай'),('Олег'),('Павел'),('Петр'),('Платон'),('Прохор'),('Рамиль'),('Ратмир'),('Ринат'),('Роберт'),('Родион'),('Роман'),('Ростислав'),('Руслан'),('Рустам'),('Савва'),('Савелий'),('Святослав'),('Семен'),('Сергей'),('Станислав'),('Степан'),('Тамерлан'),('Тимофей'),('Тимур'),('Тихон'),('Федор'),('Филипп'),('Шамиль'),('Эдуард'),('Эльдар'),('Эмиль'),('Эрик'),('Юрий'),('Ян'),('Ярослав')
	) FIO(N_M)
),
N_F as
(
	select * from (VALUES
	('Агата'),('Агния'),('Аделина'),('Аида'),('Аксинья'),('Александра'),('Алена'),('Алина'),('Алиса'),('Алия'),('Алла'),('Альбина'),('Амелия'),('Амина'),('Анастасия'),('Ангелина'),('Анна'),('Антонина'),('Ариана'),('Арина'),('Валентина'),('Валерия'),('Варвара'),('Василина'),('Василиса'),('Вера'),('Вероника'),('Виктория'),('Виолетта'),('Владислава'),('Галина'),('Дарина'),('Дарья'),('Диана'),('Дина'),('Ева'),('Евангелина'),('Евгения'),('Екатерина'),('Елена'),('Елизавета'),('Есения'),('Жанна'),('Зарина'),('Злата'),('Илона'),('Инна'),('Ирина'),('Камилла'),('Карина'),('Каролина'),('Кира'),('Клавдия'),('Кристина'),('Ксения'),('Лариса'),('Лейла'),('Лиана'),('Лидия'),('Лилия'),('Лина'),('Лия'),('Любовь'),('Людмила'),('Майя'),('Маргарита'),('Марианна'),('Марина'),('Мария'),('Мелания'),('Мила'),('Милана'),('Милена'),('Мирослава'),('Надежда'),('Наталья'),('Нелли'),('Ника'),('Нина'),('Оксана'),('Олеся'),('Ольга'),('Полина'),('Регина'),('Сабина'),('Светлана'),('София'),('Стефания'),('Таисия'),('Тамара'),('Татьяна'),('Ульяна'),('Эвелина'),('Элина'),('Эльвира'),('Эльмира'),('Эмилия'),('Юлия'),('Яна'),('Ярослава')
	) FIO(N_F)
)
						
select @FIO= case when @Sex='M' 
			 --Фамилия М 
			then (select top 1 F from F ORDER BY NEWID()) 
			--Фамилия Ж
			else (select top 1 F from F ORDER BY NEWID()) +'а'
		end 
		+ ' ' +
		case when @Sex='M' 
			 --Имя М
			 then  (select top 1 N_M from N_M ORDER BY NEWID()) 
			 --Имя Ж
			 else (select top 1 N_F from N_F ORDER BY NEWID()) 
		end 
		+ ' ' +
		case when @Sex='M' 
		then  --Мужские отчества
		(
				SELECT top 1 CASE 
							WHEN CHARINDEX(a1, 'бвгджзклмнпрстфхцчшщ') >= 1 THEN a + 'ович'
							WHEN a1='й' THEN am1+'евич'
							WHEN a1 IN ('ь','а','и','ы','е','у','э','ю') THEN a+'евич'
							WHEN a2 IN ('ия','йя') THEN am1+'евич'
							WHEN a2 IN ('ья','ня') THEN am1+'ич'
							WHEN a1 IN ('я') THEN a+'евич'
							WHEN a1 IN ('о') THEN a+'вич'
							ELSE
							a + 'ович'
						END b
				FROM    ( SELECT    name a,
									RIGHT(name, 1) a1,
									RIGHT(name, 2) a2,
									STUFF(name, LEN(name), 1, '') am1
						  FROM      (select top 1 N_M name from N_M ORDER BY NEWID()) F
						) t
		)
		else -- Женские отчества
		(
				SELECT  top 1
						CASE WHEN CHARINDEX(a1, 'бвгджзклмнпрстфхцчшщ') >= 1 THEN a + 'овна'
						WHEN a1='й' THEN am1+'евна'
						WHEN a1 IN ('ь','а','и','ы','е','у','э','ю') THEN a+'евна'
						WHEN a2 IN ('ия','йя') THEN am1+'евна'
						WHEN a2 IN ('ья','ня') THEN a+'новна'
						WHEN a1 IN ('я') THEN a+'евна'
						WHEN a2 IN ('ио') THEN am1+'ева'
						WHEN a2 IN ('ло','ро','до','но','со','то','фо','хо') THEN a+'вна'
						WHEN a1 IN ('о') THEN a+'ева'
						ELSE
						a + 'овна'
						END  b
				FROM    ( SELECT    name a,
									RIGHT(name, 1) a1,
									RIGHT(name, 2) a2,
									STUFF(name, LEN(name), 1, '') am1
						  FROM     (select top 1 N_M name from N_M  ORDER BY NEWID()) F
						) t
	    ) 
		end 
select @FIO


Сообщение было отредактировано: 4 май 17, 20:08
4 май 17, 20:01    [20458300]     Ответить | Цитировать Сообщить модератору
 Re: Генерация фамилий и отчеств SQL  [new]
rnk
Member

Откуда:
Сообщений: 126
Тоже когда-то занимался автогенерацией из справочника, мне особенно нравились результаты типа: Зильберман Темирбек Святославович или Янушаускене Сулико Шериг-ооловна )
5 май 17, 15:57    [20461289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить