¿Qué sucede realmente cuando ejecuta una consulta SQL que no devuelve ninguna fila? Por ejemplo, piense en una cláusula WHERE con la condición 1=2, que nunca se puede cumplir y, por lo tanto, nunca se pueden devolver las filas.
Primero, veamos algunos ejemplos que deberían mostrarle lo que puede esperar como valor de retorno para diferentes escenarios.
SELECT *
FROM DUAL
WHERE 1=1
-- Return: X
SELECT *
FROM DUAL
WHERE 1=2
-- Return: - (nicht NULL!)
SELECT NVL(DUMMY,1)
FROM DUAL
WHERE 1=2
-- Return: - (nicht NULL!)
SELECT COUNT(*)
FROM DUAL
WHERE 1=2
-- Return: 0
SELECT MAX(dummy)
FROM DUAL
WHERE 1=2
-- Return: NULL
NVL y NVL2
Como vio en el ejemplo anterior, no puede usar NVL y NVL2 porque no se devuelven filas. El uso de NVL y NVL2 solo tiene sentido si se devuelven filas donde no todos los valores de columna tienen contenido. Esto se puede modificar o cambiar usando estas funciones. Para nuestro problema, sin embargo, NVL y NLV2 se pueden descartar con seguridad aquí. Puede encontrar más información sobre el uso correcto, así como muchos trucos y consejos, en el artículo sobre NVL y NVL2.
MAX/MIN junto con NVL o COALESCE
Un truco para obtener una fila devuelta es usar la función MAX o MIN junto con MAX o MIN. Las funciones MAX o MIN siempre devuelven un valor de fila, siempre que este también sea NULL. Con MAX o MIN, siempre se devuelve al menos una línea. Ahora puedes cambiar este valor con las funciones NVL, NVL2 o COALESCE. Este es un proceso rápido para responder a consultas que no devuelven ninguna fila.
A continuación se muestran dos ejemplos para ayudarlo a comprender cómo funciona el concepto. Como puede ver, ahora se devuelve al menos un valor.
SELECT NVL(MAX(dummy), 'Z')
FROM DUAL
WHERE 1=2
-- Return: Z
SELECT COALESCE(MAX(dummy), 'Z')
FROM DUAL
WHERE 1=2
-- Return: Z
CASO y EXISTE
Otra posibilidad es la consulta con una cláusula IF. Para hacer esto, usa la función EXISTS y verifica si hay incluso una línea que regresaría. El primer paso es verificar si existe una fila en su consulta. Si este es el caso, puede generar las líneas. Sin embargo, si no hay línea, puede generar una alternativa a través de la rama ELSE y, por lo tanto, siempre se muestra una línea.
SELECT CASE
WHEN EXISTS
(SELECT 1
FROM DUAL
WHERE 1=2)
THEN
(SELECT *
FROM DUAL
WHERE 1=2)
ELSE 'Z'
END
FROM DUAL
-- Return: Z
CASO y CUENTA
Otra posibilidad es la instrucción CASE junto con la función COUNT. Como ya ha visto anteriormente, COUNT le da el número de filas devueltas y, por lo tanto, puede incluso darle el número 0 (si no se devuelve ninguna fila). Si COUNT es un número positivo, se devuelven los valores de la consulta. Si el número es 0, por otro lado, se debe seleccionar la ruta alternativa, lo que significa que se devuelve una línea como valor de retorno.
SELECT CASE
WHEN
(SELECT COUNT(*)
FROM DUAL
WHERE 1=2) <> 0
THEN
(SELECT *
FROM DUAL
WHERE 1=2)
ELSE 'Z'
END
FROM DUAL
-- Return: Z
Puede encontrar más consejos y trucos para SQL Developer, así como para SQL y bases de datos en la página de información general.