1

インターフェイスを介してユーザーが変更できるデータベースがあります。1 つのフィールド (companyID) については、ワイルドカード文字として文字列にアスタリスクを配置できる必要があります。

たとえば、G378* を入力して、G378 で始まる任意の companyID を表すことができます。

クライアント プログラムで、「完全な」companyID をパラメーターとして提供しています。

SELECT * FROM table WHERE companyID = '" + myCompanyID + "'

しかし、ワイルドカードを確認する必要があります。これを確認するためにクエリに追加できるものはありますか。どう説明したらいいのかわかりませんが、私が慣れ親しんだものとはちょっと逆です。クエリ自体のワイルドカード値と一致するように、提供する値 (完全な companyID) を変更できますか?

これが理にかなっていることを願っています。

ありがとう!

編集: ユーザーは を使用していませんSELECT。ユーザーはINSERTorのみを使用UPDATEしており、フィールドに * を配置しているのはそれらです。私のプログラムは使用SELECTしており、完全な companyID (アスタリスクなし) しか持っていません。

4

3 に答える 3

3

これは古典的なSQL インジェクションの標的です! あなたは今それを見つけたことをうれしく思うべきです。

問題に戻ります。ユーザーが を入力したときに'*'、それを に置き換え、代わりに をクエリで'%'使用します。LIKE=

たとえば、エンドユーザーが と入力する"US*123"と、次のクエリが実行されます。

SELECT * FROM table WHERE companyID LIKE @companyIdTemplate

@companyIdTemplateパラメータをに設定し"US%123"、クエリを実行します。

この例では.NET を使用@しましたが、クエリ パラメーターはホスティング言語に固有の方法で示されています。たとえば?、Java になります。パラメーター化されたクエリの使用に関する DB プログラミング チュートリアルをチェックして、システムでの実行方法を確認してください。

EDIT :別のテーブルのレコードを指定するワイルドカードに基づいて挿入を実行したい場合は、次のように挿入から選択を実行できます。

INSERT INTO CompanyNotes (CompanyId, Note)
   SELECT c.companyId, @NoteText
   FROM Company c
   WHERE c.companyId LIKE 'G378%'

@NoteTextこれにより、パラメータの値を持つレコードがCompanyNotes、ID が一致する各会社のテーブルに挿入されます"G378%"

于 2012-05-16T17:36:29.037 に答える
0

TSQL では、replace と like を使用します。すなわち:

select * from table where companyid like replace(mycompanyid,'*','%');
于 2012-05-16T17:38:06.097 に答える
0

これは多少実装に依存しており、どのタイプの SQL を扱っているかについて言及していませんでした。ただし、MS SQL Server のワイルドカードを見ると、% (任意の数の文字) または _ (単一の文字) が含まれます。ワイルドカードは、= 比較ではなく「like」で使用された場合にのみワイルドカードとして評価されます。ただし、「like」を使用している限り、ワイルドカードを含むパラメーターを渡してワイルドカードとして評価することができます

于 2012-05-16T17:36:14.407 に答える