[英]python + sqlite3: using IS NOT in a join query
这按我期望的方式工作(c是游标)
c.execute('''SELECT e1.file, e1.sourceUrl, e1.rev
FROM externals1 AS e1
LEFT JOIN externals as e0
ON (e1.file = e0.file)
AND (e1.rev <> e0.rev)
''')
但我在这里得到一个错误:
c.execute('''SELECT e1.file, e1.sourceUrl, e1.rev
FROM externals1 AS e1
LEFT JOIN externals as e0
ON (e1.file = e0.file)
AND (e1.rev IS NOT e0.rev)
''')
与消息
sqlite3.OperationalError: near "e0": syntax error
这是怎么回事? 我想处理e0.rev为NULL的情况。
!=
是ANSI(不等于),在第二个示例中发布的内容对于我所知道的任何数据库都是无效的SQL。 您可以尝试:
SELECT e1.file, e1.sourceUrl, e1.rev
FROM externals1 AS e1
LEFT JOIN externals as e0 ON e0.file = e1.file
AND e1.rev NOT IN (e0.rev)
SELECT e1.file, e1.sourceUrl, e1.rev
FROM externals1 AS e1
LEFT JOIN externals as e0
ON (e1.file = e0.file)
AND (e1.rev IS NOT NULL)
NULL表示“未分配或未知值”,因此永远不能等于或不等于其他值。 (如何将未知或未分配的事物与其他未知或未分配的事物进行比较?)因此,您不能使用<>
或=
进行测试; 您必须改为使用特殊运算符IS / IS NOT。
您也可以使用
NOT (e1.rev = e0.rev)
如果您要测试非平等。
SELECT e1.file, e1.sourceUrl, e1.rev
FROM externals1 AS e1
LEFT JOIN externals as e0
ON e0.file = e1.file
AND e1.rev <> e0.rev
AND e1.rev IS NOT NULL
构造是operand IS NULL
和operand IS NOT NULL
( IS NUll
/ IS NOT NULL
运算符只有一个操作数 !)-我想需要除了'not'之外的NULL校验,但是很难从问题中分辨出来。
请记住,当x
或y
中的一个(或两个)均为NULL
时, x <> y
始终为true。 (至少对于兼容SQL89的引擎。)
快乐的SQLing。
另外: 关于NULL的Wikipedia文章通常是一个有趣的读物。 它讨论了一些基本的NULL构造(可能或可能不完全适用于特定的DB ...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.