2011-06-24 7 views
11

Básicamente, ¿qué syntex me permitiría lograr la declaración del título?SQL si la instrucción select no devuelve ninguna fila y luego realiza la instrucción de selección alternativa

If (select statement 1) returns 0 rows THEN (select statement 2) else (select statement 3) 

Para que los devuelve de sql resultados de alguna de las declaraciones de 2 o 3 He buscado una manera de hacer esto, pero nada de lo que he encontrado hasta ahora parece dirigirse exactamente si los requisitos.

+1

extraño objetivo. ¿Cuál es el sentido físico de esto? – heximal

+0

que RDBMS? ¿Quieres hacer esto en sql puro o como parte de un script? – davek

+0

¿Quiere decir "si no hay filas de la 1ª selección, use una 2ª selección", en lugar de usar 3 tablas? Y todos los conjuntos de resultados tienen la misma forma (No cambiaría dinámicamente el conjunto de resultados porque el contrato cambia). – gbn

Respuesta

17
IF EXISTS (SELECT field FROM table) 
BEGIN 
SELECT field FROM table2 
END 
ELSE 
BEGIN 
SELECT field FROM table3 
END 
0

Aquí tienes ...

IF ((select count(*) from table1)= 0) 
BEGIN 
Select * from table2 
END 
ELSE 
BEGIN 
SELECT * from table3 
END 
+2

La mayoría de los optimizadores son lo suficientemente inteligentes como para terminar de evaluar una cláusula 'EXISTS' tan pronto como haya ocurrido una fila coincidente. Algunos optimizadores son demasiado tontos para darse cuenta de que está planeando comparar un 'COUNT (*)' contra 0, y evaluará todas las filas para calcular el recuento. –

+0

De acuerdo ... si 0 es todo lo que queremos comparar; ¡EXISTS es todo lo que tiene sentido! El recuento de otros casos podría ayudar. – Gans

1

Lo siento por la falta de retroalimentación. Alguien más en la oficina se interesó y se le ocurrió esto:

select * from (
     select * 
       , (SELECT Count(*) 
        FROM users 
        WHERE version_replace = 59 AND moderated = 1) AS Counter 
      FROM users WHERE version_replace = 59 AND moderated in (0,1) 
    ) AS y 
where Counter = 0 and Moderated = 0 
    or Counter > 0 and Moderated = 1 
ORDER By ID DESC 

Que hace lo que necesito.

+0

Parece un poco complicado, pero cumple con los requisitos ... – ChrisBint

Cuestiones relacionadas