【发布时间】:2012-06-13 15:46:43
【问题描述】:
我有一个参数化的 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 条件。这才是真正的泡菜……
【问题讨论】:
-
嗯……你没有。这就是
where条件的用途。除非您进行一些注入(即t or 1=1),否则您必须在数据库表中放置一个新查询并取而代之检索该查询。
标签: sql postgresql boolean parameterized-query