SQL Server: как удалить пунктуацию из поля?
Кто-нибудь знает хороший способ удалить пунктуацию из поля в SQL Server?
Я думаю
UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')
но кажется немного утомительным, когда я собираюсь удалить большое количество разных символов, например:! @# $% ^ & *() < > : "
Заранее спасибо
Ответы
Ответ 1
В идеале вы должны сделать это на языке приложений, таком как С# + LINQ, как указано выше.
Если вы хотите сделать это исключительно в T-SQL, один из способов сделать вещи опрятными - это, во-первых, создать таблицу, в которой была бы сохранена вся пунктуация, которую вы хотели удалить.
CREATE TABLE Punctuation
(
Symbol VARCHAR(1) NOT NULL
)
INSERT INTO Punctuation (Symbol) VALUES('''')
INSERT INTO Punctuation (Symbol) VALUES('-')
INSERT INTO Punctuation (Symbol) VALUES('.')
Затем вы можете создать функцию в SQL, чтобы удалить все символы препинания из входной строки.
CREATE FUNCTION dbo.fn_RemovePunctuation
(
@InputString VARCHAR(500)
)
RETURNS VARCHAR(500)
AS
BEGIN
SELECT
@InputString = REPLACE(@InputString, P.Symbol, '')
FROM
Punctuation P
RETURN @InputString
END
GO
Затем вы можете просто вызвать функцию в инструкции UPDATE
UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName)
Ответ 2
Я хотел избежать создания таблицы и хотел удалить все, кроме букв и цифр.
DECLARE @p int
DECLARE @Result Varchar(250)
DECLARE @BadChars Varchar(12)
SELECT @BadChars = '%[^a-z0-9]%'
-- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %'
SET @Result = @InStr
SET @P =PatIndex(@BadChars,@Result)
WHILE @p > 0 BEGIN
SELECT @Result = Left(@Result,@p-1) + Substring(@Result,@p+1,250)
SET @P =PatIndex(@BadChars,@Result)
END
Ответ 3
Я предлагаю 2 решения
Решение 1: Создайте таблицу шума и замените шумы пробелами
например.
DECLARE @String VARCHAR(MAX)
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10))
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!'
INSERT INTO @Noise(Noise,ReplaceChars)
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL
SELECT ':',SPACE(1)
SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise
SELECT @String Data
Решение 2: с таблицей чисел
DECLARE @String VARCHAR(MAX)
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!'
;with numbercte as
(
select 1 as rn
union all
select rn+1 from numbercte where rn<LEN(@String)
)
select REPLACE(FilteredData,' ',SPACE(1)) Data from
(select SUBSTRING(@String,rn,1)
from numbercte
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$')
for xml path(''))X(FilteredData)
Выход (оба случая)
Данные
hello how are u . I am ok . Oh nice
Примечание. Я только что добавил некоторые шумы. Возможно, вам понадобится помешать, что вам нужно.
Надеюсь, что это поможет
Ответ 4
Вы можете использовать регулярные выражения в SQL Server - вот статья на основе SQL 2005:
http://msdn.microsoft.com/en-us/magazine/cc163473.aspx
Ответ 5
Я бы обернул его в простой скалярный UDF, поэтому вся чистка строк в одном месте, если понадобится снова.
Затем вы можете использовать его также в INSERT...
Ответ 6
Если это одноразовая вещь, я бы использовал фрагмент С# + LINQ в LINQPad, чтобы сделать работа с регулярными выражениями.
Это быстро и просто, и вам не нужно проходить процесс настройки хранимой процедуры CLR, а затем очищать после себя.
Ответ 7
Не можете ли вы использовать PATINDEX только для того, чтобы включать NUMBERS и LETTERS вместо того, чтобы пытаться угадать, какая пунктуация может быть в поле? (Не пытаясь быть snarky, если бы у меня был готовый код, я бы поделился им... но это то, что я ищу).
Похоже, вам нужно создать пользовательскую функцию, чтобы избежать гигантского списка функций замены в ваших запросах - вот хороший пример:
http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=Print