PostgreSQL находит пустые строки

#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 <> '' . Там важно И, чтобы мы исключили оба.