I want to filter an nvarchar
field to return just the numeric values.
I have some SQL to do this but it seems way more complicated than it needs to be. I am interested in finding out if anyone has a better way to filter out any non-numeric characters in a string?
IF OBJECT_ID('tempdb..#MOB') IS NOT NULL
BEGIN
DROP Table #MOB
END
SELECT [mob]
INTO #MOB
FROM (
SELECT '(00) 1234 5678' AS [mob]
UNION
SELECT '1234 5678' AS [mob]
UNION
SELECT '+61 012 345 678' AS [mob]
) AS temp
;WITH [fill] ([Num], [Index], [MOBILEPHONE])
AS
(
SELECT
CASE
WHEN [MOBILEPHONE] IS NOT NULL
THEN SUBSTRING([MOBILEPHONE], 1, 1)
ELSE NULL
END AS [Num]
, 1 AS [INDEX], [MOBILEPHONE]
FROM (
SELECT DISTINCT [mob] AS [MOBILEPHONE]
FROM #MOB as t
) AS temp
UNION ALL
SELECT
SUBSTRING([F].[MOBILEPHONE], [F].[Index] + 1, 1) AS [Num]
,[F].[Index] + 1 AS [Index]
, [MOBILEPHONE]
FROM [fill] AS [F]
WHERE ([F].[Index] + 1) < LEN([F].[MOBILEPHONE]) + 1
)
SELECT [E].[MOBILEPHONE] AS [old_MOBILEPHONE],
STUFF((SELECT N'' + [F].[Num]
FROM [fill] AS [F]
WHERE (PATINDEX('%[^0-9]%', [F].[Num]) = 0 OR PATINDEX('%[^0-9]%', [F].[Num]) IS NULL) AND
([F].[MOBILEPHONE] = [E].[MOBILEPHONE])
ORDER BY [F].[MOBILEPHONE], [F].[Index]
FOR XML PATH('')), 1, 0, '')
AS [MOBILEPHONE]
FROM (
SELECT DISTINCT [t].[MOBILEPHONE]
FROM (SELECT [mob] AS [MOBILEPHONE] FROM #MOB) as t
) AS [E]
Output
╔═════════════════╦═════════════╗
║ old_MOBILEPHONE ║ MOBILEPHONE ║
╠═════════════════╬═════════════╣
║ (00) 1234 5678 ║ 0012345678 ║
║ +61 012 345 678 ║ 61012345678 ║
║ 1234 5678 ║ 12345678 ║
╚═════════════════╩═════════════╝
I have seen the Q & A T-SQL select query to remove non-numeric characters on Stack Overflow, but that answer has a similar solution to what I have found, using a CTE table and recursion. I am searching for something simpler. Hoping there is something like a custom collation that I can create or a regex filter I can apply?