ユーザーが PHP フロントエンドを介して対話するパラメーター化された postgresql クエリがあります。パラメーターの 1 つにブール値が含まれており、ユーザーに「True」、「False」、「Unknown」(Null)、または「問題ではない」(任意の結果を返す) のオプションを提供したいと考えています。
実際のクエリを書き換えることはできません (パラメータ化されたクエリは、PHP コードではなくデータベース テーブルに格納されます)。そのため、ブール値の "any" 値が必要です。
別の言い方をすれば、「boolean_column」の値に関係なく、行を取得するために、このクエリで「:parameter1」にどの値を割り当てることができますか?
SELECT some_column, some_other_column
FROM some_table
WHERE boolean_column = :parameter1
編集:明確にする必要があります-クエリを書き換えることはできますが、プログラムはクエリを書き換えることができません(つまり、実行時にユーザー入力に応答してwhere句を削除または書き換えることはできません)。
EDIT2:これが私の最終的な解決策です(ありがとうクーリング!)
SELECT some_column, some_other_column
FROM some_table
WHERE (:parameter1::text = 'any' OR boolean_column = :parameter1::boolean)
もちろん、プログラムは可能な値を「any」またはブール値にキャストできる文字列値 (「true」、「t」、「false」、「f」など) に制限する必要があります。
EDIT3: 前のソリューションは PDO を使用する PHP では機能しますが、何らかの理由で Python の psycopg2 または直接 postgresql では機能しません。次のように、case ステートメントを使用してバリエーションを試しました。
SELECT some_column, some_other_column
FROM some_table
WHERE (CASE WHEN :parameter1::text in ('true', 'false') THEN boolean_column = :parameter1::boolean ELSE TRUE END)
しかし、それもうまくいきません。何があっても、偽の WHEN 条件の背後にある場合でも、postgresql が ":parameter1::boolean" を評価しようとするのを止めることはできません。これが本当のお漬物…