Well, I know that this question was answered, but I thought that I would show a clean T-SQL solution as an alternative.
DECLARE @yourTable TABLE (val VARCHAR(100)); INSERT INTO @yourTable VALUES ('[anything can be here]'), ('[{anything can be here}]'), ('[anything can be here}]'), ('[{anything can be here]'); WITH CTE_Brackets AS ( SELECT val, CASE WHEN CHARINDEX('{',val) > 0 THEN CHARINDEX('{',val) END AS L_curly, CASE WHEN CHARINDEX('}',val) > 0 THEN CHARINDEX('}',val) END AS R_curly, CASE WHEN CHARINDEX('[',val) > 0 THEN CHARINDEX('[',val) END AS L_bracket, CASE WHEN CHARINDEX(']',val) > 0 THEN CHARINDEX(']',val) END AS R_bracket FROM @yourTable ), CTE_string AS ( SELECT val, L_curly, R_curly, L_bracket, R_bracket, SUBSTRING(val,start_pos,end_pos - start_pos) val_string FROM CTE_Brackets A CROSS APPLY (SELECT COALESCE(L_curly,L_bracket) + 1 AS start_pos, COALESCE(R_curly,R_bracket) AS end_pos ) CA ) SELECT A.val,B.val FROM CTE_string A INNER JOIN CTE_string B ON A.val_string = B.val_string AND ( ( A.L_curly IS NOT NULL AND A.R_curly IS NULL AND B.L_curly IS NULL AND B.R_curly IS NOT NULL )
source share