Ответ 1
MySQL имеет функцию, возвращающую значение, если результат равен нулю. Вы можете использовать его для целого запроса:
SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');
У меня есть такой простой запрос, который возвращает не целое число с нулевым целым для данного id:
SELECT field1 FROM table WHERE id = 123 LIMIT 1;
Дело в том, что идентификатор не найден, набор результатов пуст. Мне нужен запрос, чтобы всегда возвращать значение, даже если результата нет.
У меня есть эта работа, но мне она не нравится, потому что она работает в 2 раза в том же подзапросе:
SELECT IF(EXISTS(SELECT 1 FROM table WHERE id = 123) = 1, (SELECT field1 FROM table WHERE id = 123 LIMIT 1), 0);
Он возвращает любое поле1, если строка существует, иначе 0. Любой способ улучшить это?
Спасибо!
Редактировать следующие комментарии и ответы: да, это должно быть в одном запросе, и я не могу использовать трюк count, потому что мне нужно вернуть только 1 значение (FYI Я запускаю запрос с помощью метода Java/ Spring SimpleJdbcTemplate.queryForLong()).
MySQL имеет функцию, возвращающую значение, если результат равен нулю. Вы можете использовать его для целого запроса:
SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');
Когда вы ищете 1 запись (LIMIT 1), это будет работать.
(SELECT field1 FROM table WHERE id = 123)
UNION
(SELECT 'default_value_if_no_record')
LIMIT 1;
Может быть удобным способом отображения значений по умолчанию или указать отсутствие найденных результатов. Я использую его для отчетов.
См. также http://blogs.uoregon.edu/developments/2011/03/31/add-a-header-row-to-mysql-query-results/, чтобы использовать это для создания заголовков в отчетах.
Вы можете включить count (id). Это всегда будет возвращено.
select count(field1), field1 from table where id = 123 limit 1;
Вы можете использовать COALESCE
SELECT COALESCE(SUM(column),0)
FROM table
Сделайте поиск с помощью LEFT OUTER JOIN
. Я не знаю, разрешает ли MySQL inline VALUES
в предложениях соединения, но для этой цели вы можете иметь предопределенную таблицу.
Со мной случилось, что мои подзапросы возвращают мне более одной строки, я решил это, добавив limit 1
к своим подзапросам. Вы также можете отфильтровать его, чтобы вернуть один результат.
A me me ocurrio que mis subconsultas me devuelven mas de una fila, lo solucione agregando un limit 1
a mis subconsultas. Tambien puedes filtrarlo para que te te regrese un solo resultado.
Каф ответ работает для выбора одного столбца, если выбрать несколько столбцов, мы можем.
DECLARE a BIGINT DEFAULT 1;
DECLARE b BIGINT DEFAULT "name";
SELECT id, name from table into a,b;
Тогда нам просто нужно проверить значения a, b.