1

性別と手という 2 つの変数に依存する SQLite クエリがあります。これらはそれぞれ 3 つの値を持つことができます。2 つは実際に何かを意味し (つまり、男性/女性と左/右)、3 番目は「すべて」です。変数の値が「すべて」の場合、その列の特定の値が何であるかは気にしません。

変数を変更するだけで、単一のクエリでこの機能を実現できますか? ワイルドカードまたは don't care 演算子を探しましたが、この状況では機能しない % 以外は見つかりませんでした。

もちろん、多数の if ステートメントを作成し、ケースごとに異なるクエリを使用することもできますが、それはあまりエレガントではありません。

コード:

select_sql = """    SELECT * FROM table
                    WHERE (gender = ? AND hand = ?)
             """
cursor.execute(select_sql, (gender_var, hand_var))

つまり、このクエリは、gender_val = 'male' および hand_var = 'left' の場合は機能しますが、gender_val または hand_var = 'all' の場合は機能しません。

4

1 に答える 1

3

実際、単一のクエリでこれを行うことができます。クエリで各変数を比較するだけです。'all'

select_sql = """  SELECT * FROM table
                  WHERE ((? = 'all' OR gender = ?) AND (? = 'all' OR hand = ?))
             """

cursor.execute(select_sql, (gender_var, gender_var, hand_var, hand_var))

基本的に、gender_varorhand_varがの場合'all'、各式の最初の部分ORは常に true であるため、 の分岐ANDは常に true であり、すべてのレコードに一致します。つまり、クエリではノーオペレーションです。

ただし、実際にテストする必要があるフィールドだけを含むクエリを Python で動的に作成する方がよい場合があります。明らかに速いかもしれませんが、それをベンチマークする必要があります。

于 2013-08-09T17:25:44.947 に答える