sql что возвращает select если ничего не найдено
Возвращает значение, если строки не найдены SQL
вот мой простой запрос. Если я запрошу запись, которая не существует, то я ничего не получу. Я бы предпочел, чтобы false (0) возвращался в этом сценарии. Ищу метод с учета нет записей.
9 ответов:
это похоже на Адама Робинсона, но использует ISNULL вместо COUNT.
Если внутренний запрос имеет соответствующую строку, то возвращается 1. Внешний запрос (с помощью функции isnull), а затем возвращает это значение на 1. Если внутренний запрос не имеет соответствующей строки, то он ничего не возвращает. Внешний запрос обрабатывает это как NULL, и поэтому ISNULL возвращает 0.
Я прочитал все ответы здесь, и потребовалось некоторое время, чтобы понять, что происходит. Следующее основано на ответе от МЧС Сиско и некоторые связанные с этим исследования
Если ваш SQL-запрос не возвращает никаких данных, нет поля с нулевым значением, поэтому ни ISNULL, ни COALESCE не будут работать так, как вы хотите. С помощью подзапроса запрос верхнего уровня получает поле с нулевым значением, и оба ISNULL и COALESCE будут работать так, как вы хотите / ожидаете их к.
мой запрос с комментариями
нет совпадения записей означает, что запись не возвращается. Там нет места для «значение» 0, чтобы пойти, если нет записей не найдены. Вы можете создать сумасшедший запрос объединения, чтобы сделать то, что вы хотите, но гораздо, гораздо, гораздо лучше просто проверить количество записей в результирующем наборе.
вам нужно только заменить WHERE на левое соединение:
такое решение позволяет вернуть значения по умолчанию для каждого столбца, например:
Форум пользователей MySQL
Задавайте вопросы, мы ответим
Страниц: 1
#1 25.09.2013 15:43:01
Можно ли в запросе вернуть какое-то значение, если данные не найдены?
К примеру, есть запрос: SELECT `field` FROM `table`LIMIT 1
Если данные есть, возвращется значение `field`, если данных нет, надо чтобы запрос вернул допустим ‘ololo’.
Запрос вида SELECT IF(`field`, `field`, ‘ololo’) FROM `table` не дал нужного результата, `field`IS NOT NULL также не спас ситуацию.
Понимаю, что можно сделать подзапрос, джоин на саму себя и т.п., но интересует можно ли провернуть такой фокус простым запросом?
#2 25.09.2013 15:59:06
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
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
Программно не получится, ибо там чёрный ящик без доступа к коду, по сему надо вернуть из БД.
#4 25.09.2013 16:46:13
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
Хм, что-то у меня и подзапрос с джоинами организовать не удалось)) Ану подсобите, уважаемые знатоки))
#5 25.09.2013 17:44:29
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
Извращенные варианты возможны:
#6 25.09.2013 17:46:16
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
Пример выше работает только для LIMIT 1. Если его нет, то лучше всего INFORMATION_SCHEMA.TABLES заменить на заранее приготовленную таблицу с 1 нужной записью.
#7 25.09.2013 17:56:14
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
А для чего нужна INFORMATION_SCHEMA.TABLES или другая таблица? Можно ведь
#8 25.09.2013 18:22:24
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
vasya, согласен, для LIMIT 1 твое решение лучше
#9 25.09.2013 19:23:32
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
То, что нужно, огромное спасибо
#10 29.10.2013 19:13:58
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
Может лучше поправить таблицу
Отредактированно IDX (29.10.2013 19:14:16)
#11 29.10.2013 21:26:47
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
IDX написал:
Может лучше поправить таблицу
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 )
#12 31.10.2013 11:07:00
Re: Можно ли в запросе вернуть какое-то значение, если данные не найдены?
vasya написал:
IDX написал:
Может лучше поправить таблицу
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 )
почему?
Если заносятся данные, но по каким либо причинам в один из столбцов данные не заносились ни кодом ни тригерами, то при последующей выборке данных, будет вылетать ошибка, ну а если как писали выше, инстркция с UNION отрабатывает только при лимите, то это уже амба.
Я сталкивался с проблемой когда конект сталкивался с пустышками, тем самым ни есть гуд. Вот и взял за основу дефолты писать.
Возвращает значение, если строки не найдены SQL
вот мой простой запрос. Если я запрошу запись,которая не существует, я ничего не получу. Я бы предпочел, чтобы false (0) возвращался в этом сценарии. Ищу метод с учета нет записей.
9 ответов
это похоже на Адама Робинсона, но использует ISNULL вместо COUNT.
Если внутренний запрос имеет соответствующую строку, возвращается 1. Внешний запрос (с ISNULL) затем возвращает это значение 1. Если внутренний запрос не имеет соответствующей строки, он ничего не возвращает. Внешний запрос обрабатывает это как NULL, и поэтому ISNULL возвращает 0.
Я прочитал все ответы здесь, и потребовалось некоторое время, чтобы понять, что происходит. Следующее основано на ответе МЧС Сиско и некоторые связанные исследования
Если ваш SQL-запрос не возвращает никаких данных, нет поля с нулевым значением, поэтому ни ISNULL, ни COALESCE не будут работать так, как вы хотите. С помощью подзапроса запрос верхнего уровня получает поле с нулевым значением, и оба ISNULL и COALESCE будут работать так, как вы хотите/ожидаете их к.
мой запрос с комментариями
нет записи соответствовали означает нет записи возвращаются. Нет места для» значения » 0, если записи не найдены. Вы можете создать сумасшедший запрос объединения, чтобы сделать то, что вы хотите, но гораздо, гораздо, гораздо лучше просто проверить количество записей в результирующем наборе.
вам нужно только заменить WHERE на левое соединение:
такое решение позволяет вернуть значения по умолчанию для каждого столбца, например:
Вернуть значение, если в Microsoft tSQL не найдено строк
15 ответов
Это похоже на Адама Робинсона, но использует ISNULL вместо COUNT.
Если во внутреннем запросе есть соответствующая строка, возвращается 1. Внешний запрос (с ISNULL) затем возвращает это значение 1. Если внутренний запрос не имеет соответствующей строки, он ничего не возвращает. Внешний запрос обрабатывает это как NULL, поэтому ISNULL возвращает 0.
Я прочитал здесь все ответы, и потребовалось время, чтобы понять, что происходит. Следующее основано на ответе Мо Сиско и некоторые исследования по теме
Если ваш SQL-запрос не возвращает никаких данных, значит, нет поля с нулевым значением, поэтому ни ISNULL, ни COALESCE не будут работать так, как вы хотите. Используя подзапрос, запрос верхнего уровня получает поле с нулевым значением, и оба ISNULL и COALESCE будут работать так, как вы хотите / ожидаете.
Мой запрос с комментариями
Вам нужно только заменить WHERE на LEFT JOIN:
Это решение позволяет вам также возвращать значения по умолчанию для каждого столбца, например:
Это может быть одним из способов.
Нет сопоставленной записи означает, что запись не возвращена. Нет места для «значения» 0, если записи не найдены. Вы можете создать сумасшедший запрос UNION, чтобы делать то, что вы хотите, но гораздо, намного, намного лучше, просто проверяя количество записей в наборе результатов.
А как насчет галстуков?
Ответ @hai-phan с использованием LEFT JOIN является ключевым, но, возможно, будет немного сложно уследить за ним. У меня был сложный запрос, который тоже может ничего не вернуть. Я просто упростил его ответ для своих нужд. Его легко применить к запросу с большим количеством столбцов.
Следует избегать использования дорогих методов. Вам не нужен столбец для TBL2.
Мое решение работает
Можно проверить путем изменения, где 1 = 2, где 1 = 1
Мне понравился ответ Джеймса Дженкинса с проверкой ISNULL, но я думаю, что он имел в виду IFNULL. ISNULL не имеет второго параметра, как его синтаксис, но IFNULL имеет второй параметр после проверяемого выражения для замены, если обнаружен NULL.
Условия отбора в операторе SELECT в запросах SQL на практике
Vovan_ST
ИТ специалист со стажем. Автор статьи. Профиль
В SQL используется множество условий отбора, позволяющих эффективно и естественно создавать различные типы запросов. Ниже рассматриваются пять основных условий отбора (в стандарте ANSI/ISO они называются предикатами):
Наиболее распространенным условием отбора в SQL является сравнение. При сравнении SQL вычисляет и сравнивает значения двух SQL-выражений для каждой строки данных. Выражения могут быть как очень простыми, например содержать одно имя столбца или константу, так и более сложными, например содержать арифметические операции. В SQL имеется шесть различных способов сравнения двух выражений, показанных на рис. 6.
Рис. 6. Синтаксическая диаграмма сравнения
Ниже приведены типичные примеры сравнения.
Найти имена всех служащих, принятых на работу до 2006 года.
Вывести список офисов, фактические объемы продаж в которых составили менее 80 процентов от плановых.
Вывести список офисов, менеджером которых не является служащий с идентификатором 108.
Когда СУБД сравнивает значения двух выражений, могут быть получены три результата:
Выборка одной строки
Чаще всего используется сравнение, в котором определяется, равно ли значение столбца некоторой константе. Если этот столбец представляет собой первичный ключ, то запрос возвращает всего одну строку, как в следующем примере.
Узнать имя и лимит кредита клиента с идентификатором 2107.
Значения NULL
Использование значений NULL в запросах может привести к »очевидным» предположениям, которые истинны только на первый взгляд, но на самом деле таковыми не являются. Например, можно предположить, что каждая строка из таблицы SALESREPS будет содержаться в результатах только одного из двух следующих запросов.
Вывести список служащих, превысивших плановый объем продаж.
Вывести список служащих, не выполнивших план.
Проверка на принадлежность диапазону (BETWEEN)
Рис. 7. Синтаксическая диаграмма проверки на принадлежность диапазону (between)
Следующий пример иллюстрирует типичную процедуру проверки на принадлежность диапазону.
Найти все заказы, сделанные в последнем квартале 2007 года.
При проверке на принадлежность диапазону верхняя и нижняя границы считаются частью диапазона, поэтому в результаты запроса вошли заказы, сделанные 1 октября и 31 декабря. Далее приведен другой пример проверки на принадлежность диапазону.
Найти заказы, стоимости которых попадают в различные диапазоны.
Инвертированная версия проверки на принадлежность диапазону ( NOT between ) позволяет выбрать значения, которые лежат за пределами диапазона, как в следующем примере.
Вывести список служащих, фактические объемы продаж которых не попадают в диапазон от 80 до 720 процентов плана.
Однако прежде чем полагаться на эти правила, неплохо было бы поэкспериментировать со своей СУБД.
Необходимо отметить, что проверка на принадлежность диапазону не расширяет возможности SQL, поскольку ее можно выразить в виде двух сравнений. Проверка
полностью эквивалентна сравнению
Тем не менее проверка BETWEEN является более простым способом выразить условие отбора в терминах диапазона значений.
Проверка наличия во множестве (IN)
Еще одним распространенным условием отбора является проверка на наличие во множестве (in), схематически изображенная на рис. 8. В этом случае выполняется проверка, соответствует ли значение какому-либо элементу заданного списка. Ниже приведен ряд запросов с использованием проверки наличия во множестве.
Рис. 8. Синтаксическая диаграмма проверки наличия во множестве (IN)
Вывести список служащих, которые работают в Нью-Йорке, Атланте или Денвере.
Найти все заказы, сделанные в пятницы в январе 2008 года.
Найти все заказы, полученные четырьмя конкретными служащими.
полностью эквивалентно условию
Однако проверка IN предлагает гораздо более эффективный способ выражения условия отбора, особенно если множество содержит большое число элементов.
В стандарте ANSI/ISO не определено максимальное количество элементов множества, и в большинстве СУБД явный верхний предел не задан. По соображениям переносимости, лучше избегать множеств, содержащих один элемент.
Их следует заменять простым сравнением:
Проверка на соответствие шаблону (LIKE)
Для выборки строк, в которых содержимое некоторого текстового столбца совпадает с заданным текстом, можно использовать простое сравнение. Например, следующий запрос извлекает строку из таблицы CUSTOMERS по имени.
Показать лимит кредита для Smithson Corp.
Однако очень легко можно забыть, какое именно название носит интересующая нас компания: «Smith», «Smithson» или «Smithsonian». Проверка на соответствие шаблону позволяет выбрать из базы данных строки на основе частичного соответствия имени клиента.
Проверка на соответствие шаблону (оператор LIKE ), схематически изображенная на рис. 9, позволяет определить, соответствует ли значение данных в столбце некоторому шаблону. Шаблон представляет собой строку, в которую может входить один или несколько подстановочных символов. Эти символы интерпретируются особым образом.
Рис. 9. Синтаксическая диаграмма проверки на соответствие шаблону (LIKE)
Подстановочные знаки
Подстановочный знак % совпадает с любой последовательностью из нуля или более символов. Ниже приведена измененная версия предыдущего запроса, в которой используется шаблон, содержащий знак процента.
Оператор like указывает SQL, что необходимо сравнивать содержимое столбца NAME с шаблоном «Smith% Corp.». Этому шаблону соответствуют все перечисленные ниже имена.
А вот эти имена данному шаблону не соответствуют.
Подстановочный знак _ (символ подчеркивания) совпадает с любым отдельным символом. Например, если вы уверены, что название компании либо «Smithson», либо «Smithsen», то можете воспользоваться следующим запросом.
В таком случае шаблону будет соответствовать любое из представленных ниже имен.
Smithson Corp.
Smithsen Corp.
Smithsun Corp.
А вот ни одно из следующих ему соответствовать не будет.
Подстановочные знаки можно помещать в любое место строки шаблона, и в одной строке может содержаться несколько подстановочных знаков. Следующий запрос допускает как написание «Smithson» и «Smithsen», так и любое другое окончание названия компании, включая «Corp.», «Inc.» или какое-то другое.
Управляющие символы *
При проверке строк на соответствие шаблону может оказаться, что подстановочные знаки входят в строку символов в качестве литералов. Например, нельзя проверить, содержится ли знак процента в строке, просто включив его в шаблон, поскольку SQL будет считать этот знак подстановочным. Как правило, это не вызывает серьезных проблем, поскольку подстановочные знаки довольно редко встречаются в именах, названиях товаров и других текстовых данных, которые обычно хранятся в базе данных.
В стандарте ANSI/ISO определен способ проверки наличия в строке литералов, использующихся в качестве подстановочных знаков. Для этого применяются управляющие символы. Когда в шаблоне встречается такой символ, то символ, следующий непосредственно за ним, считается не подстановочным знаком, а литералом. Непосредственно за управляющим символом может следовать либо один из двух подстановочных символов, либо сам управляющий символ, поскольку он также приобретает в шаблоне особое значение.
Найти товары, коды которых начинаются с четырех букв «A%ВС».
Первый символ процента в шаблоне, следующий за управляющим символом, считается литералом, второй — подстановочным символом.
Проверка на равенство NULL (IS NULL)
Рис. 10. Синтаксическая диаграмма проверки на равенство null (is null)
В следующем запросе проверка на равенство NULL используется для нахождения в учебной базе данных служащего, который еще не был закреплен за офисом.
Найти служащего, который еще не закреплен за офисом.
Вывести список служащих, которые уже закреплены за офисами.
Может показаться странным, что нельзя проверить значение на равенство NULL с помощью операции сравнения, например:
Ключевое слово NULL здесь нельзя использовать, поскольку на самом деле это не настоящее значение; это просто свидетельство того, что значение неизвестно. Даже если бы сравнение
было возможно, правила обработки значений NULL в сравнениях привели бы к тому, что оно вело бы себя не так, как ожидается. Если бы СУБД обнаружила строку, в которой столбец REP_OFFICE содержит значение null, выполнилась бы следующая проверка.
Составные условия отбора (AND, OR и NOT)
Рис. 11. Синтаксическая диаграмма предложения WHERE
Оператор OR используется для объединения двух условий отбора, из которых или одно, или другое (или оба) должно быть истинным.
И наконец, можно использовать оператор NOT, чтобы выбрать строки, для которых условие отбора ложно.
Лично для меня остается загадкой, зачем может понадобиться такой список имен, однако приведенный пример является иллюстрацией довольно сложного запроса.
Таблица 1. Таблица истинности оператора and