Выберите Query with IS NULL и Значения - PullRequest
0 голосов
/ 13 июня 2018

Я новичок в PostgreSQL, и это для меня критическая проблема.

Моя таблица выглядит следующим образом:

test num_1 num_2
0    1     1
1
2

Несколько столбцов в моей базе данных имеют значения NULL или не NULL.Я хочу прочитать test, используя только один запрос, который может принимать значения как NULL, так и не NULL.

Запросы должны иметь следующие функции:

Первый запрос:

x = 1
sql = ("""SELECT test FROM table WHERE num_1 = %s""")
df = pd.read_sql(sql, con = db, params = (x))

Он должен возвращать 0.

Второй запрос:

x = None
sql = ("""SELECT test FROM table WHERE num_1 IS NULL""")
df = pd.read_sql(sql, con = db, params = (x))

Должно возвращаться 1,2.

Как этого добиться, используя только один запрос?Я попробовал приведенный ниже код, но он не работает правильно:

x = None
sql = ("""SELECT test FROM table WHERE num_1 = %s or num_1 IS NULL """)
df = pd.read_sql(sql, con = db, params = (x))

Возвращает 0,1,2.Я считаю, что это происходит из-за "или" в запросе.Я хочу иметь только один запрос, который может обрабатывать или принимать как NULL, так и значение.

Если я запрашиваю NULL, он должен возвращать 1,2, а если я запрашиваю 1, он должен возвращать 0.Я не хочу 0,1,2.

1 Ответ

0 голосов
/ 13 июня 2018

Это случай для IS NOT DISTINCT FROM, который похож на =, который рассматривает NULL как нормальное значение:

SELECT test FROM table WHERE num_1 IS NOT DISTINCT FROM %s

Недостатком является то, что это условие не может использоватьиндекс.

Если вам нужно использовать индекс, вы можете написать

SELECT test FROM table WHERE num_1 = %s
UNION ALL
SELECT test FROM table WHERE num_1 IS NULL AND %s IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...