2010-12-04 7 views
26

Ich habe zwei Feld nnmu und NNMi,Mysql SELECT CASE WHEN etwas dann Feld zurückkehren

if nnmu is equal to 1, I need to return naziv_mesta from **mesto_istovara**, 
else if it's =0 I need to return naziv_mesta from mesto_utovara table 

und umgekehrt,

if nnmi is equal to 1, then I need to return naziv_mesta from **mesto_utovara,** 
else if it's =0 need to return naziv_mesta from mesto_istovara. 

Zunächst sieht alles gut aus, aber es irgendwie Werte mischen Es funktioniert, wenn nnmi und nnmu beide gleich 0 sind, aber wenn einer der beiden Werte 1 ist, gibt es Unsinn zurück. Irgendeine Hilfe?

select u.id_utovar, 
      u.datum_isporuke, 
      u.broj_otpremnice, 
      r.naziv_robe,    
      CASE u.nnmu 
       WHEN u.nnmu ='0' THEN mu.naziv_mesta 
       WHEN u.nnmu ='1' THEN m.naziv_mesta 
      ELSE 'GRESKA' 
      END as mesto_utovara, 
      CASE u.nnmi 
       WHEN u.nnmi = '0' THEN m.naziv_mesta 
       WHEN u.nnmi = '1' THEN mu.naziv_mesta 
       ELSE 'GRESKA' 
      END as mesto_istovara,             
      m.adresa, 
      m.kontakt_osoba, 
      m.br_telefona, 
      u.broj_paleta, 
      u.bruto, 
      k.username, 
      u.napomena,     
      v.registracija, 
      p.naziv_prevoznika, 
      u.cena, 
      u.korisnik_logistika, 
      u.korisnik_analitika, 
      u.datum_unosa, 
      u.vreme_unosa, 
      u.zakljucan, 
      u.id_mesto_utovara, 
      u.id_mesto_istovara, 
      u.nnmu, 
      u.nnmi    
     FROM utovar u ,mesto_utovara mu, mesto_istovara m, roba r, vozila v,prevoznik p, korisnik k 
     WHERE u.id_mesto_istovara=m.id_mesto_istovara 
     and k.id_korisnik = u.korisnik 
     and r.id_robe=u.id_robe 
     and u.id_mesto_utovara = mu.id_mesto_utovara 
     and v.id_vozilo = u.id_vozilo 
     and p.id_prevoznik = u.id_prevoznik 
     ORDER by u.id_utovar DESC 

Antwort

65

Du Mischen der 2 differentCASE Syntaxen unangemessen.

Mit dieser Art (Durchsuchte)

CASE 
    WHEN u.nnmu ='0' THEN mu.naziv_mesta 
    WHEN u.nnmu ='1' THEN m.naziv_mesta 
ELSE 'GRESKA' 
END as mesto_utovara, 

Oder dieser Stil (Simple)

CASE u.nnmu 
    WHEN '0' THEN mu.naziv_mesta 
    WHEN '1' THEN m.naziv_mesta 
ELSE 'GRESKA' 
END as mesto_utovara, 

nicht dieses (Einfach, aber mit boolean Suchprädikate)

CASE u.nnmu 
    WHEN u.nnmu ='0' THEN mu.naziv_mesta 
    WHEN u.nnmu ='1' THEN m.naziv_mesta 
ELSE 'GRESKA' 
END as mesto_utovara, 

In MySQL wird dies am Ende testen, ob u.nnmu gleich dem Wert des booleschen Ausdrucks u.nnmu ='0' selbst ist. Unabhängig davon, ob u.nnmu ist 10 oder das Ergebnis der Expression Fall wird sich 1

Zum Beispiel, wenn nmu = '0' dann (nnmu ='0') auswertet als true (1) und (nnmu ='1') auswertet als false (0). Setzt man diese in den Gehäuse Ausdruck gibt

SELECT CASE '0' 
    WHEN 1 THEN '0' 
    WHEN 0 THEN '1' 
ELSE 'GRESKA' 
END as mesto_utovara 

wenn nmu = '1' dann (nnmu ='0') auswertet als false (0) und (nnmu ='1') auswertet als true (1). Einsetzen dieser in den Fallausdruck ergibt

SELECT CASE '1' 
    WHEN 0 THEN '0' 
    WHEN 1 THEN '1' 
ELSE 'GRESKA' 
END as mesto_utovara