postgresql中的布尔通配符

时间:2012-06-13 15:46:43

标签: sql postgresql boolean parameterized-query

我有一个参数化的postgresql查询,用户通过PHP前端进行交互。其中一个参数涉及一个布尔值,我想给用户选择“True”,“False”,“Unknown”(Null)或“无关紧要”(返回任何结果)。

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

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

SELECT some_column, some_other_column
FROM some_table
WHERE boolean_column = :parameter1
编辑:我需要澄清 - 可以重写查询,但程序无法重写查询(即,我不能删除或重写其中在运行时响应用户输入的子句。

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

SELECT some_column, some_other_column
FROM some_table
WHERE (:parameter1::text = 'any' OR boolean_column = :parameter1::boolean)

当然,程序必须将可能的值限制为'any'或可以转换为boolean的字符串值(例如,'true','t','false','f')。

EDIT3:之前的解决方案在PHP中使用PDO,但由于某种原因无法使用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条件后面。这是一个真正的泡菜...

1 个答案:

答案 0 :(得分:2)

您的查询必须更改。布尔值有两个值truefalse,其中空值永远不等于任何值(即使null不等于null)。

你当然可以使用:

SELECT some_column, some_other_column
FROM some_table
WHERE (boolean_column = :parameter1 OR :parameter1 is null)