2

検索クエリに問題があります。使用しているデータには、さまざまな形式 (HTML エンコードおよび実際の形式) のアポストロフィを含む名前と情報が含まれています。したがって、たとえば、これに代わるものが必要です。

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

これは単なる例です。私が望むのは、誰かが OBrien または O'Brien と入力した場合でも機能する方法です。3 つのバージョンのキャラクターを置き換える必要があり、データはフィード ソースであり、変更できません。この種の検索が機能するようにクエリに追加します。
現在、多くのネストされた REPLACE 関数があり、この方法で機能するものを見つけることができないように見える、この方法で機能する名前の項目があります。これはより効率的です。
それが役立つ場合、私は ASP で MS SQL 2000 を使用しています。


編集

これは、O'Brien または OBrien と一致する必要があるクエリです。このクエリはこれを実行しますが、あまりにも非効率的です。一致させるために、アイテム名と FirstName (オプション) のために別のクエリと結合されます。

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

4 に答える 4

1

あなたはこれを試すことができます:

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

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

于 2009-05-14T09:48:34.553 に答える
1

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

SELECT * FROM Customers WHERE LastName = 'O''Brien'
于 2009-05-14T09:56:03.803 に答える
1

正しいままでこれをSQLで実行したい場合は、これがおそらく最善の方法です

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

選択性が低いため、テーブル スキャンが発生することがあります。

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

もちろん、最善の方法は、醜い交換を必要としないことです。これは、追加のクリーンな姓の列を保存することで、アプリで実現できます。またはトリガーで。または、インデックス付きビューで。

于 2009-05-14T09:59:28.490 に答える
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 

これにより、クエリが実行され、データベース用に適切にフォーマットされた文字列O'Brienが挿入されます。

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

于 2009-05-14T09:55:16.393 に答える