Сохраняйте в строке только разрешенные символы

Если я знаю, какие символы я не хочу оставлять в своей строке, я могу легко удалить их с помощью REPLACE:

SELECT REPLACE(
         REPLACE(
           REPLACE(
             'String with characters like #§$ I do not want to keep', 
             '#', ''
           ), '§', ''
         ), '$', ''
       ) AS repl_string

--- String with characters like  I do not want to keep

Но что, если я хочу удалить все символы, не входящие в положительный список? С regex я бы сделал что-то вроде s/[^a-zA-Z0-9 :.]//g (при условии, что я хотел бы разрешить только буквы, цифры, пробел , точку . или двоеточие :)

Я ищу решение для Microsoft SQL Server 2016

Пожалуйста, добавьте ясности с примерными данными и ожидаемыми результатами. Звучит как работа для translate возможно.

Stu 25.10.2022 17:50

SQL Server не поддерживает Regex, не говоря уже о замене Regex. Хотя, если вы просто хотите сохранить перечисленные там символы, вы можете использовать базовое сопоставление шаблонов SQL Server вместе с решением, которое у меня есть в этом ответе

Larnu 25.10.2022 17:54

@RhythmWasaLurker да, это так. Версия 13 — это SQL Server 2016.

Larnu 25.10.2022 18:01

Хм, когда я нажимаю на свойства в SSMS, он показывает именно это: Version: 13.0.6300.2

thothal 25.10.2022 18:01

Это SQL Server 2016 SP2, @thothal.

Larnu 25.10.2022 18:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом ответе используется решение, очень похожее на ответ , на который я ссылался выше, однако, поскольку OP использует SQL Server 2016, они не могут использовать STRING_AGG. Таким образом, вам нужно будет использовать «старый» метод FOR XML PATHSTUFF) для повторной агрегации строки:

CREATE OR ALTER FUNCTION [dbo].[PatternCharacterReplace_XML] (@String varchar(8000), @Pattern varchar(100), @ReplacementCharacter varchar(1)) 
RETURNS table
AS RETURN
    WITH N AS(
        SELECT N
        FROM (VALUES(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 (SELECT CASE WHEN V.C LIKE @Pattern THEN @ReplacementCharacter ELSE V.C END
            FROM Tally T
                 CROSS APPLY (VALUES(SUBSTRING(@String,T.I,1)))V(C)
            ORDER BY T.I
            FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(8000)') AS ReplacedString;
GO


SELECT *
FROM dbo.PatternCharacterReplace_XML('String with characters like #§$ I do not want to keep','[^A-Za-z0-9 .:]','');

Обратите внимание, что в этой конкретной версии используются значения varchar. Если ваше значение равно nvarchar, я бы предложил создать отдельную версию, которая использует этот тип данных для параметров.

Другие вопросы по теме