部分文字列検索を実行したい大規模なデータベースがあります。ユーザーは次の文字を入力します。JoeBloggs.
Joe 23 Blo Ggs 4
データベースに名前があった場合の議論のために。AZ 以外の名前のすべてを削除したい。
REPLACE(Name, ' ','')
スペースを削除する機能UPPER()
と名前を大文字にする機能があります。
おそらく正規表現の観点から、AZ以外のものを置き換えるより効率的な高速な方法はありますか? データベースの値を変更できません。
部分文字列検索を実行したい大規模なデータベースがあります。ユーザーは次の文字を入力します。JoeBloggs.
Joe 23 Blo Ggs 4
データベースに名前があった場合の議論のために。AZ 以外の名前のすべてを削除したい。
REPLACE(Name, ' ','')
スペースを削除する機能UPPER()
と名前を大文字にする機能があります。
おそらく正規表現の観点から、AZ以外のものを置き換えるより効率的な高速な方法はありますか? データベースの値を変更できません。
最初のオプション -
REPLACE()
関数は最大 32 レベルの深さまでネストできます。速く走る。
REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE (@str, '0', ''),
'1', ''),
'2', ''),
'3', ''),
'4', ''),
'5', ''),
'6', ''),
'7', ''),
'8', ''),
'9', '')
2番目のオプション -- の逆を行います -
3 番目のオプション - 正規表現を使用する場合
これは私のために働く
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
@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
テストされていませんが、次のようなことができます。
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
重要なのは、これを計算列として使用し、インデックスを作成することです。クエリを実行するたびにデータベースが大きなテーブルのすべての行に対してこの関数を実行する必要がある場合、この関数をどれだけ高速に作成しても問題はありません。