簡體   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