83

可変アルファ長の列にダーティ データがあります。0-9 以外のものを取り除きたいだけです。

関数やプロシージャを実行したくありません。テキストの後に数値を取得するだけの同様のスクリプトがあります。次のようになります。

Update TableName
set ColumntoUpdate=cast(replace(Columnofdirtydata,'Alpha #','') as int)
where Columnofdirtydata like 'Alpha #%'
And ColumntoUpdate is Null

Alpha # 12345789 の形式だけだと思っていたデータ フィールドの一部がそうではないことがわかるまで、かなりうまくいくと思っていました。

削除する必要があるデータの例

AB ABCDE # 123
ABCDE# 123
AB: ABC# 123

123 が欲しいだけです。すべてのデータ フィールドの数値の前に # があるのは事実です。

部分文字列と PatIndex を試しましたが、構文が正しいかどうかがわかりません。これに対処する最善の方法についてアドバイスはありますか?

4

16 に答える 16

96

SQL Server での文字列からの数値の抽出に関するこのブログ投稿を参照してください。以下は、例で文字列を使用したサンプルです。

DECLARE @textval NVARCHAR(30)
SET @textval = 'AB ABCDE # 123'

SELECT LEFT(SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000),
           PATINDEX('%[^0-9.-]%', SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000) + 'X') -1)
于 2013-09-04T23:52:21.747 に答える
41

stuffpatindexを使用できます。

stuff(Col, 1, patindex('%[0-9]%', Col)-1, '')

SQL フィドル

于 2013-09-05T05:19:23.213 に答える
0

このための関数を作成しました

Create FUNCTION RemoveCharacters (@text varchar(30))
RETURNS VARCHAR(30)
AS
BEGIN
declare @index as int 
declare @newtexval as varchar(30)
set @index = (select PATINDEX('%[A-Z.-/?]%', @text))
if (@index =0)
begin 
return @text
end
else
begin 
set @newtexval  = (select STUFF ( @text , @index , 1 , '' ))
return dbo.RemoveCharacters(@newtexval)
end
return 0
END
GO
于 2017-10-04T16:35:28.267 に答える