Blog Post

SQL Server – Generating PERMUTATIONS using T-Sql

Were you ever asked to generate string Permutations using TSql? I was recently asked to do so, and the logic which I could manage to come up at that point is shared in the below script.


DECLARE @Value AS VARCHAR(20) = 'ABCC' --Mention the text which is to be permuted
DECLARE @NoOfChars AS INT = LEN(@Value)
DECLARE @Permutations TABLE (Value VARCHAR(20)) --Make sure the size of this Value is equal to your input string length (@Value)
;

WITH NumTally
AS (
--Prepare the Tally Table to separate each character of the Value.
SELECT 1 Num

UNION ALL

SELECT Num + 1
FROM NumTally
WHERE Num ),
Chars
AS (
--Separate the Characters
SELECT Num,
SUBSTRING(@Value, Num, 1) Chr
FROM NumTally
)
--Persist the Separated characters.
INSERT INTO @Permutations
SELECT Chr
FROM Chars

--Prepare Permutations
DECLARE @i AS INT = 1

WHILE (@i BEGIN
--Store the Permutations
INSERT INTO @Permutations
SELECT DISTINCT --Add DISTINCT if required else duplicate Permutations will be generated for Repeated Chars.
P1.Value + P2.Value
FROM (
SELECT Value
FROM @Permutations
WHERE LEN(Value) = @i
) P1
CROSS JOIN (
SELECT Value
FROM @Permutations
WHERE LEN(Value) = 1
) P2

--Increment the Counter.
SET @i += 1

--Delete the Incorrect Lengthed Permutations to keep the table size under control.
DELETE
FROM @Permutations
WHERE LEN(Value) NOT IN (
1,
@i
)
END

--Delete InCorrect Permutations.
SET @i = 1

WHILE (@i BEGIN
--Deleting Permutations which has not used "All the Chars of the given Value".
DELETE
FROM @Permutations
WHERE Value NOT LIKE '%' + SUBSTRING(@Value, @i, 1) + '%'

--Deleting Permutations which have repeated incorrect character.
DELETE
FROM @Permutations
WHERE LEN(Value) - LEN(REPLACE(Value, SUBSTRING(@Value, @i, 1), '')) != LEN(@Value) - LEN(REPLACE(@Value, SUBSTRING(@Value, @i, 1), ''))

SET @i += 1
END

--Selecting the generated Permutations.
SELECT Value
FROM @Permutations

Hope, this script helps!

Please share your suggestions if you have any to improve this logic.

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating