-1

SQLクエリでWHEREをワイルドカードとして使用することは可能ですか?

私はこの簡単なクエリを持っています:

SQL = "SELECT ID, Firstname, Lastname, Company, City, Email FROM table WHERE * LIKE '%" & q & "%';"

変数qが「JohnDoe」に等しいとしましょう。次に、クエリで名と/または(??)姓の両方でqを検索します。

私はそれを理解することができます。

どうもありがとう/Andreas

編集/更新:

私は私の質問を単純化しようとします。

ID、Firstname、Lastname、Emailの各フィールドを持つdb-tableがあるとします。(値が5のfx:john、Doe、JD @ hotmail.com)

次に、訪問者が上記のフィールドのいずれかを検索できるページに、検索フィールド(送信ボタンを使用した1つの単純なテキスト入力)を含む単純なhtmlフォームがあります。

彼/彼女が「John」、「Doe」、または「hotmail」という単語を検索する場合、次のように私のASPページで変数「q」として検索文字列を取得するSQLクエリで完全に機能します。

SQL = "SELECT ID, Firstname, Lastname,Email FROM table WHERE ID LIKE '%" & q & "%', OR Firstnamne LIKE '%" & q & "%', OR Lastname LIKE '%" & q & "%' OR Email LIKE '%" & q & "%';"

さて、私の質問は、訪問者が「John Doe」と入力した場合、どうすればよいですか?

「JohnDoe」という名前のデータベース内のすべての人のリストを取得できるようにしたい

4

8 に答える 8

4
SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE   firstname LIKE '%" & q & "%' OR lastname LIKE '%" & q & "%' -- Replace OR with AND as necessary
于 2009-11-25T15:28:05.013 に答える
4

必須の XKCD

于 2009-11-25T16:02:09.627 に答える
2

いいえ、検索するフィールドを指定する必要があります。もちろん、like ステートメントの先頭でワイルドカードを使用すると、インデックスを使用できず、クエリが遅くなることもわかります。最初にこれらのワイルドカードが本当に必要ですか? あなたが求めていることから、私はそうではないと思います。

変数に姓と名の両方が含まれている場合、次のクエリも機能する可能性があります。

SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE   firstname + " " +lastname LIKE '%" & q & "%'

もちろん、名または姓のいずれかにヌルを含めることができる場合は、それに isnull または合体を追加する必要があるかもしれません。

于 2009-11-25T15:30:57.787 に答える
0

SQL の WHERE または ON 句で一連の条件を OR すると、パフォーマンスが低下します。

FULL TEXT インデックスに関する私の提案が気に入らない場合は、ここで別のオプションを提案します。LIKE の先頭にワイルドカードがあるため、パフォーマンスにも最適ではありませんが、多くの OR よりも優れている可能性があります。

検索するフィールドを連結した新しい列をテーブルに作成します。SQL エンジンでサポートされている場合、これは計算列にすることができます。

MS SQL では、次のようになります。

ALTER TABLE ... ADD COLUMN MatchCode AS FirstName + LastName + Email + ...

計算列を使用できない場合は、更新ごとにこの列の値を設定する必要があります。

UPDATE x
SET  MatchCode = FirstName + LastName + <NewEmailValue> + ...
,    Email = <NewEmailValue>
FROM ... AS x
WHERE ...

次に、簡単に行うことができます

SELECT ...
FROM ... AS x
WHERE x.MatchCode LIKE '%<keyword>%'

繰り返しますが、SQL インジェクションについて思い出してください :)

于 2009-11-26T14:30:25.497 に答える
0

私は過去にストアドプロシージャを使用してこのアプローチを行いました:

SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE
    (@pFirstName is null or FirstName = @pFirstName)
    and (@pLastName is null or LastName = @pLastName)
    and (@pCompany is null or Company = @pCompany)
    and (@pCity is null or City = @pCity)
    and (@pEmail is null or Email = @pEmail)

where 句に含めたい比較ごとにパラメーターを定義します。特定のフィールドでクエリを実行したくない場合は、対応するパラメーターに null を渡すか、値をまったく渡さずにパラメーターの既定値を null にします。

編集:「OR」と「AND」を切り替えたい場合は、別のパラメーターのセットを追加できます。非常に多くのパラメーターが散らかっているように見えますが、機能します。

SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE
    (@pAndFirstName is null or FirstName = @pAndFirstName)
    and (@pAndLastName is null or LastName = @pAndLastName)
    and (@pAndCompany is null or Company = @pAndCompany)
    and (@pAndCity is null or City = @pAndCity)
    and (@pAndEmail is null or Email = @pAndEmail)
    and (   (
        -- either all of the "OR" parameters are null
        @pOrFirstName is null
        and @pOrLastName is null
        and @pOrCompany is null
        and @pOrCity is null
        and @pOrEmail is null
    ) or (
    -- or at least one of them must match
    or (FirstName = @pOrFirstName)
    or (LastName = @pOrLastName)
    or (Company = @pOrCompany)
    or (City = @pOrCity)
    or (Email = @pOrEmail)
    ))

もちろん、必要に応じて = の代わりに LIKE 演算子を使用することもできます。

于 2009-11-25T15:53:44.867 に答える
0

すべてのフィールドを連結してから、単一の「LIKE」を使用します。

 SELECT ID, Firstname, Lastname, Company, City, Email 
   FROM table 
   WHERE ID||Firstname||Lastname||Company||City||Email  LIKE '%" & q & "%';"
于 2009-11-26T14:05:43.533 に答える
0

全文検索を検討することをお勧めします。これにはいくつかの利点があり、複数の列を検索できます。

使用する SQL エンジンに応じて、多かれ少なかれ強力になります。

構文は新鮮ではありませんが、MySQL の場合は次のようになります。

テーブルの作成時:

CREATE TABLE ... (
      ID ...
,     ...
,     FULLTEXT (Firstname, Lastname, Company, City, Email)
);

次に、次のようにします。

SELECT * 
FROM ...
WHERE MATCH (Firstname, Lastname, Company, City, Email) AGAINST ('<KEYWORD>') > 0;

適切な構文/使用法については、SQL エンジンのマニュアルを確認してください。

また、ルセロが示唆しているように、SQLインジェクションについて覚えておいてください。返信してこれに言及しなかった人は全員、反対票を投じるべきです;-)

于 2009-11-26T14:23:32.717 に答える
0

探していることを行うには、動的 SQL を使用する必要があると思います。基本的に、クエリの要素を nvarchar(max) 変数に連結し、EXEC または sp_execsql コマンドを使用してクエリを実行します。sp_execsql はパラメーター化されたクエリをサポートしていますが、EXEC はサポートしていないことに注意してください。

それが役立つことを願っています!

于 2009-11-26T14:27:01.493 に答える