Select from если пусто то ошибка

Can anyone point out how to check if a select query returns non empty result set?

For example I have next query:

SELECT * FROM service s WHERE s.service_id = ?;

Should I do something like next:

ISNULL(SELECT * FROM service s WHERE s.service_id = ?)

to test if result set is not empty?

asked May 21, 2010 at 19:30

Denys S.'s user avatar

3

IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?)
 BEGIN
   --DO STUFF HERE

 END

answered May 21, 2010 at 19:33

Ed B's user avatar

Ed BEd B

5,9883 gold badges26 silver badges35 bronze badges

5

Use @@ROWCOUNT:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT > 0 
   -- do stuff here.....

According to SQL Server Books Online:

Returns the number of rows affected by
the last statement. If the number of
rows is more than 2 billion, use
ROWCOUNT_BIG.

answered May 21, 2010 at 19:37

marc_s's user avatar

marc_smarc_s

729k174 gold badges1327 silver badges1455 bronze badges

5

I agree with Ed B. You should use EXISTS method but a more efficient way to do this is:

IF EXISTS(SELECT 1 FROM service s WHERE s.service_id = ?)
BEGIN
   --DO STUFF HERE

END

HTH

answered May 21, 2010 at 19:36

Raja's user avatar

RajaRaja

3,5983 gold badges28 silver badges39 bronze badges

5

You can do it in a number of ways.

IF EXISTS(select * from ....)
begin
 -- select * from .... 
end
else
 -- do something 

Or you can use IF NOT EXISTS , @@ROW_COUNT like

select * from ....
IF(@@ROW_COUNT>0)
begin
-- do something
end

answered Dec 6, 2017 at 21:20

Samim Hussain's user avatar

try:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT=0
BEGIN
    PRINT 'no rows!'
END

answered May 21, 2010 at 19:38

KM.'s user avatar

KM.KM.

101k34 gold badges178 silver badges212 bronze badges

0

SELECT COUNT(1) FROM service s WHERE s.service_id = ?

answered May 21, 2010 at 19:44

ovais.tariq's user avatar

ovais.tariqovais.tariq

2,62717 silver badges12 bronze badges

2

To summarize the below posts a bit:

If all you care about is if at least one matching row is in the DB then use exists as it is the most efficient way of checking this: it will return true as soon as it finds at least one matching row whereas count, etc will find all matching rows.

If you actually need to use the data for processing or if the query has side effects, or if you need to know the actual total number of rows then checking the ROWCOUNT or count is probably the best way on hand.

answered May 21, 2010 at 19:40

Donnie's user avatar

DonnieDonnie

45.5k10 gold badges64 silver badges86 bronze badges

SELECT * FROM service s WHERE s.service_id = ?;
IF @@rowcount = 0
begin
select 'no data'
end

answered Jun 9, 2014 at 8:19

Viranja kaushalya's user avatar

SELECT count(*) as count FROM service s WHERE s.service_id = ?;

test if count == 0 .

More baroquely:

select case when (SELECT count(*) as count FROM service s WHERE s.service_id = ?) = 0
then ‘No rows, bro!’ else ‘You got data!» end as stupid_message;

answered May 21, 2010 at 19:34

tpdi's user avatar

tpditpdi

34.5k11 gold badges80 silver badges120 bronze badges

In my sql use information function

select FOUND_ROWS();

it will return the no. of rows returned by select query.

answered Feb 16, 2015 at 12:07

Sunil Kumar's user avatar

Sunil KumarSunil Kumar

6551 gold badge7 silver badges12 bronze badges

SELECT count(*) as CountThis ....

Then you can compare it as string like so:

IF CHECKROW_RS("CountThis")="0" THEN ...

CHECKROW_RS is an object

answered Feb 11, 2019 at 14:24

csandreas1's user avatar

csandreas1csandreas1

2,0061 gold badge26 silver badges47 bronze badges

well there is a way to do it a little more code but really effective

