28

部分文字列検索を実行したい大規模なデータベースがあります。ユーザーは次の文字を入力します。JoeBloggs.

Joe 23 Blo Ggs 4データベースに名前があった場合の議論のために。AZ 以外の名前のすべてを削除したい。

REPLACE(Name, ' ','')スペースを削除する機能UPPER()と名前を大文字にする機能があります。

おそらく正規表現の観点から、AZ以外のものを置き換えるより効率的な高速な方法はありますか? データベースの値を変更できません。

4

9 に答える 9

44

最初のオプション -

REPLACE()関数は最大 32 レベルの深さまでネストできます。速く走る。

REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE (@str, '0', ''),
'1', ''),
'2', ''),
'3', ''),
'4', ''),
'5', ''),
'6', ''),
'7', ''),
'8', ''),
'9', '')

2番目のオプション -- の逆を行います -

数値 + SQL から非数値データを削除する

3 番目のオプション - 正規表現を使用する場合

次に http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27205

于 2012-11-05T21:19:15.257 に答える
20

これは私のために働く

CREATE Function [dbo].[RemoveNumericCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @NumRange as varchar(50) = '%[0-9]%'
    While PatIndex(@NumRange, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@NumRange, @Temp), 1, '')

    Return @Temp
End

そして、あなたはそれをそのように使うことができます

SELECT dbo.[RemoveNumericCharacters](Name) FROM TARGET_TABLE
于 2013-02-25T16:40:56.237 に答える
0

@Jatinの回答の一部をいくつか修正して引用すると、

あなたのwhere声明でこれを使用してください:

    SELECT * FROM .... etc.
        Where 
         REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE (Name, '0', ''),
        '1', ''),
        '2', ''),
        '3', ''),
        '4', ''),
        '5', ''),
        '6', ''),
        '7', ''),
        '8', ''),
        '9', '') = P_SEARCH_KEY
于 2014-08-20T08:28:28.070 に答える
-1

テストされていませんが、次のようなことができます。

Create Function dbo.AlphasOnly(@s as varchar(max)) Returns varchar(max) As
Begin
  Declare @Pos int = 1
  Declare @Ret varchar(max) = null
  If @s Is Not Null
  Begin
    Set @Ret = ''
    While @Pos <= Len(@s)
    Begin
      If SubString(@s, @Pos, 1) Like '[A-Za-z]'
      Begin
        Set @Ret = @Ret + SubString(@s, @Pos, 1)
      End
      Set @Pos = @Pos + 1
    End
  End
  Return @Ret
End

重要なのは、これを計算列として使用し、インデックスを作成することです。クエリを実行するたびにデータベースが大きなテーブルのすべての行に対してこの関数を実行する必要がある場合、この関数をどれだけ高速に作成しても問題はありません。

于 2012-11-05T21:24:48.457 に答える