SQL Server のフィールドから句読点を削除する良い方法を知っている人はいますか?
考えている
UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')
しかし、たとえば !@#$%^&*()<>:"
前もって感謝します
SQL Server のフィールドから句読点を削除する良い方法を知っている人はいますか?
考えている
UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')
しかし、たとえば !@#$%^&*()<>:"
前もって感謝します
理想的には、上記のように C# + 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)
表を作成することは避け、文字と数字以外はすべて削除したいと考えていました。
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
私は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
注-ノイズの一部を入れただけです。必要なノイズを入れる必要があるかもしれません。
お役に立てれば
SQL Server では正規表現を使用できます。SQL 2005 に基づく記事は次のとおりです。
単純なスカラー UDF でラップして、再度必要になった場合にすべての文字列のクリーニングを 1 か所で行えるようにします。
次に、INSERTでも使用できます...
1 回限りの場合は、 LINQPadで C# + LINQ スニペットを使用して、正規表現で作業を行います。
これは迅速かつ簡単であり、CLR ストアド プロシージャをセットアップして自分でクリーンアップするプロセスを実行する必要はありません。
フィールド内の句読点を推測する代わりに、PATINDEX を使用して NUMBERS と LETTERS のみを含めることはできませんか? (皮肉を言うつもりはありません。コードの準備ができていれば、共有します...しかし、これが私が探しているものです)。
クエリで置換関数の巨大なリストを回避するために、カスタム関数を作成する必要があるようです-これが良い例です:
http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=印刷