$sql = "SELECT * FROM messages";  //your query
$result=$connvar->query($sql);    //$connvar is the connection variable
$flag=0;
     while($rows2=mysqli_fetch_assoc($result2))
    { $flag++;}
    
if($flag==0){no rows selected;}
else{
echo $flag." "."rows are selected"
}

answered May 20, 2019 at 7:44

Karan Shrivastav's user avatar

When selecting data from a table, there might be some NULL values that you don’t want to show, or you want to replace it with 0 for the aggregate functions. Then you can use COALESCE to replace the NULL with 0.

For example, we have the table salaries with 5 columns: emp_no, from_date, to_date, salary, bonus. But the bonus column is optional and may contain NULL values.

emp_no salary from_date to_date bonus
10001 60117 1986-06-26 1987-06-26 2000
10001 62102 1987-06-26 1988-06-25 NULL
10001 66074 1988-06-25 1989-06-25 NULL
10001 66596 1989-06-25 1990-06-25 3000
10001 66961 1990-06-25 1991-06-25 1500
10001 71046 1991-06-25 1992-06-24 NULL
10001 74333 1992-06-24 1993-06-24 NULL
10001 75286 1993-06-24 1994-06-24 2000

Run this SELECT … COALESCE … statement to return 0 as the alternative value when bonus value is NULL:

SELECT
  emp_no,
  salary,
  from_date,
  to_date,
  COALESCE(bonus, 0)
FROM
  salaries;

In MySQL you can also use IFNULL function to return 0 as the alternative for the NULL values:

SELECT
  emp_no,
  salary,
  from_date,
  to_date,
  IFNULL(bonus, 0)
FROM
  salaries;

In MS SQL Server, the equivalent is ISNULL function:

SELECT
  emp_no,
  salary,
  from_date,
  to_date,
  ISNULL(bonus, 0)
FROM
  salaries;

In Oracle, you can use NVL function:

SELECT
  emp_no,
  salary,
  from_date,
  to_date,
  NVL(bonus, 0)
FROM
  salaries;

Same result:

emp_no salary from_date to_date bonus
10001 60117 1986-06-26 1987-06-26 2000
10001 62102 1987-06-26 1988-06-25 0
10001 66074 1988-06-25 1989-06-25 0
10001 66596 1989-06-25 1990-06-25 3000
10001 66961 1990-06-25 1991-06-25 1500
10001 71046 1991-06-25 1992-06-24 0
10001 74333 1992-06-24 1993-06-24 0
10001 75286 1993-06-24 1994-06-24 2000

Need a good GUI tool for databases? TablePlus provides a native client that allows you to access and manage Oracle, MySQL, SQL Server, PostgreSQL and many other databases simultaneously using an intuitive and powerful graphical interface.

Download TablePlus for Mac.

Not on Mac? Download TablePlus for Windows.

Need a quick edit on the go? Download for iOS

TablePlus in Dark mode

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

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.

Страниц: 1

  • Список
  •  » Раздел для начинающих
  •  » Можно ли в запросе вернуть какое-то значение, если данные не найдены?

#1 25.09.2013 15:43:01

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Можно ли в запросе вернуть какое-то значение, если данные не найдены?

К примеру, есть запрос: SELECT `field` FROM `table`LIMIT 1
Если данные есть, возвращется значение `field`, если данных нет, надо чтобы запрос вернул допустим ‘ololo’.
Запрос вида SELECT IF(`field`, `field`, ‘ololo’) FROM `table` не дал нужного результата, `field`IS NOT NULL также не спас ситуацию.

Понимаю, что можно сделать подзапрос, джоин на саму себя и т.п., но интересует можно ли провернуть такой фокус простым запросом?


Человек без чувства юмора — не серьёзный человек wink

Неактивен

#2 25.09.2013 15:59:06

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Neval написал:

