2009-09-21 2 views
37

Я использую хранимую процедуру в MySQL с оператором CASE.Как выбрать пустой набор результатов?

В предложении ELSE CASE (эквивалентно по умолчанию:) Я хочу выбрать и вернуть пустой набор результатов, избегая при этом ошибки SQL, не обрабатывая случай ELSE, и вместо этого возвращать пустой набор результатов как если обычный запрос не возвращал строк.

До сих пор мне удалось сделать это, используя что-то вроде:
Select NULL From users Where False

Но я должен назвать существующую таблицу, как «пользователей» в этом примере. Он работает, но я бы предпочел более элегантный способ, который не сломается, если в конечном итоге имя таблицы будет переименовано или отброшено.

Я пробовал Select NULL Where False, но он не работает.

Использование Select NULL не возвращает пустой набор, а одну строку с столбцом с именем NULL и значением NULL.

+0

Было бы странной схемой, которая не имела ни одного стола, на котором вы могли бы гарантировать существование! – onedaywhen

+0

Вы правы. Существует множество таблиц, проблема заключается в том, что после того, как вы выберете одну таблицу, если в будущем эта страница будет удалена или переименована, код, который вы написали, больше не работает, и вы будете связывать две части программного обеспечения, которые не имеют ничего делать друг с другом, но одно изменение в одном из них заставляет другую прекратить работать.Это называется связью, а связь в программном обеспечении - это, как правило, плохая идея. – Petruza

+1

@Petruza: В те дни, когда я использовал Access/Jet, моя схема включала бы постоянную вспомогательную таблицу для этой цели под названием «RowRowTable». – onedaywhen

ответ

37

В MySQL есть фиктивная таблица, называемая «двойная», которую вы должны использовать.

select 
    1 
from 
    dual 
where 
    false 

Это всегда даст вам пустой результат.

+0

Да. Для этого рождается «двойной». – Rockallite

+0

К сожалению, это решение не работает в подзапросах IN в MySQL под 5.7. 'select 1 in (SELECT 1 FROM dual WHERE FALSE);' возвращает 1. Только решение, предложенное @dhruvbird, работало для меня – ENargit

2

Как насчет этого?

SELECT 'MyName' AS EmptyColumn 
FROM dual 
WHERE 'Me' = 'Funny' 
+0

Я пробовал что-то вроде этого, но я предполагаю, что использование Where from From не является законным, по крайней мере, в MySQL, dunno ANSI SQL. – Petruza

+0

Это вызывает синтаксическую ошибку в MySQL 5.5. – Rockallite

8

Как насчет

SELECT * FROM (SELECT 1) AS TBL WHERE 2=3 

Проверено в myphp, и он также работает в SQLite и, вероятно, в любой другой БД двигателя.

+0

Хорошо. Это работает в подзапросах в MySQL 5.5. – Rockallite

3

Это, вероятно, будет работать во всех базах данных.

SELECT * FROM (SELECT NULL AS col0) AS inner0 WHERE col0 IS NOT NULL; 
1
SELECT * FROM (SELECT NULL) WHERE 0 
+3

При предоставлении кода, который решает проблему, лучше также дать хотя бы краткое объяснение того, как это работает, так что чтение людей не обязательно будет анализировать его по строкам, чтобы понять различия. – Fluffeh

+5

на моей версии mysql мне пришлось добавить псевдоним: SELECT * FROM (SELECT NULL) a WHERE 0; – shark555

15

Это должно работать на большинстве БД, протестирован на Postgres и Netezza:

SELECT NULL LIMIT 0; 
+4

Мне нравится это решение лучше всего. Работает также в MySQL (v5.5). – noodl

+1

Нет, это не работает в подзапросе в MySQL. Ошибка повышения. Эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery» (v5.5). Поэтому этот ответ не подходит для этого вопроса. – Rockallite

+1

LIMIT не является стандартным, поэтому, очевидно, он не может работать на «любой БД». Например, попробуйте MSSQL или DB2. –

3
SELECT TOP 0 * FROM [dbo].[TableName] 

Это разумный подход к оператору постоянной проверки.

+0

OP запросил запрос без необходимости указывать существующее имя таблицы, которое требуется вашему ответу. – Marki555

0

В PostgreSQL простой

SELECT; 

работы. Вы даже не получите никаких столбцов с надписью «unknown».
Обратите внимание, что он все еще говорит 1 полученная строка.

+0

Так технически это не пустой набор результатов? Как насчет 'select where false '? –

+0

Вместо 0 строк это возвращает 0 колонок. – luckydonald

Смежные вопросы