Reputation: 57
How to remove alpha character from string field in sql server?
CREATE TABLE [dbo].[orders](
[orderid] [varchar](50) NULL,
[ordernumber] [varchar](100) NULL
)
INSERT [dbo].[orders] ([orderid], [ordernumber]) VALUES (N'1', N'ab123c2')
INSERT [dbo].[orders] ([orderid], [ordernumber]) VALUES (N'2', N'4xHx32a')
INSERT [dbo].[orders] ([orderid], [ordernumber]) VALUES (N'3', N'h2b58B21b22')
based on above data I want output like below :
orderid | Ordernumber
1 | 1232
2 | 432
3 | 2582122
I tried like below
SELECT
orderid
,REPLACE( REPLACE ( ordernumber, 'a', ''), 'b', '') AS ordernumber
FROM orders
here replace I need to use almosst 26 times for lower and upper case letters.
could you please tell me how to write query easy way to resolve this issue in sql server
Upvotes: 0
Views: 230
Reputation: 96004
You intially tagged SQL Server 2016 and 2012, which means that I'm posting 2 answers here. The first is "nice and easy"; use TRANSLATE
to change the characters to a specific character, and then replace them all:
SELECT orderid,
REPLACE(TRANSLATE(ordernumber,'abcdefghijklmnopqrstuvwxyz',REPLICATE('a',26)),'a','') AS ordernumber
FROM dbo.orders O;
If you're on SQL Server 2012, then you would need to use nested replaces. Otherwise, you could do something that seems unintuitive, but does work. Split the string into individual characters, and then rebuild it, but only with the characters you want; in this case non-letters:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2)
SELECT O.orderid,
(SELECT SUBSTRING(O.ordernumber,T.I,1)
FROM Tally T
WHERE T.I <= LEN(O.ordernumber)
AND SUBSTRING(O.ordernumber,T.I,1) NOT LIKE '[A-Za-z]'
FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(100)')
FROM dbo.orders o;
if you wanted to just retain the numbers, then replace NOT LIKE '[A-Za-z]'
with LIKE '[0-9]'
.
If you really wanted, you could turn the above into a FUNCTION
, and then use that:
CREATE FUNCTION dbo.RemovePattern (@String varchar(8000), @Pattern varchar(8000))
RETURNS varchar(8000)AS
BEGIN
DECLARE @Return varchar(8000);
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP(LEN(@String))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4)
SELECT @Return = (SELECT SUBSTRING(@String,T.I,1)
FROM Tally T
WHERE SUBSTRING(@String,T.I,1) NOT LIKE @Pattern
FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(100)');
RETURN @Return;
END;
GO
SELECT orderid,
dbo.RemovePattern(O.ordernumber,'[A-Za-z]') AS NewOrderNumber
FROM dbo.orders O;
Upvotes: 1