我有一个类似SQLite的查询:
SELECT max(e), url, branch FROM (SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1
WHERE (SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project = ?1)
GROUP BY T1.url, T1.branch
UNION
SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project = ?1 )
GROUP BY url ORDER BY e
请注意,?1
参数有两次出现。无论如何,在某些情况下,它可以为null(据我所知,在python中,None
在SQLite中变成了NULL
)。这是一个问题,因为我不了解null处理,但基本上我什么也得不到。
那么,当where "project" = ?1
为NULL时如何处理?1
?我想避免有2个单独的查询。我环顾四周,但我只能找到关于IS NULL
/ IS NOT NULL
的东西,这些东西对我不起作用,因为我不是在尝试检查列是否为null或不为null,而是正在尝试检查两个可为空的值 是否匹配,无论它们是否为空。
答案 0 :(得分:2)
在SQLite中,除非您使用IS NULL
或IS NOT NULL
,否则假定NULL与另一个NULL不同,在这种情况下,NULL被视为相同的值。
IS 和 IS NOT 是比较器(类似于=和!=),必须在其前后加上一个值,因此您不能使用{{1} }或类似的? IS
。您可以使用? IS NOT
和1 IS 1
。
IS 和 = 和 IS NOT 和!= 之间的区别在于 IS < / strong>和不是总是返回false(0)或true(1),而 = 和!= 可以返回NULL(比较NULL为一个或两个为NULL将导致NULL。
请考虑以下内容:-
1 IS NOT 1
结果就是
答案 1 :(得分:0)
在SQLite中,可以使用IS
运算符代替=来进行NULL大量比较。也可以与?
插入一起使用(不同于MikeT的意思)。
Python示例:
>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe = ?', (3, None)).fetchall()
[]
>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe IS ?', (3, None)).fetchall()
[<Row object>, <Row object>]
>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe is ?', (3, 'TestRecipe')).fetchall()
[<Row object>]
The IS and IS NOT operators的工作方式类似于=和!=,除非当其中一个或两个都发生时 的操作数为NULL。在这种情况下,如果两个操作数均为NULL, 然后IS运算符求值为1(真),而IS NOT运算符 计算结果为0(假)。如果一个操作数是NULL,而另一个不是, 那么IS运算符的计算结果为0(假),而IS NOT运算符为 1(正确)。 IS或IS NOT表达式不可能 评估为NULL。运算符IS和IS的优先级与 =。
对于较早的MySQL / Mariadb版本,至少NULL允许的比较运算符为<=>
,而在PostgreSQL中,其IS NOT DISTINCT FROM
。
PostgreSQL变体在SQL:2003标准中定义。 为了临时兼容,可以从Python dict中插入合适的运算符...