Hi @Debilon ,
Regardless of the resistance here is XML/XQuery based solution.
It satisfies all 3 required business rules.
You probably noticed that the JSON based solution is not satisfying rule #2:
- if the string is only 3 words, i do not need to add a semicolon
SQL
-- DDL and sample data population, start
DECLARE @tbl AS TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, tokens VARCHAR(100));
INSERT INTO @tbl VALUES
('TEXAS BEATRICE J; TEXAS DONNA RAE'),
('BRODWAY STEVEN M BRODWAY MOLLY M BRODWAY ROBERT W'),
('RIBEYE JOHN K; RIBEYE JERRY C; RIBEYE CONSTANCE'),
('ROMERO MARIO R; ROMERO SILVIA E'),
('GAITAN KATHLEEN PENNY FELTON NICOLE GAITAN'),
('SHMUCKLER ARTHUR JOHN AKA A J'),
('One Two Three');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = SPACE(1);
SELECT t.*, cnt --, t0.*
, REPLACE(c.query('
for $x in /root/r
let $pos := count(/root/r[. << $x[1]]) + 1
return if ($pos mod 3 = 0 and sql:column("t2.cnt")!=3) then concat(data($x), ";")
else data($x)
').value('.', 'VARCHAR(100)'),';;',';') AS Result
, aka
FROM @tbl AS t
-- find AKA position
CROSS APPLY (SELECT CHARINDEX(' aka ',tokens)) AS x(aka_pos)
-- separate before and after AKA
CROSS APPLY (SELECT
IIF(aka_pos > 0, LEFT(tokens, aka_pos - 1), tokens),
IIF(aka_pos > 0, RIGHT(tokens, LEN(tokens) - aka_pos - 4), null)
) AS t0(tokens, aka)
CROSS APPLY (SELECT TRY_CAST('<root><r>' +
REPLACE(t0.tokens, @separator, '</r><r>') +
'</r></root>' AS XML)) AS t1(c)
CROSS APPLY (SELECT c.value('count(/root/r)', 'INT')) AS t2(cnt);
Output
+----+------------------------------------------------------+------+
| ID | Result | aka |
+----+------------------------------------------------------+------+
| 1 | TEXAS BEATRICE J; TEXAS DONNA RAE; | NULL |
| 2 | BRODWAY STEVEN M; BRODWAY MOLLY M; BRODWAY ROBERT W; | NULL |
| 3 | RIBEYE JOHN K; RIBEYE JERRY C; RIBEYE CONSTANCE | NULL |
| 4 | ROMERO MARIO R; ROMERO SILVIA E; | NULL |
| 5 | GAITAN KATHLEEN PENNY; FELTON NICOLE GAITAN; | NULL |
| 6 | SHMUCKLER ARTHUR JOHN | A J |
| 7 | One Two Three | NULL |
+----+------------------------------------------------------+------+