7

複数のテーブルで動的検索を実行するためのパターンを探しています。

従来の(そして不十分に設計された)データベーステーブル構造を制御することはできません。

ユーザーが履歴書内のデータのいずれかに対して検索を実行し、検索条件に一致する履歴書のリストを取得したい場合がある履歴書検索に似たシナリオを考えてみます。任意のフィールドをいつでも、1つ以上の他のフィールドと組み合わせて検索できます。

実際のSQLクエリは、検索されるフィールドに応じて動的に作成されます。私が見つけたほとんどの解決策は複雑なifブロックを含みますが、これは今では解決された問題であるに違いないので、もっと洗練された解決策が必要だと思わずにはいられません。


ええ、それで私はコードでSQLを動的に構築する道を歩み始めました。ひどいようです。任意のテーブルの任意のフィールドの任意の組み合わせをクエリする要求された機能を実際にサポートしようとすると、これはifステートメントの1つのMASSIVEセットになります。 震える


COALESCEは、データにNULLが含まれていない場合にのみ機能することを読んだと思います。あれは正しいですか?もしそうなら、私はいたるところにNULL値があるので、行きません。

4

3 に答える 3

5

私が理解している限り (そして、私も恐ろしいレガシーデータベースに対して書いたことがある人です)、動的な WHERE 句のようなものはありません。それは解決されていません。

個人的には、動的検索をコードで生成することを好みます。テストを便利にします。コードで SQL クエリを作成する場合は、ユーザー入力で連結しないでください。@変数を使用してください!

唯一の代替手段は、COALESCE 演算子を使用することです。次のテーブルがあるとします。

Users
-----------
Name nvarchar(20)
Nickname nvarchar(10)

オプションで名前またはニックネームを検索したい場合。次のクエリはこれを行います。

SELECT Name, Nickname
FROM Users
WHERE
    Name = COALESCE(@name, Name) AND
    Nickname =  COALESCE(@nick, Nickname)

何かを検索したくない場合は、null を渡してください。たとえば、@name に "brian" を渡し、@nick に null を渡すと、次のクエリが評価されます。

SELECT Name, Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

合体演算子は、null を ID 評価に変換します。これは常に true であり、where 句には影響しません。

于 2008-08-13T14:29:36.487 に答える
1

必要なのはSphinxSearch (MySQL 用) やApache Luceneなどです。

あなたの例で言ったように、いくつかのフィールドで構成される Resume を想像してみましょう:

  • リスト項目
  • 名前、
  • アドレス、
  • 教育 (これは単独でテーブルになる可能性があります) または
  • 職歴 (これは、各行が前職を表す独自のテーブルに成長する可能性があります)

したがって、これらすべてのフィールドで WHERE を使用して単語を検索すると、いくつかの JOINS を含む非常に長いクエリになります。

代わりに、参照のフレームワークを変更して、履歴書全体を単一のドキュメントと見なし、そのドキュメントを検索したいだけです。

これは、Sphinx Search などのツールが行う場所です。彼らはあなたの「ドキュメント」のFULL TEXTインデックスを作成し、Sphinxにクエリを実行すると、データベース内でそのレコードが見つかった場所が返されます。

本当に良い検索結果です。

このツールが RDBMS の一部ではないことを心配する必要はありません。適切なモデル "Documents" と、不適切なモデル "TABLES" をこのアプリケーションに使用することで、多くの頭痛の種から解放されます。

于 2009-07-04T00:59:33.697 に答える
1

検索と正規化は相反する場合があります。したがって、おそらく最初に、履歴書を取得する単一のキーを持つ単一の行として検索できるすべてのフィールドを表示する、ある種の「ビュー」を取得することです。次に、その前にLuceneのようなものをスローして、それらの行の全文インデックスを提供できます。このビューで「x」を要求すると、キーが返されます。これは優れたソリューションであり、IIRC の最初の 2 か月以内にポッドキャストで joel 自身によって推奨されました。

于 2008-08-13T14:56:15.420 に答える