2009-05-14 7 views
2

検索クエリに問題があります。私のデータには、さまざまな形式のアポストロフィを持つ名前と情報が含まれています(HTMLエンコードと実際)。 だから例えば私はこれに代わるたい:これは一例でSQLでオプションの特殊文字と一致するものを検索する方法は?

SELECT * FROM Customers WHERE REPLACE(LastName,'''','') 
LIKE Replace('O''Brien,'''','') 

を、私が欲しいのは、誰かがタイプオブライエンやオブライエン、これはまだ動作するかどうか、私は3を交換する必要がある方法です。キャラクターとデータのバージョンはフィードであり、変更することはできません。この種の検索が機能するためには、クエリに対して何ができるのですか?
私は現在、多くのネストされた置換機能を持っているこの方法で動作する名前を持つ項目を持っており、この方法で動作する何かを見つけることができないようであり、より効率的です。
私はASPでMS SQL 2000を使用しています。


編集

ここオブライエンやオブライエンと一致する必要がクエリで、このクエリは、これを行いますが、あまりにも非効率的である - それは、アイテムの名前と姓(オプション)のために、別のことで接合され、マッチングのために。

SELECT * FROM Customers 
WHERE 
REPLACE(REPLACE(REPLACE(LastName,''',''),''',''),'''','') 
LIKE 
REPLACE(REPLACE(REPLACE('%O'Brien%',''',''),''',''),'''','') 
+0

なぜ実際の*文字ではなく、データベースにHTMLエンティティを格納していますか? – Tomalak

+0

HTMLエンティティにはデータソースが付属しています。これは、この方法でデータを格納する外部ソースからのものです。実際の文字に置き換えることができます - 複数の置換の必要性を解決する可能性があります – RoguePlanetoid

+0

データベースにHTMLはありません。厄介な頭痛の種類だけでなく、この1つ。あなたが何かできることがあれば、データを保存する前にHTMLエンティティをデータから正規化してください。 – Tomalak

答えて

1

正しい滞在し、SQLでこれを行うにしたい場合は、これはおそらく、あなたはまだ、時々不十分な選択のためにテーブルスキャンを取得します

SELECT * FROM Customers WHERE 
LastName LIKE 'O%Brien' AND 
REPLACE(LastName,'''','') LIKE 'O''Brien' 

を行うことができますが最適です。

最初の理由は、既存のインデックスを使用しようとする理由です。 2番目の一致の理由は、ObbBrienのような姓が一致しないようにするためです。

もちろん、行うべき最良のことは、醜い交換を必要としないことです。これは、追加のきれいな姓の列を格納することによって、アプリケーションで達成することができます。またはトリガで。またはインデックス付きのビューで。

1

あなたはこれを試みることができる:

SELECT * 
FROM Customers 
WHERE LastName LIKE Replace('O''Brien,'''','%') 

このあなたが元の列を変更していないとして、それはインデックスを使用できるようにする必要があります。

+0

この特定のインスタンスでは、ほとんどの場合、完全スキャンを選択する可能性が高いことに注意してください。インデックスからOで始まるすべてのレコードを取得するには高価すぎると考えるかもしれません。私はこれがおそらく同じようなクエリでできることに同意します –

+0

また、これは特定の入力に対して非常に危険です:OohnoitsBrienも同様に一致します!!! –

0

コードでクエリを作成する代わりに、パラメータを使用します。

あなたはADOを使用している場合は、次のような構文を使用することができます。

Dim cmd, rs, connect, intNumber 
Set cmd = Server.CreateObject("ADODB.Command") 
cmd.ActiveConnection = "your connectionstring" 
cmd.CommandText = "SELECT * FROM Customers WHERE LastName LIKE @LastName" 
cmd.Parameters.Append cmd.CreateParameter("@LastName",,,,"O'Brien") 
Set rs = cmd.Execute 

これは、クエリを実行し、オブライエンが適切に使用しているデータベース用にフォーマット文字列を挿入する必要があります。

パラメータを使用すると、すべての値が適切にフォーマットされ、SQLインジェクション攻撃から保護されます。

1

純粋なSQLの場合、エスケープは完全に不要です。

SELECT * FROM Customers WHERE LastName = 'O''Brien' 
関連する問題