2009-09-21 28 views
37

Estoy usando un procedimiento almacenado en MySQL, con una instrucción CASE.¿Cómo seleccionar un conjunto de resultados vacío?

En la cláusula ELSE de CASE (equivalente a predeterminado:) deseo seleccionar y devolver un conjunto de resultados vacío, evitando arrojar un error SQL al no manejar el caso ELSE, y en su lugar devolver un conjunto de resultados vacío como si una consulta normal no hubiera devuelto ninguna fila.

Hasta ahora he conseguido hacerlo usando algo como:
Select NULL From users Where False

Pero tengo que nombrar a una tabla existente, como 'usuarios' en este ejemplo. Funciona, pero preferiría una forma más elegante que no se rompa si eventualmente se renombra o se quita el nombre de la tabla utilizada.

He intentado Select NULL Where False pero no funciona.

El uso de Select NULL no devuelve un conjunto vacío, sino una fila con una columna llamada NULL y con un valor NULO.

+0

¡Realmente sería un esquema extraño que no tenía una sola tabla que pudiera garantizar que existiera! – onedaywhen

+0

Tienes razón. Existen muchas tablas, el problema es que una vez que eliges una tabla, si en el futuro esa tabla se elimina o renombra, el código que escribiste ya no funciona, y estarías acoplando dos piezas del software que no tienen nada. para hacer uno con el otro, sin embargo, un cambio en uno de ellos hace que el otro deje de funcionar.Eso se llama acoplamiento, y el acoplamiento en el software generalmente es una mala idea. – Petruza

+1

@Petruza: En los días en que usaba Access/Jet, mi esquema incluía una tabla auxiliar permanente para este propósito llamada 'RowRowTable'. – onedaywhen

Respuesta

37

Hay una tabla ficticia en MySQL llamada 'dual', que debería ser capaz de usar.

select 
    1 
from 
    dual 
where 
    false 

Esto siempre le dará un resultado vacío.

+0

Sí. 'dual' nace para este propósito. – Rockallite

+0

Desafortunadamente, esta solución no funciona en subconsultas IN en MySQL bajo 5.7. 'seleccionar 1 en (SELECCIONAR 1 FROM dual WHERE FALSE);' returns 1. La única solución propuesta por @dhruvbird funcionó para mí – ENargit

2

¿Qué tal esto?

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

He intentado algo como esto, pero supongo que usar Where without From no es legal al menos en MySQL, dunno ANSI SQL. – Petruza

+0

Esto causa un error de sintaxis en MySQL 5.5. – Rockallite

8

¿Qué tal

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

registramos en myphp, y también trabaja en sqlite y probablemente en cualquier otro motor de base.

+0

Bueno. Esto funciona en subconsultas en MySQL 5.5. – Rockallite

3

Esto probablemente funcione en todas las bases de datos.

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

Al proporcionar el código que resuelve el problema, es mejor también dar al menos una breve explicación de cómo funciona para que la gente que lee no tenga que analizarlo mentalmente línea por línea para entender las diferencias. – Fluffeh

+5

en mi versión de mysql Tuve que agregar el nombre de alias: SELECCIONAR * FROM (SELECCIONAR NULO) a WHERE 0; – shark555

15

Esto debería funcionar en la mayoría DBs, probado en Postgres y Netezza:

SELECT NULL LIMIT 0; 
+4

Me gusta esta solución mejor. Funciona en MySQL también (v5.5). – noodl

+1

No, esto no funciona en una subconsulta en MySQL. Error de subida 'Esta versión de MySQL aún no admite 'LIMIT & IN/ALL/ANY/ALGUNA subconsulta' (v5.5). Entonces esta respuesta no es adecuada para esta pregunta. – Rockallite

+1

LIMIT no es estándar, obviamente no puede funcionar en 'cualquier DB'. Pruebe MSSQL o DB2 por ejemplo. –

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

Esta es una enfoque razonable para el operador de exploración constante.

+0

El OP solicitó una consulta sin la necesidad de especificar un nombre de tabla existente, que su respuesta requiere. – Marki555

0

En PostgreSQL un simple

SELECT; 

obras. Ni siquiera obtendrá ninguna columna etiquetada como 'desconocida'.
Nota sin embargo, todavía dice 1 fila recuperada.

+0

Así que, técnicamente, no es un conjunto de resultados vacío ¿verdad? ¿Qué tal 'seleccionar dónde es falso? –

+0

En lugar de 0 filas, esto devuelve 0 columnas. – luckydonald

Cuestiones relacionadas