#sql #sql-server
Вопрос:
Как удалить альфа-символ из строкового поля в 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')
основываясь на приведенных выше данных, я хочу получить результат, как показано ниже :
orderid | Ordernumber
1 | 1232
2 | 432
3 | 2582122
Я попробовал, как показано ниже
SELECT
orderid
,REPLACE( REPLACE ( ordernumber, 'a', ''), 'b', '') AS ordernumber
FROM orders
здесь мне нужно использовать почти 26 раз для строчных и прописных букв.
не могли бы вы, пожалуйста, рассказать мне, как написать запрос простой способ решения этой проблемы в sql server
Комментарии:
1. Какая версия SQL Server, 2012 или 2016?
2. Примечание: Зачем хранить то, что явно
int
указано вvarchar(50)
столбце, и почему вы передаетеnvarchar
литералы вvarchar
столбцы?
Ответ №1:
Вы изначально отметили SQL Server 2016 и 2012, что означает, что я публикую здесь 2 ответа. Первый — «красиво и просто»; используйте TRANSLATE
, чтобы изменить символы на определенный символ, а затем заменить их все:
SELECT orderid,
REPLACE(TRANSLATE(ordernumber,'abcdefghijklmnopqrstuvwxyz',REPLICATE('a',26)),'a','') AS ordernumber
FROM dbo.orders O;
Если вы используете SQL Server 2012, вам потребуется использовать вложенные замены. В противном случае вы могли бы сделать что-то, что кажется неинтуитивным, но работает. Разделите строку на отдельные символы, а затем перестройте ее, но только с теми символами, которые вы хотите; в данном случае без букв:
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;
если вы хотели просто сохранить номера, NOT LIKE '[A-Za-z]'
замените LIKE '[0-9]'
их .
Если бы вы действительно хотели, вы могли бы превратить вышеперечисленное в а FUNCTION
, а затем использовать это:
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;