2012-01-13 7 views
1

私は次の名前を持っているとしましょう:John Smith Alexanderです。 私が手に入れたいJohn Alexander Smith; Smith John Alexander; Alexander Smith John; etc.FirstName、LastName、MiddleNameから単語順列を生成

ミドルネームはそう存在するJohn Smithから、私はちょうどJohn SmithSmith Johnを受けるべきではありません。

また、フルネームには4単語以上が含まれることがありますが、ごくまれにあります。

+0

フルネームに4つ以上の単語が含まれている場合、「ミドルネームルール」は、最初と最後のものを除くすべてに適用されますか? – Pops

+0

@ LordTorgamusまあ、実際にはどちらが中間であるかは関係ありません。私はすべての単語をシャッフルする必要があります。 –

+0

ミドルネームが存在していなければ、あなたがやろうとしていることを本当に誤解していない限り、それは確かに重要です。 – Pops

答えて

2

まず、文字列を破る:

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 

その後の順列を取得:TSQLではない私のデータベースのための

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

ありがとうございました!迅速かつ効率的! –

0
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; 

作品を。もちろん、2つまたは4つの名前の変更なしでは動作しませんし、4つ以上の名前については維持不能になります。

John Richard Johnなどの名前の場合は、それも機能しません。

関連する問題