sql server помогает избежать строки

#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;
 

db<>скрипка