Py-postgresql:WHERE param =无无效

问题描述 投票:1回答: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有关,但有没有办法使这项工作?

postgresql py-postgresql
1个回答
1
投票

来自Comparison Functions and Operators

不要写expression = NULL,因为NULL不等于“NULL”。 (null值表示未知值,并且不知道两个未知值是否相等。)

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

和:

19.13.2。平台和客户端兼容性

transform_null_equals(boolean)

启用时,表达式expr = NULL(或NULL = expr)被视为expr IS NULL,即,如果expr计算为空值,则返回true,否则返回false。正确的符合SQL规范的expr = NULL行为始终返回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;
© www.soinside.com 2019 - 2024. All rights reserved.