1

我有一个参数化的 postgresql 查询,用户通过 PHP 前端与之交互。其中一个参数涉及一个布尔值,我想给用户“真”、“假”、“未知”(Null)或“无关紧要”(返回任何结果)选项。

重写实际查询不是一个选项(参数化查询存储在数据库表中,而不是 PHP 代码中),所以我需要一个布尔“任何”值。

换句话说,无论“boolean_column”的值如何,我可以在此查询中分配什么值“:parameter1”来获取任何行?

SELECT some_column, some_other_column
FROM some_table
WHERE boolean_column = :parameter1

编辑:我需要澄清——可以重写查询,但程序不能重写查询(即,我不能删除或重写 where 子句以响应运行时的用户输入)。

EDIT2:这是我的最终解决方案(感谢 couling!)

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)

但这也行不通。似乎无论如何,我都无法阻止 postgresql 尝试评估“:parameter1::boolean”,即使它落后于错误的 WHEN 条件。这才是真正的泡菜...

4

1 回答 1

2

那么你的查询必须改变。布尔值有两个值truefalse并且 null 永远不等于任何值(即使 null 也不等于 null)。

你当然可以使用:

SELECT some_column, some_other_column
FROM some_table
WHERE (boolean_column = :parameter1 OR :parameter1 is null)
于 2012-06-13T16:05:11.497 回答