#sql #postgresql
#sql #postgresql
Вопрос:
Я хочу выполнить поиск ненулевых значений из ‘currentsheet’, который работает нормально, но некоторые поля на самом деле пустые, а не нулевые. Как я могу найти пустые поля с помощью PostgreSQL, поскольку приведенное ниже не сработало и по-прежнему отображает пустые значения в поле ‘currentsheet’.
SELECT *
FROM PUBLIC._http_requests
WHERE (_http_requests.currentsheet IS NOT NULL OR _http_requests.currentsheet <> '')
AND _http_requests.session_id IS NOT NULL
AND _http_requests.http_referer IS NOT NULL
Ответ №1:
Вам нужно использовать AND
для проверки _http_requests.currentsheet
. Если бы это было NULL
так, то это всегда было бы верно для <> ''
проверки и наоборот.
В качестве более простого примера вы можете использовать операторы select без таблицы, чтобы помочь отлаживать подобные вещи (из psql
или любого другого инструмента SQL query, который вам нравится):
select ('' is not null or '' <> '') as empty_result,
(null is not null or null <> '') as null_resu<
empty_result | null_result
-------------- -------------
t |
Если строка есть ''
, вы получаете true
. Если строка есть null
, вы получаете null
(это потому, что сравнения с null
являются странностями SQL — select null = null;
результатов null
). Давайте посмотрим, что произойдет, когда мы заменим or
на and
:
select ('' is not null and '' <> '') as empty_result,
(null is not null and null <> '') as null_resu<
empty_result | null_result
-------------- -------------
f | f
Аккуратно! С X is not null and X <> ''
помощью, мы получаем false
, когда X
либо ''
или null
.
Итак, способ сформулировать оператор select, чтобы делать то, что вы на самом деле хотите:
SELECT *
FROM PUBLIC._http_requests
WHERE _http_requests.currentsheet IS NOT NULL
AND _http_requests.currentsheet <> ''
AND _http_requests.session_id IS NOT NULL
AND _http_requests.http_referer IS NOT NULL;
Ответ №2:
Я думаю, вам просто нужно AND _http_requests.currentsheet <> ''
. Там важно И, чтобы мы исключили оба.