Создание словосочетаний из имен FirstName, LastName и MiddleName - PullRequest
1 голос
/ 13 января 2012

Допустим, у меня есть следующее имя: John Smith Alexander. Я хочу получить John Alexander Smith; Smith John Alexander; Alexander Smith John; etc.

Отчество не должно существовать, поэтому с John Smith я должен получить только John Smith и Smith John.

Также полное имя может содержать 4 слова или более, но очень редко.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Сначала разбейте строку:

DECLARE @separator char(1)
DECLARE @NameParts TABLE (PartId INT IDENTITY, part varchar(50))
DECLARE @Name varchar(50)
SET @separator = ' '
SET @name = 'John Smith Alexander'
;WITH Parts(pn, start, finish) AS (
  SELECT 1, 1, CHARINDEX(@separator, @Name)
  UNION ALL
  SELECT pn + 1, finish + 1, CHARINDEX(@separator, @Name, finish + 1)
  FROM Parts
  WHERE finish > 0
)
INSERT INTO @NameParts(part)
SELECT SUBSTRING(@Name, start, CASE WHEN finish > 0 THEN finish-start ELSE 50 END)
FROM Parts

Затем получите перестановки:

DECLARE @tokencount int
SELECT @tokencount = COUNT(*) FROM @NameParts

;WITH Subsets AS 
(
SELECT CAST(' ' + part AS VARCHAR(MAX)) Permutation,
CAST(1 AS INT) AS Iteration
FROM @NameParts 
UNION ALL
SELECT Permutation + ' ' + part  AS Permutation, Iteration + 1 AS Iteration
FROM Subsets s 
JOIN @NameParts n ON s.Permutation NOT LIKE '%' + n.part + '%'
)
SELECT STUFF(Permutation,1,1,'') As Perm 
FROM SUBSETS
WHERE Iteration = @tokencount
0 голосов
/ 23 января 2012
SELECT a.name, b.name, c.name 
FROM test a, test b, test c 
WHERE a.name != b.name 
  AND a.name != c.name 
  AND b.name != c.name;

работает для моей базы данных, которая не является tsql. Конечно, это не будет работать без модификации для 2 или 4 имен, и станет недоступным для более чем 4 имен.

Для имен типа John Richard John это тоже не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...