2010-05-21 30 views
37

¿Alguien puede señalar cómo comprobar si una consulta de selección devuelve un conjunto de resultados no vacío?Verificación simple para el resultado vacío de consulta SELECT

Por ejemplo, he próxima consulta:

SELECT * FROM service s WHERE s.service_id = ?; 

¿Debo hacer algo como siguiente:

ISNULL(SELECT * FROM service s WHERE s.service_id = ?) 

a prueba si conjunto de resultados no está vacía?

+0

¿Qué estás tratando de hacer? ¿Qué vas a hacer después de hacer el cheque? –

+0

no está claro si desea que se devuelva un conjunto de resultados y luego verifique si hay filas en él, o si solo desea comprobar si una consulta devuelve las filas sin un conjunto de resultados. –

+1

Quiero saber si habrá filas en un conjunto de resultados. –

Respuesta

55

Uso @ @ROWCOUNT:

SELECT * FROM service s WHERE s.service_id = ?; 

IF @@ROWCOUNT > 0 
    -- do stuff here..... 

Según SQL Server Books Online:

Devuelve el número de filas afectadas por la última instrucción. Si el número de filas es más de 2 mil millones, use ROWCOUNT_BIG.

+6

Esto es silencioso, me gusta. Y eso es lo que estaba buscando. Gracias. –

+0

Vale la pena señalar que @@ ROWCOUNT solo está disponible en Transact-SQL – MatrixManAtYrService

+1

@MatrixManAtYrService: yes - esta pregunta ** IS ** sobre SQL Server que usa T-SQL .... –

75
IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?) 
BEGIN 
    --DO STUFF HERE 

END 
+3

Cambie 'SELECCIONAR *' por 'SELECCIONAR TOP 1 *' por eficiencia –

+13

@Ed B: No importa porque EXISTS devuelve verdadero en la primera coincidencia exitosa. Prueba usando 'EXISTS (SELECCIONA 1/0 FROM SERVICE ...' - debería devolver a no se puede dividir por cero, pero no va a –

+1

@Ed B & @OMG Ponies, sí, creo que SQL Server es lo suficientemente inteligente para optimizar el 'EXISTS (SELECT *' o 'EXISTS (SELECT 1' o' EXISTS (SELECT 1/0' away –

0
SELECT count(*) as count FROM service s WHERE s.service_id = ?; 

prueba si el recuento == 0.

Más barrocamente:

seleccione caso cuando (? SELECT count (*) como el recuento del servicio s DONDE s.service_id =) = 0 entonces 'No hay filas, bro' otra cosa 'Tienes datos "extremo como stupid_message;

7

Estoy de acuerdo con Ed B. Debe utilizar EXISTE método, pero de una manera más eficiente de hacerlo es:

IF EXISTS(SELECT 1 FROM service s WHERE s.service_id = ?) 
BEGIN 
    --DO STUFF HERE 

END 

HTH

+12

If usted acepta, debe votar por esa respuesta. En lugar de volver a publicar contenido idéntico ... –

+1

@OMG Ponies: No es idéntico. Cambió el * a un 1. –

+1

Bueno, usando "(SELECCIONAR TOP 1 * ..." sería ser más eficiente que usar "SELECT 1 ..." –

5

intento:

SELECT * FROM service s WHERE s.service_id = ?; 

IF @@ROWCOUNT=0 
BEGIN 
    PRINT 'no rows!' 
END 
1

para resumir los mensajes de abajo un poco:

Si todo lo que importa es si al menos una fila coincidente está en la base de datos a continuación, utilizar exists ya que es el La forma más eficiente de verificar esto: devolverá verdadero tan pronto como encuentre al menos una fila coincidente, mientras que count, etc. encontrará todas las filas coincidentes.

Si realmente necesita utilizar los datos para el procesamiento o si la consulta tiene efectos secundarios, o si necesita saber el número total real de filas, entonces la comprobación de ROWCOUNT o count es probablemente la mejor forma de hacerlo.

2
SELECT COUNT(1) FROM service s WHERE s.service_id = ? 
+2

¿Alguna diferencia con el recuento (*)? – liang

0
SELECT * FROM service s WHERE s.service_id = ?; 
IF @@rowcount = 0 
begin 
select 'no data' 
end 
0

En mi función de información sobre el uso de SQL

select FOUND_ROWS(); 

que volverá el no. de filas devueltas por la consulta de selección.

3

Puede hacerlo de varias maneras.

IF EXISTS(select * from ....) 
begin 
-- select * from .... 
end 
else 
-- do something 

O puede utilizar como IF NOT EXISTS , @@ROW_COUNT

select * from .... 
IF(@@ROW_COUNT>0) 
begin 
-- do something 
end 
Cuestiones relacionadas