es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL: ¿Existe una única consulta para obtener “todas las filas con X, o si no hay ninguna, todas las filas con Y”?

Estoy pensando en cómo obtener “todas las filas donde col=’X’; si no hay ninguna, todas las filas donde col=’Y'”

Base de datos simplificada:

CREATE TABLE CHARACTER_NAMES(CHARACTER_ID, LANG VARCHAR(3), NAME);

INSERT INTO CHARACTER_NAMES(1, "ENG", "DONALD DUCK");
INSERT INTO CHARACTER_NAMES(1, "ENG", "GOOD OL' DONALD");
INSERT INTO CHARACTER_NAMES(1, "SWE", "KALLE ANKA");
INSERT INTO CHARACTER_NAMES(1, "SWE", "KALLEN");
INSERT INTO CHARACTER_NAMES(2, "ENG", "MICKEY MOUSE");
INSERT INTO CHARACTER_NAMES(2, "SWE", "MUSSE PIGG");
INSERT INTO CHARACTER_NAMES(2, "SWE", "MUSEN");
INSERT INTO CHARACTER_NAMES(3, "ENG", "GOOFY");
INSERT INTO CHARACTER_NAMES(3, "NOR", "FEDTMULE");

(Es un poco forzado que los personajes tengan varios nombres en el mismo idioma, pero así es como se ve la base de datos real. Además, “CHARACTER_ID” también es una clave externa de la tabla CHARACTER, pero eso no es parte del problema, por lo que se omite).

El usuario tiene un ajuste de idioma, y cuando hay una consulta de base de datos para un personaje específico, la consulta debe devolver los nombres en el idioma seleccionado, o los nombres en inglés, si el idioma seleccionado no tiene resultados. En el ejemplo anterior, si el ajuste fuera “Sueco” y el usuario seleccionara el personaje 3 (Goofy), la búsqueda de nombres debería devolver “Goofy”, ya que no hay ningún nombre registrado en sueco. Si el usuario seleccionara a Mickey Mouse, la búsqueda debería devolver 2 filas: “Musse Pigg” y “Musen”.

Me pregunto si es posible expresar esto en una consulta SQL.

Si solo quisiera el primero en el idioma seleccionado, y si no hay ninguno en inglés, podría usar:

SELECT NAME
FROM CHARACTER_NAMES
WHERE CHARACTER_ID=?
ORDER BY CASE
    WHEN LANG='NOR' THEN 1
    WHEN LANG='ENG' THEN 2
END
LIMIT 1;

Pero como no puedo saber cuántos nombres habrá en el idioma seleccionado, tengo que permitir que este LÍMITE varíe, y realmente no sé cómo hacerlo de una manera agradable y adecuada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las filas donde col=’X’; si no hay ninguna, todas las filas donde col=’Y’, puedes utilizar una consulta UNION. La primera declaración SELECT obtendrá todas las filas donde col=’X’ y si no hay ninguna, la segunda declaración SELECT obtendrá todas las filas donde col=’Y’.

    En este caso específico, puedes modificar la consulta anterior de la siguiente manera:

    (SELECT NAME
    FROM CHARACTER_NAMES
    WHERE CHARACTER_ID=? AND LANG='SWE'
    ORDER BY NAME)
    UNION
    (SELECT NAME
    FROM CHARACTER_NAMES
    WHERE CHARACTER_ID=? AND LANG='ENG'
    ORDER BY NAME)
    

    Esta consulta primero seleccionará todos los nombres en el idioma sueco para el personaje especificado y luego lo unirá con todos los nombres en inglés para el mismo personaje. Dado que la cláusula ORDER BY es la misma en ambas declaraciones SELECT, el resultado estará ordenado por nombre según lo deseado.

Comments are closed.