2016-05-12 13 views
0

Ich wurde damit beauftragt, eine unserer MySQL-Ansichten so zu bearbeiten, dass sie fehlende Zeilen enthält. Das Problem ist, dass die vorherige Ansichtsabfrage if() -Anweisungen verwendete, die aus irgendeinem Grund nicht alle Tabellenzeilen erfassen. Ich bin auf keinen Fall einen SQL Master bedeutet, und dies nicht heraus kann ...MySQL View Logic mit Case

Originalcode-Beispiel:

CREATE VIEW `b2b_data` AS SELECT 
`asteriskcdrdb`.`cdr`.`uniqueid` AS `callid`, 
`asteriskcdrdb`.`cdr`.`calldate` AS `ENTER`, 
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`did`,`asteriskcdrdb`.`cdr`.`src`) AS `caller_id`, 
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),'outbound','inbound') AS `direction`, 
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`src`,substr(`asteriskcdrdb`.`cdr`.`dstchannel`,5,3)) AS `AGENT`, 
sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`, 
`asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`, 
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`dstchannel`,`asteriskcdrdb`.`cdr`.`did`) AS `ROUTE`, 
`asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE (((`asteriskcdrdb`.`cdr`.`dst` = '601') AND (`asteriskcdrdb`.`cdr`.`dcontext` = 'ext-group')) OR ((`asteriskcdrdb`.`cdr`.`dst` = '601') AND (`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal-xfer')) OR ((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal') AND (`asteriskcdrdb`.`cdr`.`src` in ('143','146','317','318','320','225','214')))) 

ich online lesen, dass IF ... ELSEIF nur in gespeicherten Prozeduren und Funktionen arbeitet. Also habe ich diese Idee verschrottet. Ich dachte dann, dass ich vielleicht CASE verwenden könnte, um die Abfrage zurückzugeben, was ich brauchte. Unnötig zu sagen, das hat nicht funktioniert und es war eindeutig falsch ... aber es zeigt die Logik, die ich versuche zu verwenden.

Modded Codebeispiel:

CREATE VIEW `b2b_data` AS SELECT 
`asteriskcdrdb`.`cdr`.`uniqueid` AS `callid`, 
`asteriskcdrdb`.`cdr`.`calldate` AS `ENTER`, 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`did` AS `caller_id`; 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`; 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`; 
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`; 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN 'outbound' AS `direction`; 
    WHEN 'from-internal-xfer' THEN 'inbound' AS `direction`; 
    WHEN 'ext-local' THEN 'inbound' AS `direction`; 
    WHEN 'ext-group' THEN 'inbound' AS `direction`; 
    WHEN 'from-did-direct' THEN 'inbound' AS `direction`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`src` AS `AGENT`; 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`; 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`; 
    WHEN 'ext-group' THEN substr(`asteriskcdrdb`.`cdr`.`dstchannel`;5;3)) AS `AGENT`; 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`; 
    WHEN 'from-internal-xfer' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`; 
    WHEN 'ext-local' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`; 
    WHEN 'ext-group' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`; 
    WHEN 'from-did-direct' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`; 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`; 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`; 
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`; 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`dstchannel` AS `ROUTE`; 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`dstchannel` AS `ROUTE`; 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`; 
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`; 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`; 
END CASE; 

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`src` IN ('143';'146';'317';'318';'320';'225';'214'); 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214'); 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214'); 
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` = '601'; 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214'); 
END CASE; 

Antwort

0

Sie bringen die AS Klauseln in der falschen Stelle. Der gesamte Ausdruck CASE ergibt einen einzelnen Wert, dem Sie den Alias ​​zuweisen. Und Sie verwenden ; nicht zwischen den WHEN Klauseln oder nach dem Fall, da das die gesamte Abfrage beendet. Es gibt kein Trennzeichen zwischen WHEN Klauseln, und der gesamte Ausdruck ist von anderen SELECT Spalten mit , getrennt.

CASE `asteriskcdrdb`.`cdr`.`dcontext` 
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`did` 
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`src 
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`src` 
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`src` 
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`src` 
END CASE AS `caller_id`, 

und ähnlich für groß die anderen CASE Ausdrücke.

+0

Ich werde dies morgen eine Aufnahme geben und Ihre Antwort verbessern, wenn es richtig funktioniert. Ich habe das Gefühl, dass ich es alle drei Male falsch geschrieben habe ... Ich benutzte sowohl Kommas als auch Semikolons, um die WHEN-Klauseln zu trennen. Dachte ich musste wegen der MySQL-Dokumentation Beispiel [hier] (https://dev.mysql.com/doc/refman/5.7/en/case.html). –

+0

Diese Dokumentation ist für die 'CASE' ** -Anweisung **, die in gespeicherten Prozeduren verwendet wird; Die Semikolons stehen für das Ende der von ihr gesteuerten Anweisungen. 'CASE' ** Ausdrücke ** sind beschrieben [hier] (http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html) – Barmar

+0

Siehe auch [Case Expression vs Case Statement] (http://stackoverflow.com/questions/12436859/case-expression-vs-case-statement) – Barmar