比较SQLite查询中的两个可能为NULL的值

时间:2019-05-19 11:59:02

标签: python sqlite sql-null

我有一个类似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,而是正在尝试检查两个可为空的值 是否匹配,无论它们是否为空。

2 个答案:

答案 0 :(得分:2)

在SQLite中,除非您使用IS NULLIS NOT NULL,否则假定NULL与另一个NULL不同,在这种情况下,NULL被视为相同的值。

IS IS NOT 是比较器(类似于=和!=),必须在其前后加上一个值,因此您不能使用{{1} }或类似的? IS。您可以使用? IS NOT1 IS 1

IS = IS NOT != 之间的区别在于 IS < / strong>和不是总是返回false(0)或true(1),而 = != 可以返回NULL(比较NULL为一个或两个为NULL将导致NULL。

请考虑以下内容:-

1 IS NOT 1

结果就是

  1. mytable创建为:-

enter image description here

  1. 查询结果为:-

enter image description here

答案 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中插入合适的运算符...