Как найти пустое значение sql

Прочитав название темы, можно задать вопрос: “А зачем вообще вводить в БД поля, не содержащие значений?” Ответ на этот вопрос кроется в тексте ниже.
Что такое база данных? Это информация, которая формируется и развивается на протяжении всего времени своего существования. Постоянно приходится что-то добавлять, что-то убирать. И так на протяжении всего жизненного цикла БД. Однако, есть такие периоды, точней моменты в жизни БД, когда есть часть информации об объекте и предполагается, что остальная часть будет добавлена по истечении какого-то периода времени.
Для примера возьмём таблицу должников.

Debtors

Num Month Year Sname City Address Debt
0001 Июль 2012 Иванов Ставрополь Ставропольская, 1 50000
0002 Декабрь 2019 Кононов Татарка Загородная, 254 684068
0003 Май 2013 Ямшин Михайловск Сельская, 48 165840
0004 Август 2012 Прени Ставрополь Центральная, 16 46580
9564 Март 2015 Улиева Дёмино Международная, 156 435089
9565 Октябрь 2012 Павлова Ставрополь Вокзальная, 37 68059
9566 Январь 2012 Урюпа Михайловск Фонтанная, 19 51238
9567 Ноябрь 2017 Вальетов Татарка Выездная, 65 789654

Предположим, что появился очередной кандидат по долгу, но сумма его задолженности пока не сформирована, но известны остальные его данные – дата, до которой он должен погасить задолженность, его фамилия и адрес проживания. В этом случае, столбец Debt для данного должника останется пустым, а чтобы это подтвердить, поле будет назначено как пустое – NULL

Debtors

Num Month Year Sname City Address Debt
0001 Июль 2012 Иванов Ставрополь Ставропольская, 1 50000
0002 Декабрь 2019 Кононов Татарка Загородная, 254 684068
0003 Май 2013 Ямшин Михайловск Сельская, 48 165840
0004 Август 2012 Прени Ставрополь Центральная, 16 46580
9564 Март 2015 Улиева Дёмино Международная, 156 435089
9565 Октябрь 2012 Павлова Ставрополь Вокзальная, 37 68059
9566 Январь 2012 Урюпа Михайловск Фонтанная, 19 51238
9567 Ноябрь 2017 Вальетов Татарка Выездная, 65 789654
9568 Февраль 2015 Ялтинов Спицевка Степная, 43 NULL

Как говорилось выше, значение NULL подразумевает, что поле с таким значением не содержит каких-либо данных, которыми могли бы оперировать SQL-запросы. То есть, если проводить какие-либо отборы по используя данный оператор, результат будет таким же, как и при указании неверной неверной строки. Другими словами, любой запрос типа
SELECT *
FROM Debtors
WHERE любой столбец NULL;

Приведёт к тому, что программа работы с БД выдаст ошибку.
Для выхода из такой ситуации в SQL существует специальный оператор, который используется с ключевым словом NULL – это оператор IS. Теперь можно задать запрос, который смог бы отобрать строки, содержащие, точней не содержащие никаких значений
SELECT *
FROM Debtors
WHERE Debts IS NULL;

Результатом будет следующее

Debtors

Num Month Year Sname City Address Debt
9568 Февраль 2015 Ялтинов Спицевка Степная, 43 NULL

Если перевести ключевые слова строки запроса “WHERE Debts IS NULL” с английского, то получится буквально следующее: “ГДЕ Debts ЕСТЬ ПУСТОЕ”
Можно ли сделать, чтобы запрос с ключевым словом NULL игнорировался? Можно! Достаточно перед ним поставить Булево выражение NOT. 
Есть несколько вариантов размещения ключевого слова NOT в запросе, да бы игнорировалось значение NULL
SELECT *
FROM Debtors
WHERE Debt NOT IS NULL;

Или же использовать
SELECT *
FROM Debtors
WHERE NOT Debt IS NULL;

Результат обоих запросов будет один

Debtors

Num Month Year Sname City Address Debt
0001 Июль 2012 Иванов Ставрополь Ставропольская, 1 50000
0002 Декабрь 2019 Кононов Татарка Загородная, 254 684068
0003 Май 2013 Ямшин Михайловск Сельская, 48 165840
0004 Август 2012 Прени Ставрополь Центральная, 16 46580
9564 Март 2015 Улиева Дёмино Международная, 156 435089
9565 Октябрь 2012 Павлова Ставрополь Вокзальная, 37 68059
9566 Январь 2012 Урюпа Михайловск Фонтанная, 19 51238
9567 Ноябрь 2017 Вальетов Татарка Выездная, 65 789654

