我有一个参数化的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条件后面。这是一个真正的泡菜...
答案 0 :(得分:2)
您的查询必须更改。布尔值有两个值true
和false
,其中空值永远不等于任何值(即使null不等于null)。
你当然可以使用:
SELECT some_column, some_other_column
FROM some_table
WHERE (boolean_column = :parameter1 OR :parameter1 is null)