2

selectクエリを実行するために3つのブール条件をチェックする必要があるとします。3つのフラグを「A」、「B」、「C」とします。

3つのフラグがすべて「1」に設定されている場合、生成されるクエリはSELECT * FROM Food WHERE Name In('Apple、' Biscuit'、' Chocolate');です。フラグ「A」と「B」のみが「1」に設定され、Cが「0」に設定されている場合。次に、次のクエリが生成されます。

SELECT * 
  FROM Food 
 WHERE Name In ('Apple, 'Biscuit');

それを行うための最良の方法は何ですか?

4

5 に答える 5

2
SELECT * 
  FROM Food
 WHERE (Name = 'Apple' AND <condition A>)
    OR (Name = 'Biscuit' AND <condition B>)
    OR (Name = 'Chocolate' AND <condition C>)

現在、条件A、B、およびCはデータ駆動型ではないため(行ごとに変化しないため)、これはパフォーマンスの観点からは望ましくありません。したがって、SQLを動的に構築することにより、考えられるすべての条件の順列を使用できます。IN句を使用して、その文字列を動的に構築します。

さらに別の解決策は、各SELECTを個別に実行することによってクライアントで最終結果を組み立てることです(擬似コード)。

if A then {
   result1 = execute("SELECT * FROM Food WHERE Name = 'Apple')
}
if B then {
   result2 = execute("SELECT * FROM Food WHERE Name = 'Biscuit')
}
if C then {
   result2 = execute("SELECT * FROM Food WHERE Name = 'Chocolate')
}

result = join(result1, result2, result3)

このソリューションは、1つまたは2つの真の条件を持つケースの割合が高い場合に機能する可能性があります。

于 2010-03-15T16:53:24.950 に答える
0

まず、すべてがfalseであるかどうかを確認し、エラーを表示する必要がある場合があります。または、それがあなたのケースで受け入れられる場合はそうではないかもしれません。

次に、これらのフラグが単なるブール変数である場合は、(擬似コード)

sql = "SELECT * 
  FROM Food 
 WHERE Name In (";
if (A) sql += "'Apple', "
if (B) sql += "'Biscuit', "
if (C) sql += "'Chocolate', "
sql = sql.deleteLastCharacter() + ");";
于 2010-03-15T15:51:31.643 に答える
0

クエリにA/B / Cを含めてみませんか?select * from food where(name ='Apple' or NOT A)and(name ='Biscuit' OR NOT B).. ..

于 2010-03-15T16:36:59.803 に答える
0

私はこれを読むべきだと思います:動的SQL

sp_executesqlシステムのストアドプロシージャも非常に便利であることがわかります。

于 2010-03-15T16:46:35.977 に答える
0

これは非常に複雑なトピックであり、パフォーマンスに微妙な影響を及ぼします。あなたは本当にErlandSommarskogによるこれらの優れた記事を読む必要があります:

T-SQLの動的検索条件

動的SQLの呪いと祝福

于 2010-03-15T17:22:43.757 に答える