К примеру, есть запрос: SELECT `field` FROM `table`LIMIT 1
Если данные есть, возвращется значение `field`, если данных нет, надо чтобы запрос вернул допустим ‘ololo’.
Запрос вида SELECT IF(`field`, `field`, ‘ololo’) FROM `table` не дал нужного результата, `field`IS NOT NULL также не спас ситуацию.

Понимаю, что можно сделать подзапрос, джоин на саму себя и т.п., но интересует можно ли провернуть такой фокус простым запросом?

Одним запросов без подзапросов, думаю, что точно нет.
И смысла в этом тоже нет. Легче проверить запрос пустой или нет уже программно.

Неактивен

#3 25.09.2013 16:07:35

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Программно не получится, ибо там чёрный ящик без доступа к коду, по сему надо вернуть из БД.


Человек без чувства юмора — не серьёзный человек wink

Неактивен

#4 25.09.2013 16:46:13

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Хм, что-то у меня и подзапрос с джоинами организовать не удалось)) Ану подсобите, уважаемые знатоки))


Человек без чувства юмора — не серьёзный человек wink

Неактивен

#5 25.09.2013 17:44:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3876

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Извращенные варианты возможны:

select id from `mytable` UNION (select ‘ololo’ FROM INFORMATION_SCHEMA.TABLES where (select count(*) from `mytable`)=0) LIMIT 1;
 

Тут надо следить за одинаковым числом полей в UNION и учитывать, что тип будет приведен к общему. Например в примере выше id будет преобразован в VARCHAR.

Неактивен

#6 25.09.2013 17:46:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3876

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Пример выше работает только для LIMIT 1. Если его нет, то лучше всего INFORMATION_SCHEMA.TABLES заменить на заранее приготовленную таблицу с 1 нужной записью.

Неактивен

#7 25.09.2013 17:56:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

А для чего нужна INFORMATION_SCHEMA.TABLES или другая таблица? Можно ведь

select id from `mytable` UNION (select ‘ololo’) LIMIT 1;

Неактивен

#8 25.09.2013 18:22:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3876

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

vasya, согласен, для LIMIT 1 твое решение лучше

Неактивен

#9 25.09.2013 19:23:32

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

То, что нужно, огромное спасибо smile


Человек без чувства юмора — не серьёзный человек wink

Неактивен

#10 29.10.2013 19:13:58

IDX
Участник
Зарегистрирован: 25.10.2013
Сообщений: 11

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Может лучше поправить таблицу

id varchar(255) DEFAULT ‘ololo’

Отредактированно IDX (29.10.2013 19:14:16)

Неактивен

#11 29.10.2013 21:26:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

IDX написал:

Может лучше поправить таблицу

id varchar(255) DEFAULT ‘ololo’

Вы не правы

MariaDB [test]> create table test (id varchar(255) DEFAULT ‘ololo’);
Query OK, 0 rows affected (0.23 sec)

MariaDB [test]> select id from test;
Empty set (0.00 sec)

MariaDB [test]> select id from test UNION (select ‘ololo’) LIMIT 1;
+——-+
| id    |
+——-+
| ololo |
+——-+
1 row in set (0.08 sec)

Неактивен

#12 31.10.2013 11:07:00

IDX
Участник
Зарегистрирован: 25.10.2013
Сообщений: 11

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

vasya написал:

IDX написал:

Может лучше поправить таблицу

id varchar(255) DEFAULT ‘ololo’

Вы не правы

MariaDB [test]> create table test (id varchar(255) DEFAULT ‘ololo’);
Query OK, 0 rows affected (0.23 sec)

MariaDB [test]> select id from test;
Empty set (0.00 sec)

MariaDB [test]> select id from test UNION (select ‘ololo’) LIMIT 1;
+——-+
| id    |
+——-+
| ololo |
+——-+
1 row in set (0.08 sec)

почему?
Если заносятся данные, но по каким либо причинам в один из столбцов данные не заносились ни кодом ни тригерами, то при последующей выборке данных, будет вылетать ошибка, ну а если как писали выше, инстркция с UNION отрабатывает только при лимите, то это уже амба.

