1

我正在使用python3.6py-postgresql==1.2.1。我有以下声明:

db.prepapre("SELECT * FROM seasons WHERE user_id=$1 AND season_id=$2 LIMIT 1),其中 season_id 可以为 NULL。

我希望能够season_id通过None作为NULL 获得最新的记录$2 param,但它不起作用。相反,我需要创建第二条语句: db.prepapre("SELECT * FROM seasons WHERE user_id=$1 AND season_id IS NULL LIMIT 1)

它必须与season_id = NULL不工作有关season_id IS NULL,但有没有办法使这项工作?

4

1 回答 1

1

比较函数和运算符

不要写表达式 = NULL,因为 NULL 不“等于” NULL。(空值表示未知值,不知道两个未知值是否相等。)

如果 expression 的计算结果为 null 值,某些应用程序可能期望 expression = NULL 返回 true。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到这一点,则可以使用 transform_null_equals 配置变量。如果启用,PostgreSQL 会将 x = NULL 子句转换为 x IS NULL。

和:

19.13.2。平台和客户端兼容性

transform_null_equals(布尔值)

打开时,形式为 expr = NULL(或 NULL = expr)的表达式被视为 expr IS NULL,也就是说,如果 expr 计算结果为空值,则它们返回 true,否则返回 false。expr = NULL 正确的符合 SQL 规范的行为是始终返回 null(未知)。因此此参数默认为关闭。


你可以重写你的查询:

SELECT * 
FROM seasons 
WHERE user_id = $1 
  AND (season_id = $2 OR ($2 IS NULL AND season_id IS NULL))
-- ORDER BY ... --LIMIT without sorting could be dangerous 
                -- you should explicitly specify sorting
LIMIT 1;
于 2018-03-04T11:22:06.973 回答