2012-12-02 12 views
21

Chciałbym zaktualizować wiele kolumn w mojej tabeli za pomocą instrukcji case, ale nie mogę znaleźć sposobu, aby to zrobić (jest to możliwe). Pojawił się następujący nieprawidłowy odnośnik:CASE MySQL do aktualizacji wielu kolumn

UPDATE tablename SET 
    CASE name 
     WHEN 'name1' THEN col1=5,col2='' 
     WHEN 'name2' THEN col1=3,col2='whatever' 
     ELSE col1=0,col2='' 
    END; 

Czy istnieje sposób na osiągnięcie oczekiwanego wyniku z poprawnym SQL?

+0

Prawdopodobny duplikat: http://stackoverflow.com/questions/8358642/case-statement-in-sql-how-to-return-multiple-variables – ean5533

+1

Niezupełnie, jest to instrukcja aktualizacji, a nie wybrana. – Villermen

+0

Duplikat http://stackoverflow.com/q/3432/1553851 – shmosel

Odpowiedz

29
UPDATE tablename 
SET col1 = CASE WHEN name = 'name1' THEN 5 
       WHEN name = 'name2' THEN 3 
       ELSE 0 
      END 
, col2 = CASE WHEN name = 'name1' THEN '' 
       WHEN name = 'name2' THEN 'whatever' 
       ELSE '' 
      END 
; 
+0

Dzięki za to! Zamierzam użyć formatu ean5533, ponieważ zawiera on nazwę CASE, ale ta jest lepiej sformatowana, więc oznaczyłem ją jako anser. – Villermen

+0

Interesujące ... Nie wiedziałem, że to była poprawna składnia. Ucz się czegoś nowego codziennie. – bobwienholt

+0

Dziękuję bardzo @bobwienholt za to zapytanie UPDATE CASE – Pank

6

Nie znam żadnego prostego sposobu robienia tego, o co prosisz. Równoważny ważna zmiana SQL będzie:

UPDATE tablename SET 
    col1 = CASE name WHEN 'name1' THEN 5 WHEN 'name2' THEN 3 ELSE 0 END, 
    col2 = CASE name WHEN 'name1' THEN '' WHEN 'name2' THEN 'whatever' ELSE '' END; 

Oczywiście nie jest to ładna i wymaga powtarzania tych samych przypadkach (np 'name1') wiele razy, ale ja po prostu nie sądzę, że to możliwe w inny sposób.

+0

To robi lewę, a powtarzanie nie będzie takie trudne dla PHP do obsługi =) Dzięki! – Villermen

0

Jeśli name posiada unikalny indeks i Twoje wartości są znane istnieć w tabeli, można użyć tej sztuczki:

INSERT INTO tablename (name, col1, col2) 
VALUES ('name1', 5, '') 
    , ('name2', 3, 'whatever') 
ON DUPLICATE KEY UPDATE 
     col1 = VALUES(col1) 
    , col2 = VALUES(col2); 

Jeśli są jakieś dodatkowe NOT NULL kolumny bez wartości domyślnej, trzeba aby dodać do nich fałszywe wartości. Po prostu zostaw je poza numerem ON DUPLICATE KEY UPDATE i zostaną one zignorowane.

Powiązane problemy