SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#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
Сообщений: 3880

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
Сообщений: 3880

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

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

Неактивен

 

#7 25.09.2013 17:56:14

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

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
Сообщений: 3880

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
Сообщений: 5842

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
Сообщений: 5842

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

IDX написал:

почему?

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


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
Сообщений: 5842

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
Сообщений: 5842

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
Сообщений: 5842

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
Сообщений: 5842

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.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson