python + sqlite3: использование IS NOT в запросе соединения - PullRequest
2 голосов
/ 02 марта 2011

Это работает так, как я ожидаю (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.

Ответы [ 3 ]

2 голосов
/ 02 марта 2011
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)

, если хотите проверить на неравенство.

2 голосов
/ 02 марта 2011

!= - это 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)
0 голосов
/ 02 марта 2011
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 !) - Iпредставьте себе, что NULL-проверка в дополнение к 'not' желательна, но трудно понять из вопроса.

Помните, x <> y всегда верно, когда либо (или оба) x или yявляются NULL.(По крайней мере, для SQL89-совместимого движка.)

Happy SQL'ing.

Добавление: Статья Википедии о NULL в целом представляет интерес для чтения.В нем говорится о некоторых базовых конструкциях NULL (которые могут или не могут полностью применяться к конкретной БД ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...