То есть данные запросы попросту убрали из табличной части БД строки, содержащие в столбце Debt пустые ячейки.
Эта запись была посвящена тому, как ведёт себя БД, если в её состав входят ячейки с отсутствующими данными. Так же было сказано о том, как можно исключать такие ячейки при помощи операторов NULL и IS NULL.

I have a column in a table which might contain null or empty values. How do I check if a column is empty or null in the rows present in a table?

(e.g. null or '' or '  ' or '      ' and ...)

Peter Mortensen's user avatar

asked Dec 12, 2011 at 6:49

priya's user avatar

3

This will select all rows where some_col is NULL or '' (empty string)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

answered Dec 12, 2011 at 6:54

maček's user avatar

mačekmaček

75.9k37 gold badges167 silver badges197 bronze badges

2

As defined by the SQL-92 Standard, when comparing two strings of differing widths, the narrower value is right-padded with spaces to make it is same width as the wider value. Therefore, all string values that consist entirely of spaces (including zero spaces) will be deemed to be equal e.g.

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Therefore, this should work regardless of how many spaces make up the some_col value:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

or more succinctly:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

answered Dec 12, 2011 at 12:28

onedaywhen's user avatar

onedaywhenonedaywhen

54.9k12 gold badges99 silver badges139 bronze badges

3

A shorter way to write the condition:

WHERE some_col > ''

Since null > '' produces unknown, this has the effect of filtering out both null and empty strings.

answered Jun 30, 2013 at 16:24

Andomar's user avatar

AndomarAndomar

231k49 gold badges377 silver badges402 bronze badges

6

Please mind: the best practice it at the end of the answer.


You can test whether a column is null or is not null using WHERE col IS NULL or WHERE col IS NOT NULL e.g.

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

In your example you have various permutations of white space. You can strip white space using TRIM and you can use COALESCE to default a NULL value (COALESCE will return the first non-null value from the values you suppy.

e.g.

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '')) = '' 

This final query will return rows where MyCol is null or is any length of whitespace.

If you can avoid it, it’s better not to have a function on a column in the WHERE clause as it makes it difficult to use an index. If you simply want to check if a column is null or empty, you may be better off doing this:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

See TRIM COALESCE and IS NULL for more info.

Also Working with null values from the MySQL docs

questionto42's user avatar

questionto42

6,4444 gold badges52 silver badges82 bronze badges

answered Dec 12, 2011 at 6:52

Code Magician's user avatar

Code MagicianCode Magician

23.1k7 gold badges59 silver badges77 bronze badges

2

Another method without WHERE, try this..

Will select both Empty and NULL values

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

answered Jan 3, 2016 at 17:06

PodTech.io's user avatar

PodTech.ioPodTech.io

4,74640 silver badges24 bronze badges

2

Either

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

or

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

answered Jun 7, 2017 at 3:48

Reynante Daitol's user avatar

This statement is much cleaner and more readable for me:

select * from my_table where ISNULL(NULLIF(some_col, ''));

answered May 30, 2016 at 16:10

Amaynut's user avatar

AmaynutAmaynut

4,0115 gold badges39 silver badges43 bronze badges

try

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

or

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Reference

answered Dec 12, 2011 at 6:53

xkeshav's user avatar

xkeshavxkeshav

53.4k43 gold badges175 silver badges245 bronze badges

I hate messy fields in my databases. If the column might be a blank string or null, I’d rather fix this before doing the select each time, like this:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

This keeps the data tidy, as long as you don’t specifically need to differentiate between NULL and empty for some reason.

answered Dec 3, 2014 at 17:16

Keith Johnson's user avatar

1

While checking null or Empty value for a column in my project, I noticed that there are some support concern in various Databases.

Every Database doesn’t support TRIM method.

Below is the matrix just to understand the supported methods by different databases.

The TRIM function in SQL is used to remove specified prefix or suffix from a string. The most common pattern being removed is white spaces. This function is called differently in different databases:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • SQL Server: RTRIM(), LTRIM()

How to Check Empty/Null :-

Below are two different ways according to different Databases-

The syntax for these trim functions are:

  1. Use of Trim to check-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Use of LTRIM & RTRIM to check-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Above both ways provide same result just use based on your DataBase support. It Just returns the FirstName from UserDetails table if it has an empty LastName

Hoping this will help you 🙂

answered Oct 21, 2016 at 20:58

Vikash Pandey's user avatar

Vikash PandeyVikash Pandey

5,3816 gold badges39 silver badges42 bronze badges

SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

Paul Roub's user avatar

