2012-04-14 23 views
12

Estoy intentando ir a seleccionar valores múltiples con la instrucción CASE. Me di cuenta de que no podemos hacersentencia MYSQL CASE THEN con valores múltiples

CASE 
    WHEN wall.type="bk" 
    THEN books.id1,books.id2, // and so on 
END as column_1, 

¿Hay una manera de hacer THEN con múltiples columnas o necesitamos simplemente escribir un montón de CASE THEN declaraciones? eso parece sucio

+0

Usted podría; pero no lo recomiendo; concatenar las columnas múltiples juntas y analizarlas más adelante'THEN books.id1 | ',' | books.id2 ... 'solo depende de lo que estás tratando de hacer. Esto eliminaría los problemas de valores múltiples devueltos y alias como uno. como sería devolver 1 valor. – xQbert

+0

gracias por su tiempo. ¿podrías explicarme cómo hacer eso? –

+0

CONCAT (books.ID1, ',', books.id2, ',' bookxId ...) devolverá 1, 2, 3 si booksid1 ... es 1,2,3 respectivamente. – xQbert

Respuesta

11

No, solo tiene un valor. Además, es contradictorio utilizar "columnas múltiples" y nombrar esas columnas múltiples como column_1, ¿verdad? :)

Puede usar otra columna para almacenar la otra identificación con (un caso similar) y usar nulos para representar los valores else, tal como lo está haciendo ahora.

Ejemplo:

CASE 
    WHEN wall.type="bk" 
    THEN books.id1 
END as column_1, 
CASE 
    WHEN wall.type="bk" 
    THEN books.id2 
END as column_2 

Comprobar la official documentation para más información.

+0

¿Pero qué ocurre si desea actualizar un valor definido por el usuario en la cláusula 'THEN'? – modulitos

+0

@Lucas Hmm, no estoy seguro de lo que estás hablando. Lo más probable es que sea una pregunta diferente –

+0

Otro ejemplo de cómo MySQL viola el principio DRY todos los días de la semana. Me siento cada vez más cerca de hacer la afirmación audaz de que el aprendizaje de MySQL antes de aprender cualquier otro idioma puede ayudarte a desarrollar malos hábitos. –

4

CASE declaración sólo puede devolver un solo valor, por lo que la única manera de lograr lo que quiere es duplicar el caso ...

El servidor de base de datos debe ser optimizado y realizar sólo una vez que el cheque en el misma condición ...

0

Y todo se puede hacer, pero siempre depende de lo que quiere hacer. A continuación, le mostraré un ejemplo de trabajo justo después de tener que tomar los datos como una matriz y hacer lo que quiera.

CREATE TABLE wall (`ident` int,`type` varchar(2), `order` int); 
INSERT INTO wall (`ident`, `type`, `order`) VALUES 
    (40,'bk', 1), 
    (41,'bk', 5), 
    (42,'rt', 2), 
    (43,'bk', 3), 
    (44,'rt', 1); 

CREATE TABLE books (`ident` int,`id1` int, `time` varchar(8), `id2` int); 
INSERT INTO books (`ident`, `id1`, `time`, `id2`) VALUES 
    (40, 10, '18:07:00', 20), 
    (43, 11, '05:00:00', 21), 
    (44, 12, '21:01:00', 22), 
    (41, 13, '10:00:00', 23), 
    (42, 14, '23:10:00', 24); 
#-------------------------- 
SELECT 
    CASE 
    WHEN wall.type='bk' 
    THEN CONCAT(books.id1,'-',books.id2) 
END AS column_1 

FROM wall JOIN books ON books.ident = wall.ident GROUP BY wall.ident ORDER BY wall.ident ASC; 

impresión:

column_1 
1 10-20 
2 13-23 
3 NULL 
4 11-21 
5 NULL 

Solución en acción a través de este enlace: http://rextester.com/LHPI38373

Cuestiones relacionadas