【问题标题】:Boolean wildcard in postgresqlpostgresql 中的布尔通配符
【发布时间】: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


【解决方案1】:

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

你当然可以使用:

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

【讨论】:

  • 我认为这可能有效,或者至少它让我朝着正确的方向前进。
  • 我不记得你是否可以两次使用相同的参数(手头没有我的开发机器)。如果没有,您可能需要将其设为 param1,param2。
  • 它使用了两次,但我每次都必须对它们进行类型转换以确保比较有效。
  • 嗯,这在 PHP 下工作,但当我尝试将代码移植到 Python 时却不行......见上文。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多