我正在使用python3.6
和py-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
有关,但有没有办法使这项工作?
来自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;