Сравнение двух потенциально пустых значений в запросе SQLite - PullRequest
0 голосов
/ 19 мая 2019

У меня есть запрос SQLite, например:

SELECT max(e), url, branch FROM (SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1
                                                        WHERE (SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project = ?1)
                                                        GROUP BY T1.url, T1.branch
                                                        UNION
                                                        SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project = ?1 )
                               GROUP BY url ORDER BY e

обратите внимание, что есть параметр ?1 в двух случаях. в любом случае, в некоторых случаях он может быть нулевым (None в Python, насколько я знаю, становится NULL в SQLite). Это проблема, потому что я не понимаю обработку нуля, но в основном я ничего не получаю.

Итак, как мне обработать where "project" = ?1, когда ?1 НЕДЕЙСТВИТЕЛЕН? Я хотел бы избежать двух отдельных запросов для этого. Я оглянулся, но могу найти только вещи о IS NULL / IS NOT NULL, которые мне не подходят, потому что я не пытаюсь проверить, является ли столбец нулевым или нет, а скорее я пытаюсь проверьте, совпадают ли два значения Nullable с , равны ли они NULL или нет.

1 Ответ

2 голосов
/ 19 мая 2019

В SQLite NULL предполагается отличным от другого NULL, если только вы не используете IS NULL или IS NOT NULL, и в этом случае NULL принимается за то же значение.

IS и IS NOT являются компараторами (сродни = и! =) И перед ними должно следовать значение, после которого вы не можете использовать ? IS или аналогично ? IS NOT. Вы можете использовать 1 IS 1 и 1 IS NOT 1.

Разница между IS и = и НЕ и ! = в том, что IS и IS NOT всегда будет возвращать false (0) или true (1), тогда как = и ! = могут возвращать NULL (сравнение с NULL как один или оба, из значений NULL приведет к NULL).

Обратите внимание на следующее: -

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mycolumn, myothercolumn);
INSERT INTO mytable VALUES(null,1),(1,null),(1,1),(null,null);
SELECT  
    NULL = mycolumn AS r1, 
    NULL != mycolumn AS r2, 
    mycolumn IS NOT NULL AS r3, 
    mycolumn IS NULL AS r4, 
    mycolumn = NULL AS r5, 
    mycolumn != NULL AS r6,
    mycolumn = myothercolumn AS r7, 
    myothercolumn = mycolumn AS r8,
    (mycolumn = myothercolumn) IS NULL AS r9,  
    (myothercolumn = mycolumn) IS NOT NULL AS r10,
    mycolumn IS 1 AS r11,
    mycolumn IS NOT 1 AS r12
FROM mytable;

В результате

  1. mytable создается как: -

enter image description here

  1. Результат запроса: -

enter image description here

...