Paul Roub

36.3k27 gold badges83 silver badges92 bronze badges

answered Feb 12, 2019 at 15:47

Baltazar Moreno's user avatar

3

My two cents.

In MySQL you can use the COALESCE function:

Returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

So you can simplify your query like this:

SELECT * FROM table WHERE COALESCE(some_col, '') = '';

answered Sep 8, 2021 at 9:54

Pioz's user avatar

PiozPioz

5,9613 gold badges46 silver badges65 bronze badges

If you want to have NULL values presented last when doing an ORDER BY, try this:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

answered Dec 12, 2011 at 6:52

Ghostman's user avatar

GhostmanGhostman

6,0229 gold badges34 silver badges53 bronze badges

0

You can also do

SELECT * FROM table WHERE column_name LIKE ''

The inverse being

SELECT * FROM table WHERE column_name NOT LIKE ''

answered Jun 22, 2017 at 3:18

brenjt's user avatar

brenjtbrenjt

15.9k13 gold badges77 silver badges118 bronze badges

2

select * from table where length(RTRIM(LTRIM(column_name))) > 0

answered Jan 25, 2019 at 13:15

Hakan Ilgar's user avatar

Hakan IlgarHakan Ilgar

1415 silver badges14 bronze badges

2

The below SQL query works fine.

SELECT * FROM <table-name> WHERE <column-name> IS NULL;

answered Mar 23, 2022 at 13:55

Kalhara Tennakoon's user avatar

1

In my case, space was entered in the column during the data import and though it looked like an empty column its length was 1. So first of all I checked the length of the empty looking column using length(column) then based on this we can write search query

SELECT * FROM table WHERE LENGTH(column)=0;

Hashim Aziz's user avatar

Hashim Aziz

3,7395 gold badges35 silver badges66 bronze badges

answered Feb 20, 2019 at 15:46

MR AND's user avatar

MR ANDMR AND

3767 silver badges27 bronze badges

3

Below code works great, to check null or empty and fallback to other column:

SELECT COALESCE(NULLIF(col1, ''), col2) as 'someName'

Above sql means:

if `col1` column value is NOT null and NOT empty string  
then take `col1`
otherwise take `col2`  

return above value as `someName`

answered Mar 14 at 3:52

Manohar Reddy Poreddy's user avatar

try this if the datatype are string and row is null

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

if the datatype are int or column are 0 then try this

SELECT * FROM table WHERE column_name > = 0

HoldOffHunger's user avatar

answered Mar 31, 2017 at 3:00

Monis Qureshi's user avatar

Get rows with NULL, 0, ”, ‘ ‘, ‘ ‘

    SELECT * FROM table WHERE some_col IS NOT TRUE;

Get rows without NULL, 0, ”, ‘ ‘, ‘ ‘

    SELECT * FROM table WHERE some_col IS TRUE;

answered Sep 23, 2020 at 19:41

Arthur's user avatar

ArthurArthur

1172 bronze badges

1

SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

Nathan Tuggy's user avatar

Nathan Tuggy

2,24327 gold badges30 silver badges38 bronze badges

answered Jun 7, 2017 at 2:59

SaAy's user avatar

2

The expression stringexpression = '' yields:

TRUE   .. for '' (or for any string consisting of only spaces with the data type char(n))
NULL   .. for NULL
FALSE .. for anything else

So to check for: stringexpression is either NULL or empty”:

(stringexpression = '') IS NOT FALSE

Or the reverse approach (may be easier to read):

(stringexpression <> '') IS NOT TRUE

Works for any character type including char(n). The manual about comparison operators.

Or use your original expression without trim(), which is costly noise for char(n) (see below), or incorrect for other character types: strings consisting of only spaces would pass as empty string.

coalesce(stringexpression, '') = ''

But the expressions at the top are faster.

Asserting the opposite is even simpler: stringexpression is neither NULL nor empty”:

stringexpression <> ''

About char(n)

This is about the data type char(n), short for: character(n). (char / character are short for char(1) / character(1).) Its use is discouraged in Postgres:

In most situations text or character varying should be used instead.

Do not confuse char(n) with other, useful, character types varchar(n), varchar, text or "char" (with double-quotes).

In char(n) an empty string is not different from any other string consisting of only spaces. All of these are folded to n spaces in char(n) per definition of the type. It follows logically that the above expressions work for char(n) as well – just as much as these (which wouldn’t work for other character types):

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '

Demo

Empty string equals any string of spaces when cast to char(n):

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

Result:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

Test for “null or empty string” with char(n):

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::char(5))
   , ('')
   , ('   ')                -- not different from '' in char(n)
   , (NULL)
   ) sub(stringexpression);

