sql - postgresql 中的 boolean 通配符

标签 sql postgresql boolean parameterized-query

我有一个参数化的 postgresql 查询,用户可以通过 PHP 前端与之交互。其中一个参数涉及 boolean 值,我想为用户提供“True”、“False”、“Unknown”(Null)或“Doesn't matter”(返回任何结果)的选项。

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

换句话说,无论“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”或可以转换为 boolean 值的字符串值(例如,“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 条件下也是如此。这是一个真正的泡菜......

最佳答案

那么您的查询必须更改。 boolean 值有两个值 truefalse,null 永远不会等于任何东西(即使 null 也不等于 null)。

你当然可以使用:

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

关于sql - postgresql 中的 boolean 通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11018613/

相关文章:

php - MySQL 到 PHP 数组分组重复值

mysql - 使用 JOIN 在 Wordpress 中进行高级 MySQL 查询

php - 如何在返回时对从 mysql 返回的每一行进行编号

php - 如何使用 Between 条件从表中选择值

python - psycopg - 将 gzipped 数据插入 bytea 列

node.js - NodeJS Bookshelf 用户-追随者关系示例

regex - url第一部分的子字符串正则表达式

php - $foo === TRUE 和 TRUE === $foo 有什么区别

c++ - SelectionSort with bool - 数组的第一个值作为整个选项卡出现

java - 对照另一个数组列表检查数组列表