/***********************************************************************
Replace a pattern with another string pattern.
This is almost the same as the built-in TSQL REPLACE function.
Ex: remove all commas within a string.
************************************************************************/
--
DECLARE @original_str VARCHAR(100) = 'The, quick, brown, fox, jumps, over, the, lazy, dog'
, @pattern_str VARCHAR(100) = ','
, @replacement_str VARCHAR(100) = '';
-- recursive CTE: replace @pattern_str with @replacement_str
; WITH phrase(string, row_id) AS (
-- anchor member
SELECT @original_str AS string, row_id = 1
UNION ALL
-- recursive member */
-- Note: If start_position <= 0, STUFF function returns NULL
SELECT
--Convert to VARCHAR(100) for data type and length to match with anchor member
-- Case expression to handle NULL and string with no match found
CAST(CASE WHEN PATINDEX('%'+@pattern_str+'%', string) <= 0 THEN string
ELSE STUFF(string, PATINDEX('%'+@pattern_str+'%', string), 1,@replacement_str)
END AS VARCHAR(100)
) AS string
, row_id = row_id + 1
FROM phrase
WHERE PATINDEX('%'+@pattern_str+'%', string) > 0 -- stop when pattern is not found
)
SELECT string AS replaced_string
FROM phrase
ORDER BY row_id DESC
OFFSET 0 ROW FETCH NEXT 1 ROW ONLY -- get last output from recursive CTE above
OPTION(MAXRECURSION 0);
If you have a solution please share. I'm sure there're better and simpler solutions than this.
For me, it's fun to manipulate character strings. I will provide more examples on string manipulation on future posts. Also we'll learn more about CTE and recursive CTE.

No comments:
Post a Comment