Я сталкивался с проблемой когда конект сталкивался с пустышками, тем самым ни есть гуд. Вот и взял за основу дефолты писать.

Неактивен

#13 31.10.2013 12:13:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Ну вот вам пример приведен с дефолтным значением как вы и хотели и чем оно помогло?

IDX написал:

Если заносятся данные, но по каким либо причинам в один из столбцов данные не заносились ни кодом ни тригерами,

то в этом столбце данные будут, случае отсутствия дефолта там будет null (а по условию задачи данных нет, это совсем другая история)

IDX написал:

то при последующей выборке данных, будет вылетать ошибка,

Я сталкивался с проблемой когда конект сталкивался с пустышками, тем самым ни есть гуд. Вот и взял за основу дефолты писать.

А если там по логике приложения нужен null?

Неактивен

#14 31.10.2013 13:43:10

IDX
Участник
Зарегистрирован: 25.10.2013
Сообщений: 11

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

vasya написал:

IDX написал:

то при последующей выборке данных, будет вылетать ошибка,
Я сталкивался с проблемой когда конект сталкивался с пустышками, тем самым ни есть гуд. Вот и взял за основу дефолты писать.

А если там по логике приложения нужен null?

что мешает произвести замену в одной функции??? чем в последствии в коде свыше 1 функции?
простая замена.

тут двоякое мнение. кому как удобно.

P.S. Был у меня человек, не ставил дефолты. кода много. править не реально. вот и пришлось глобально изменить то на что будет меняться. просто в дефолте ставили на int(11) 99999999999

Отредактированно IDX (31.10.2013 13:43:54)

Неактивен

#15 31.10.2013 13:45:08

IDX
Участник
Зарегистрирован: 25.10.2013
Сообщений: 11

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

просто реплейсили эти девятки в ноль

Неактивен

#16 31.10.2013 13:49:00

IDX
Участник
Зарегистрирован: 25.10.2013
Сообщений: 11

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

ах да, а если идёт выборка >100500 строк, а на юнионе лимит в 1 как предлагали выше?
это типа как бэ каждый раз селеккты писать для обращение с лимитированием в 1 строку???

Неактивен

#17 01.11.2013 07:00:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Что-то я теряю нить рассуждений. Каким образом default может помочь в решении задачи ТС?

Неактивен

#18 28.11.2016 17:40:48

jon48
Участник
Зарегистрирован: 28.11.2016
Сообщений: 3

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

Люди добрые помогите, я в этом вообще не шарю, но путем догадок попытаюсь задать вопрос! В microsoft word стоит команда {SQLSelect  ValueUser From Cam16 (NoLock) where Cam16.D270=888 and Cam16.r_id=1576870}. Когда есть такая строка в таблице и есть данные в таблице то вместо команды подставляется число из базы данных. Но что сюда добавить на тот случай если строки 1576870 в колонке r_id в таблице Cam16 нет вообще.  Мicrosoft word выдает в таком случае надпись «ОШИБКА!!!ОШИБКА!!!ОШИБКА!!!», а мне нужно что бы подставился 0.

Неактивен

#19 28.11.2016 17:49:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

в MySQL (которому посвящен этот форум) можно
select ValueUser from
((Select  ValueUser, 1 From ..)
union all
(select 0, 2)
order by 2 limit 1) t;

Неактивен

#20 28.11.2016 18:42:01

jon48
Участник
Зарегистрирован: 28.11.2016
Сообщений: 3

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

vasya написал:

в MySQL (которому посвящен этот форум) можно
select ValueUser from
((Select  ValueUser, 1 From ..)
union all
(select 0, 2)
order by 2 limit 1) t;

Куда это влепить в моём случае, если можно по подробнее, а то From .. мне вообще не понятно ? База данных у меня на MySQL.

Отредактированно jon48 (28.11.2016 18:44:22)

