This is funny, because many years ago, i was looking for something like that (even if my requirements were bit different).
Take a look at below code:
CREATE TABLE AllNames
(
[UserName] varchar(30)
);
INSERT INTO AllNames([UserName])
VALUES('Cakes420'),
('18Jack01'),
('18Jack04'),
('16Jack22'),
('22Jack16'),
('Mapple7609'),
('Chrom44'),
('chrom22'),
('chrom77'),
('013Cake'),
('016Cake'),
('122Cake'),
('123Cake87');
;WITH FourChars AS
(
SELECT 1 LoopNo, ROW_NUMBER() OVER(ORDER BY LOWER([UserName])) rn, LOWER([UserName]) OrigName, SUBSTRING(LOWER([UserName]), 1, 4) Part
FROM AllNames
WHERE LEN([UserName])>4
UNION ALL
SELECT LoopNo +1 LoopNo, rn, OrigName, SUBSTRING(OrigName, LoopNo +1, 4) Part
FROM FourChars
WHERE LEN(OrigName)>= LoopNo+4
)
SELECT *
FROM
(
SELECT Part, STRING_AGG(OrigName, ', ') ComNames
FROM FourChars
GROUP BY Part
) a
WHERE CHARINDEX(',', a.ComNames)>0;
Result:
18ja 18jack01, 18jack04
3cak 123cake87, 013cake
8jac 18jack04, 18jack01
ack0 18jack04, 18jack01
cake cakes420, 122cake, 123cake87, 016cake, 013cake
chro chrom22, chrom44, chrom77
hrom chrom44, chrom22, chrom77
jack 22jack16, 18jack04, 18jack01, 16jack22
db_fiddle[
^]
Good luck!