6

現在、データ変換プロジェクトを行っており、文字列からすべてのアルファベット文字を削除する必要があります。残念ながら、ソース マシンを所有していないため、関数を作成したり使用したりすることはできません。以前の投稿を検索して見つけた方法は使用できません。

selectステートメントでこれを行う最良の方法は何ですか? これは 30,000 レコード程度しか実行されず、1 回限りのステートメントであるため、速度はそれほど問題ではありません。

4

4 に答える 4

14

これは、1 つのステートメントで実行できます。本当に 200 以上の REPLACE を使用してステートメントを作成しているわけではありませんよね?!

update tbl
set S = U.clean
from tbl
cross apply
(
    select Substring(tbl.S,v.number,1)
    -- this table will cater for strings up to length 2047
    from master..spt_values v
    where v.type='P' and v.number between 1 and len(tbl.S)
    and Substring(tbl.S,v.number,1) like '[0-9]'
    order by v.number
    for xml path ('')
) U(clean)

サンプルデータを使用してこのクエリを表示するSQL Fiddleの作業

後世のために以下に複製:

create table tbl (ID int identity, S varchar(500))
insert tbl select 'asdlfj;390312hr9fasd9uhf012  3or h239ur ' + char(13) + 'asdfasf'
insert tbl select '123'
insert tbl select ''
insert tbl select null
insert tbl select '123 a 124'

結果

ID  S
1   390312990123239
2   123
3   (null)
4   (null)
5   123124
于 2012-09-20T01:34:42.163 に答える
5

CTE はここで HELP に来ます。

;WITH CTE AS 
(
SELECT 

      [ProductNumber] AS OrigProductNumber
      ,CAST([ProductNumber] AS VARCHAR(100)) AS [ProductNumber]           
FROM [AdventureWorks].[Production].[Product]
UNION ALL
SELECT OrigProductNumber
       ,CAST(STUFF([ProductNumber], PATINDEX('%[^0-9]%', [ProductNumber]), 1, '') AS VARCHAR(100) ) AS [ProductNumber]
FROM CTE WHERE PATINDEX('%[^0-9]%', [ProductNumber]) > 0 
)

SELECT * FROM CTE
WHERE PATINDEX('%[^0-9]%', [ProductNumber]) = 0   
OPTION (MAXRECURSION 0)

出力:

OrigProductNumber   ProductNumber
WB-H098                 098
VE-C304-S               304
VE-C304-M               304
VE-C304-L               304
TT-T092                 092
于 2012-09-20T01:50:30.817 に答える
3

もしあなたが本当に関数を使うことができないなら、私はあなたがこのようなことをすることができると思います:

SELECT REPLACE(REPLACE(REPLACE(LOWER(col),'a',''),'b',''),'c','')
  FROM dbo.table...

明らかに、最初の3文字しか処理しなかったので、それよりもはるかに醜いでしょうが、それはアイデアを与えるはずです。

于 2012-09-20T01:10:55.313 に答える
3

クロス適用なしの選択で使用する関数のRichardTheKiwiのスクリプトもドットを追加しました。これは、私の場合、varcharフィールド内のdoubleおよびmoney値に使用するためです

CREATE FUNCTION dbo.ReplaceNonNumericChars (@string VARCHAR(5000))
RETURNS VARCHAR(1000)
AS 
    BEGIN
        SET @string = REPLACE(@string, ',', '.')
        SET @string = (SELECT   SUBSTRING(@string, v.number, 1)
                       FROM     master..spt_values v
                       WHERE    v.type = 'P'
                                AND v.number BETWEEN 1 AND LEN(@string)
                                AND (SUBSTRING(@string, v.number, 1) LIKE '[0-9]'
                                     OR SUBSTRING(@string, v.number, 1) LIKE '[.]')
                       ORDER BY v.number
                      FOR
                       XML PATH('')
                      )
        RETURN @string
    END
GO

ありがとう RichardTheKiwi +1

于 2013-06-20T08:43:52.107 に答える