Неактивен

#21 28.11.2016 18:43:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

заменить один запрос на другой

Неактивен

#22 28.11.2016 18:55:57

jon48
Участник
Зарегистрирован: 28.11.2016
Сообщений: 3

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

vasya написал:

заменить один запрос на другой

Извиняюсь за тупость, я поставил {SQLSelect  ValueUser From ((Select  ValueUser, 1 From  Cam16 (NoLock) where Cam16.D270=888 and Cam16.r_id=1576870) union all (select 0, 2) order by 2 limit 1) t} в результате ОШИБКА!!! Что не так? Помогите.

Неактивен

#23 29.11.2016 00:15:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5817

Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?

В MySQL нет такого синтаксиса как (NoLock).

Запрос

Select  ValueUser From
((Select  ValueUser, 1 From  Cam16  where Cam16.D270=888 and Cam16.r_id=1576870)
 union all (select 0, 2) order by 2 limit 1) t;

возвращает 0, если не существует строки с Cam16.D270=888 and Cam16.r_id=1576870.

Неактивен

Страниц: 1

  • Список
  •  » Раздел для начинающих
  •  » Можно ли в запросе вернуть какое-то значение, если данные не найдены?

SELECT NULL-значение

Достаточно часто встречаются такие случаи, когда в таблице имеются записи с не заданными значениями какого-либо из полей, потому что значение поля неизвестно или его просто нет. В таких случаях SQL позволяет указать в поле NULL-значение. Строго говоря, NULL-значение вовсе не представлено в поле. Когда значение поля есть NULL — это значит, что программа базы данных специальным образом помечает поле, как не содержащее какого-либо значения для данной строки (записи).

Дело обстоит не так в случае простого приписывания полю значения «нуль» или «пробел», которые база данных трактует как любое другое значение. Поскольку NULL не является значением как таковым, он не имеет типа данных. NULL может размещаться в поле любого типа. Тем не менее, NULL, как NULL-значение, часто используется в SQL.

Предположим, появился покупатель, которому еще не назначен продавец. Чтобы констатировать этот факт, нужно ввести значение NULL в поле snum, а реальное значение включить туда позже, когда данному покупателю будет назначен продавец.

SQL IS NULL

Поскольку NULL фиксирует пропущенные значения, результат любого сравнения при наличии NULL-значений неизвестен. Когда NULL-значение сравнивается с любым значением, даже с NULL-значением, результат просто неизвестен. Булево значение «неизвестно» ведет себя также, как «ложь» — строка, на которой предикат принимает значение «неизвестно», не включается в результат запроса – при одном важном исключении: NOT от лжи есть истина (NOT (false)=true), тогда как NOT от неизвестного значения есть также неизвестное значение. Следовательно, такое выражение как «city = NULL» или «city IN (NULL)» является неизвестным независимо от значения city.

Часто необходимо различать false и unknown – строки, содержащие значения столбца, не удовлетворяющие предикату, и строки, которые содержат NULL. Для этой цели SQL располагает специальным оператором IS, который используется с ключевым словом NULL для локализации NULL-значения. SQL IS NULL. Пример. Вывести все поля из талицы Customers, значения поля city которых равны NULL:

SELECT * FROM Customers WHERE city IS NULL

В данном случае выходных данных не будет, поскольку в поле city нет NULL-значений.

SQL IS NOT NULL

Условие IS NOT NULL используется в запросах для выборки записей со значениями не равных значению NULL SQL IS NOT NULL. Пример. Вывести все поля из талицы Customers, значения поля city которых НЕ равны NULL:

SELECT * FROM Customers WHERE city IS NOT NULL

Понравилась статья? Поделить с друзьями:
  • Select at least two edge loops ошибка
  • Seiko lp 1030 ошибка e en 2031
  • Segway ninebot es2 ошибка 15
  • Segmentation fault core dumped ошибка
  • Second extinction ошибка при запуске