13

SQL Server のフィールドから句読点を削除する良い方法を知っている人はいますか?

考えている

UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')

しかし、たとえば !@#$%^&*()<>:"

前もって感謝します

4

8 に答える 8

18

理想的には、上記のように 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)
于 2009-11-30T10:25:04.430 に答える
12

表を作成することは避け、文字と数字以外はすべて削除したいと考えていました。

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
于 2011-04-21T04:46:59.480 に答える
7

私は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,'&#x20;',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

注-ノイズの一部を入れただけです。必要なノイズを入れる必要があるかもしれません。

お役に立てれば

于 2009-11-30T10:28:24.690 に答える
3

SQL Server では正規表現を使用できます。SQL 2005 に基づく記事は次のとおりです。

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

于 2009-11-30T08:11:05.657 に答える
1

単純なスカラー UDF でラップして、再度必要になった場合にすべての文字列のクリーニングを 1 か所で行えるようにします。

次に、INSERTでも使用できます...

于 2009-11-30T10:23:57.837 に答える
0

1 回限りの場合は、 LINQPadで C# + LINQ スニペットを使用して、正規表現で作業を行います。

これは迅速かつ簡単であり、CLR ストアド プロシージャをセットアップして自分でクリーンアップするプロセスを実行する必要はありません。

于 2009-11-30T08:22:14.403 に答える
0

フィールド内の句読点を推測する代わりに、PATINDEX を使用して NUMBERS と LETTERS のみを含めることはできませんか? (皮肉を言うつもりはありません。コードの準備ができていれば、共有します...しかし、これが私が探しているものです)。

クエリで置換関数の巨大なリストを回避するために、カスタム関数を作成する必要があるようです-これが良い例です:

http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=印刷

于 2011-01-21T01:08:25.117 に答える