2012-04-14 17 views
12

Próbuję go wybrać wiele wartości z oświadczeniem CASE. Zauważyłem, że nie możemy zrobićPRZYKŁAD MYSQL THEN instrukcja z wieloma wartościami

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

Czy istnieje sposób, aby zrobić THEN z wielu kolumn czy musimy po prostu napisać kilka CASE THEN stwierdzeniami? wydaje się nieporządny

+0

Mogłabyś; ale nie polecam; Połącz ze sobą wiele kolumn i spróbuj je później "THEN books.id1 | ',' | books.id2 ...' zależy od tego, co chcesz zrobić. Wyeliminowałoby to problem zwracania wielu wartości i aliasów jako jeden. ponieważ zwróciłaby 1 wartość. – xQbert

+0

dzięki za poświęcony czas. czy możesz wyjaśnić, jak to zrobić? –

+0

CONCAT (books.ID1, ',', books.id2, ',' bookxId ...) zwróci 1, 2, 3, jeśli booksid1 ... wynosi odpowiednio 1,2,3. – xQbert

Odpowiedz

11

Nie, to tylko jedna wartość. Ponadto jest sprzeczne z używaniem "wielu kolumn" i nazwij te wiele kolumn jako column_1, prawda? :)

Możesz użyć innej kolumny do przechowywania innego identyfikatora z (podobny przypadek) i używać wartości null do reprezentowania wartości else, tak jak teraz.

Przykład:

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

Sprawdź official documentation aby uzyskać więcej informacji.

+0

Ale co jeśli chcesz zaktualizować wartość zdefiniowaną przez użytkownika w klauzuli "TO"? – modulitos

+0

@ Lucas Hmm, nie jestem pewien, o czym mówisz. Najprawdopodobniej powinno to być inne pytanie –

+0

Kolejny przykład tego, jak MySQL łamie zasadę DRY każdego dnia tygodnia. Czuję, że zbliżam się do śmiałego twierdzenia, że ​​uczenie się MySQL zanim nauczysz się jakiegokolwiek innego języka pomoże ci rozwinąć złe nawyki. –

4

nr CASE oświadczenie może zwrócić tylko jedną wartość, więc jedynym sposobem, aby osiągnąć to, co chcesz powielać sprawę ...

Serwer bazy danych powinny być zoptymalizowane i wykonać tylko jeden raz czek na ten sam stan ...

0

I wszystko można zrobić, ale zawsze zależy to od tego, co chcesz zrobić. Poniżej pokażę działający przykład zaraz po tym, jak musisz pobrać dane jako tablicę i zrobić to, co chcesz.

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; 

druku:

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

Rozwiązanie w akcji poprzez ten link: http://rextester.com/LHPI38373

Powiązane problemy