Result:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | t         | t
                  | t         | t     | t     | t         | t         | t
 null             | null      | t     | t     | t         | t         | t

Test for “null or empty string” with text:

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::text)
   , ('')
   , ('   ')                -- different from '' in a sane character types
   , (NULL)
   ) sub(stringexpression);

Result:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | f         | f
                  | f         | f     | f     | f         | f         | f
 null             | null      | t     | t     | t         | t         | f

db<>fiddle here
Old sqlfiddle

Related:

  • Any downsides of using data type “text” for storing strings?

В этом учебном материале вы узнаете, как использовать SQL условие IS NULL с синтаксисом и примерами.

Описание

Условие IS NULL используется в SQL для проверки значения NULL. Оно возвращает TRUE, если найдено значение NULL, в противном случае оно возвращает FALSE. Его можно использовать в операторе SELECT, INSERT, UPDATE или DELETE.

Синтаксис

Синтаксис для условия IS NULL в SQL:

expression IS NULL

Параметры или аргументы

expression
Выражение для проверки значения NULL.

Пример – использование IS NULL с оператором SELECT

При тестировании на NULL значение, IS NULL является рекомендуемым оператором сравнения для использования в SQL. Давайте начнем с примера, который показывает, как использовать условие IS NULL в запросе SELECT.
В этом примере у нас есть таблица customers со следующими данными:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

Введите следующий SQL оператор:

SELECT *

  FROM customers

WHERE favorite_website IS NULL;

Будет выбрана 1 запись. Вот результаты, которые вы получите:

customer_id first_name last_name favorite_website
8000 Johnny Depp NULL

В этом примере будут возвращены все записи из таблицы customers, где поле favourite_website содержит значение NULL.

Пример – использование IS NULL с оператором UPDATE

Далее давайте рассмотрим пример использования условия IS NULL в запросе UPDATE.

В этом примере у нас есть таблица products содержащая следующие данные:

product_id product_name category_id
1 Pear 50
2 Banana 50
3 Orange 50
4 Apple 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex NULL

Введите следующий запрос UPDATE:

UPDATE products

   SET category_id = 110

WHERE category_id IS NULL;

Будет обновлена 1 запись. Снова выберите данные из таблицы products:

Вот результаты, которые вы должны получить:

product_id product_name category_id
1 Pear 50
2 Banana 50
3 Orange 50
4 Apple 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex 110

В этом примере будут обновлены все значения category_id в таблице products до 110, где category_id содержит значение NULL. Как видите, category_id в последней строке обновлен до 110.

Пример – использование IS NULL с оператором DELETE

Далее давайте рассмотрим пример использования условия IS NULL в операторе DELETE.
В этом примере у нас есть таблица orders со следующими данными:

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/07/01

Введите следующий оператор DELETE:

DELETE FROM orders

WHERE customer_id IS NULL;

Будет удалена 1 запись. Снова выберите данные из таблицы orders:

Вот результаты, которые вы получите:

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20

В этом примере будут удалены все записи из таблицы orders, где customer_id содержит значение NULL. Как вы можете видеть, запрос удалил запись для order_id = 5.

Мы уже познакомились с синтаксисом оператора WHERE и операторами сравнения, но помимо них в условных запросах мы можем использовать следующие полезные операторы:

  • IS NULL
  • BETWEEN
  • IN

Давайте рассмотрим их применение.

IS NULL

Оператор IS NULL позволяет узнать равно ли проверяемое значение NULL, т.е. пустое ли значение.

Для примера выведем всех преподавателей, у кого отсутствует отчество:

SELECT * FROM Teacher
WHERE middle_name IS NULL;

Для использования отрицания, то есть, если мы хотим найти все записи, где поле не равно NULL, мы должны использовать следующий синтаксис:

SELECT * FROM Teacher
WHERE middle_name IS NOT NULL;

BETWEEN

Оператор BETWEEN min AND max позволяет узнать расположено ли проверяемое значение столбца в интервале между min и max, включая сами значения min и max.
Он идентичен условию:

... WHERE field >= min AND field <= max

Используется данный оператор следующим образом:

SELECT * FROM Payments
WHERE unit_price BETWEEN 100 AND 500;

В качестве результата вернутся все записи из таблицы Payments, где значение поля unit_price будет от 100 до 500.

IN

Оператор IN позволяет узнать входит ли проверяемое значение столбца в список определённых значений.

SELECT * FROM FamilyMembers
WHERE status IN ('father', 'mother');

Добавить комментарий