Предварительный запрос для исключения строк на основе значения в определенном столбце - PullRequest
0 голосов
/ 08 ноября 2019

Кажется, это должно быть просто, но я думаю, что я что-то упустил.

У меня есть запрос, в котором я выбираю несколько столбцов из моей БД, и я хочу исключить все строки, где (например) провинция = 'ontario' или 'quebec'. Я пробовал это разными способами, с разными результатами - ни один из которых не является тем, что я хочу.

select .... from fulldata 
   WHERE substr(code, 1, 5) <> '10000' 
   AND (province <> 'ontario' OR province <> 'quebec')

Это работает для исключения строк, где провинция является одним из этих значений, но также исключает все строки, гдепровинция пустая / пустая - понятия не имею.

Я пытался AND NOT ( stateprovince = 'ontario' OR stateprovince = 'quebec') с тем же результатом.

Я пытался AND stateprovince <> ANY(VALUES 'ontario','quebec'), и это не оказывает никакого влияния (все данные отображаютсяничего не отфильтровывается)

Даже если разбить его на что-то столь же простое, как AND stateprovince <> 'ontario', избавляется от данных ontario, но также избавляется от пробелов, что не является ожидаемым результатом.

В процессе написания этой статьи я нашел способ обойти этот запрос:

...
AND (stateprovince IS NULL OR stateprovince <> 'ontario')
AND (stateprovince IS NULL OR stateprovince <> 'quebec')

, который работает, но не кажется «правильным» способом. Есть идеи, что случилось?

Я использую Presto на Афине.

1 Ответ

1 голос
/ 08 ноября 2019

Когда province равно NULL (думаю: «неизвестно»), тогда это:

(province <> 'ontario' OR province <> 'quebec')

будет равно NULL, отфильтровывая данную строку. Поскольку NOT (NULL) также NULL, не существует простого способа предотвратить это. Таким образом, вам нужна явная проверка NULL:

(province IS NULL OR province NOT IN('ontario', 'quebec'))

В качестве альтернативы вы можете написать так:

(coalesce(province, '') NOT IN('ontario', 'quebec'))
...