繁体   English   中英

python + sqlite3:在联接查询中使用IS NOT

[英]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 NULLoperand IS NOT NULLIS NUll / IS NOT NULL 运算符只有一个操作数 !)-我想需要除了'not'之外的NULL校验,但是很难从问题中分辨出来。

请记住,当xy中的一个(或两个)均为NULL时, x <> y始终为true。 (至少对于兼容SQL89的引擎。)

快乐的SQLing。

另外: 关于NULLWikipedia文章通常是一个有趣的读物。 它讨论了一些基本的NULL构造(可能或可能不完全适用于特定的DB ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM