[英]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.