2011-03-09 15 views
7

Tengo una tabla de vehículo con un campo Owner_ID en ella. Este Owner_ID se corresponderá con el campo ID en una tabla Customer o con el campo ID en una tabla Business. Estoy buscando devolver diferentes valores según la tabla a la que pertenece el ID.¿Seleccionar valores múltiples a través de la declaración CASE?

que tienen esta declaración:

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 

Así que digo que quiero volver al apellido del cliente si el OWNER_ID = Customer.ID, y el nombre de la empresa si OWNER_ID = business_id. Sé que puedo utilizar la instrucción CASE como tal:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 

Pero hay una manera de obtener múltiples valores de una declaración de caso? Algo así como: (. Sé que esto es totalmente erróneo, por cierto)

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN 
      SELECT c.Surname, c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN 
      SELECT b.Name, b.Founded 

O voy a tener que hacer:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 
    END AS "Name", 
    CASE WHEN c.ID IS NOT NULL THEN c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN b.Founded 
    END AS "DOB/Founded" 

Respuesta

2

No hay ninguna manera de conseguir una rama de una expresión case a abarcar varias columnas.

En su caso ejemplo, usted podría hacer

SELECT v.Make, 
     v.Model, 
     MAX(COALESCE(c.Surname, b.name)) as name 
FROM Vehicle v 
     LEFT JOIN Customer c 
     ON c.ID = v.Owner_ID 
     LEFT JOIN Business b 
     ON b.ID = v.Owner_ID 
GROUP BY v.Owner_ID 
+0

Sí que pude, pero me he dejado algunas otras partes y piezas que hacen de este un no ir, podría hacerlo con declaraciones COALESCE' anidados 'pero creo Me quedaré con 'CASE' para fines de legibilidad. – anothershrubery

2

Creo que hay que tener claro qué columnas de la consulta debe devolver y esto no puede cambiar dependiendo de la consulta. Entonces las condiciones tienen que ser divididas por columna.

¿Qué hay de IF? Puede ser más fácil de leer en este caso.

SELECT v.Make, v.Model, 
    IF(c.ID IS NOT NULL, c.Surname,  IF(b.ID IS NOT NULL, b.Name, NULL)) as `Name` 
    IF(c.ID IS NOT NULL, c.Date_Of_Birth, IF(b.ID IS NOT NULL, b.Founded, NULL)) as `DOB_Founded` 
0

No estoy seguro, pero se puede tratar éste

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 
WHERE c.Surname IS NOT NULL 
OR b.name IS NOT NULL 
Cuestiones relacionadas