0Pricing
SQL Interview Prep · Lección

Devolver NULL cuando no existe el enésimo valor

Resuelva el caso límite que tanto gusta a los entrevistadores: gestionar correctamente que haya muy pocas filas

Devolver NULL cuando no existe el enésimo valor es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

El caso límite que les encanta a los entrevistadores

Después de resolver correctamente la consulta del N-ésimo valor más alto, el entrevistador añade: «¿Qué ocurre si la tabla tiene menos de N salarios distintos? Quiero un único NULL, no un resultado vacío».

Esta pregunta distingue a quienes memorizaron una consulta de quienes entienden el comportamiento de los conjuntos de resultados. Muchas soluciones devuelven silenciosamente cero filas en lugar de una fila que contiene NULL.

Esta lección trata de forzar exactamente una fila de salida cuyo valor sea NULL cuando no exista el valor N-ésimo.

Por qué DENSE_RANK por sí solo no devuelve filas

Recuerde la consulta estándar para obtener el N-ésimo salario más alto. Si solo hay dos salarios distintos y solicita el tercero, WHERE rnk = 3 no encuentra coincidencias, por lo que la consulta devuelve un conjunto vacío: cero filas.

Un conjunto vacío no equivale a una fila que contenga NULL. Si la especificación indica «devolver NULL», un resultado vacío no supera la prueba, aunque la lógica subyacente sea correcta.

SELECT salary
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) t
WHERE rnk = 3;  -- returns NO rows if fewer than 3 distinct salaries

Corrección 1: envolver la consulta en un SELECT exterior

La solución fiable más sencilla consiste en convertir toda la consulta del N-ésimo valor más alto en una subconsulta escalar dentro de un único SELECT. Una subconsulta escalar que no encuentra filas se evalúa como NULL, y el SELECT exterior siempre produce exactamente una fila.

Esta es la respuesta canónica para la variante «devolver NULL» al estilo de LeetCode y funciona en todos los dialectos.

SELECT (
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2   -- N = 3
) AS third_highest;

Por qué funciona el truco de la subconsulta escalar

Dos reglas se combinan para producir el comportamiento que necesita:

  • Una subconsulta escalar debe devolver como máximo un valor. Si no devuelve filas, SQL sustituye el resultado por NULL.
  • El SELECT exterior sin FROM, o con una fuente de una sola fila, siempre emite exactamente una fila.

Por tanto, cuando la consulta interna encuentra el valor N-ésimo, lo obtiene; cuando no encuentra nada, obtiene una fila que contiene NULL. Es exactamente el contrato indicado por el entrevistador.

Corrección 1 con la versión DENSE_RANK

La misma envoltura funciona con la solución basada en funciones de ventana. Coloque la consulta clasificada dentro de la subconsulta escalar; si ninguna fila tiene el rango N, la subconsulta produce NULL y el SELECT exterior sigue devolviendo una fila.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = 3
) AS third_highest;

Corrección 2: MAX devuelve NULL automáticamente

Recuerde el enfoque MAX sobre MAX de la lección 1. Una agregación sobre cero filas devuelve NULL y sigue produciendo una fila. Para obtener el segundo valor más alto, esta es una solución concisa que ya cumple el requisito de devolver NULL.

El inconveniente es que extender el anidamiento de MAX a un N arbitrario se vuelve poco práctico, por lo que esta opción es más adecuada específicamente para el segundo valor más alto.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Corrección 3: COALESCE con un valor alternativo

Si su entorno garantiza una fila, pero el valor puede faltar por algún otro motivo, puede envolver el resultado en COALESCE para proporcionar un valor predeterminado explícito.

Nota: COALESCE solo resulta útil cuando ya existe una fila. No convierte un conjunto de resultados vacío en una fila. Por tanto, combínelo con la envoltura de la subconsulta escalar, que garantiza una fila, y después aplique COALESCE al valor si desea algo distinto de NULL, como 0.

SELECT COALESCE((
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;

Lo que NO lo soluciona

Tenga cuidado con las soluciones que parecen correctas, pero fallan:

  • Añadir COALESCE directamente alrededor de una consulta que devuelve cero filas no sirve de nada; no existe ninguna fila sobre la que COALESCE pueda actuar.
  • IFNULL / ISNULL tienen la misma limitación que COALESCE.
  • Añadir LIMIT 1 no inventa una fila cuando ninguna cumple los criterios.

El problema del número de filas debe resolverse con la envoltura de una subconsulta escalar o con una agregación, no únicamente con funciones de sustitución de valores NULL.

Ejemplo resuelto: pedir el tercero de dos

Salarios: 500, 500, 300. Los salarios distintos son solo 500 y 300, por lo que no existe un tercero más alto.

  • DENSE_RANK simple con WHERE rnk = 3: devuelve cero filas. No cumple la especificación.
  • Envoltura con una subconsulta escalar: la consulta interna no encuentra nada, por lo que el SELECT exterior devuelve una fila: NULL. Cumple la especificación.
  • COALESCE(..., 0): devuelve una fila: 0, si se solicitó un valor predeterminado numérico.

Explicarlo durante la entrevista

Gane puntos explicándolo en voz alta:

  • «La consulta ingenua devuelve un conjunto vacío, no NULL, así que la envolveré en una subconsulta escalar para garantizar una fila».
  • «Una subconsulta escalar sin filas coincidentes se evalúa como NULL, que es exactamente el contrato».
  • «Si prefiere un valor predeterminado como 0 en lugar de NULL, añadiré COALESCE alrededor de la subconsulta».

El objetivo de esta pregunta es demostrar que entiende la diferencia entre la semántica del número de filas y la de los valores.

Unir todas las piezas

Una solución robusta y parametrizable para obtener el N-ésimo valor más alto o NULL: clasificar los salarios distintos, filtrar el rango N dentro de una subconsulta escalar y dejar que el SELECT exterior garantice una sola fila.

Esta consulta gestiona los duplicados mediante DENSE_RANK, se generaliza a cualquier N y devuelve NULL correctamente cuando N supera el número de salarios distintos.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = :n
  LIMIT 1
) AS nth_highest;

Comprobación rápida

Analice el número de filas frente a los valores NULL.

Resumen

Cuando N supera los salarios distintos disponibles, una consulta de clasificación simple devuelve un conjunto vacío, no NULL.

  • Envuelva la consulta del N-ésimo valor más alto en una subconsulta escalar dentro de un SELECT exterior para que siempre produzca una fila, con NULL cuando ningún valor coincida.
  • La forma MAX sobre MAX devuelve NULL automáticamente para el caso del segundo valor más alto.
  • COALESCE solo sustituye un valor cuando ya existe una fila; no puede convertir cero filas en una.

Distinga siempre el número de filas del valor cuando el entrevistador pida gestionar NULL correctamente.

Preguntas frecuentes

¿La lección «Devolver NULL cuando no existe el enésimo valor» es gratis?

Sí — el texto completo de «Devolver NULL cuando no existe el enésimo valor» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Devolver NULL cuando no existe el enésimo valor»?

Resuelva el caso límite que tanto gusta a los entrevistadores: gestionar correctamente que haya muy pocas filas Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Devolver NULL cuando no existe el enésimo valor»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. El segundo salario más alto, de cinco formas
  2. El enésimo valor más alto con DENSE_RANK
  3. La persona con mayores ingresos por departamento
  4. Devolver NULL cuando no existe el enésimo valor
← Volver a SQL Interview Prep