Прочитав название темы, можно задать вопрос: “А зачем вообще вводить в БД поля, не содержащие значений?” Ответ на этот вопрос кроется в тексте ниже.
Что такое база данных? Это информация, которая формируется и развивается на протяжении всего времени своего существования. Постоянно приходится что-то добавлять, что-то убирать. И так на протяжении всего жизненного цикла БД. Однако, есть такие периоды, точней моменты в жизни БД, когда есть часть информации об объекте и предполагается, что остальная часть будет добавлена по истечении какого-то периода времени.
Для примера возьмём таблицу должников.
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 ...)
asked Dec 12, 2011 at 6:49
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č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
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
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
6,4444 gold badges52 silver badges82 bronze badges
answered Dec 12, 2011 at 6:52
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.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
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
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
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
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:
-
Use of Trim to check-
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
-
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 PandeyVikash Pandey
5,3816 gold badges39 silver badges42 bronze badges
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Paul Roub
36.3k27 gold badges83 silver badges92 bronze badges
answered Feb 12, 2019 at 15:47
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
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
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
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 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
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
3,7395 gold badges35 silver badges66 bronze badges
answered Feb 20, 2019 at 15:46
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
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
answered Mar 31, 2017 at 3:00
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
ArthurArthur
1172 bronze badges
1
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
Nathan Tuggy
2,24327 gold badges30 silver badges38 bronze badges
answered Jun 7, 2017 at 2:59
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
orcharacter 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');