2016-06-30 2 views
0

Hallo Ich versuche, eine If-Anweisung in SQL Select-Abfrage zu machen, möchte ich nur anwenden, wenn Variable $ Abteilung ist anders als NULL. Wenn die Variable unterschiedlich ist, dann setzen Sie P2.department = P1.department als AND-Klausel.Haben AND-Klausel, wenn die Variable in MySQL nicht null ist Wählen Sie

Die Abfragezeile ist wie folgt:

,(SELECT SUM(P2.fee) FROM cases P2 WHERE 
IF('$department' IS NULL, 0, P2.department = P1.department) AND curency = 1) as fee_USD 

In der aktuellen Situation die Abfrage funktioniert, aber es zeigt falsche Ergebnisse. Meine Frage ist, das ist der beste Weg, P2.department = P1.department AND in die Abfrage aufzunehmen. Jede Hilfe ist willkommen. Hier

ist die vollständige Abfrage:

     SELECT 
         P1.id 
         ,P1.department 
         ,P1.curency 
         ,P1.fee 
         ,count(P1.id) as count_cases 
         ,(SELECT SUM(P2.fee) FROM cases P2 WHERE 
         IF('$department' IS NULL, 0, P2.department = P1.department) 
         AND curency = 1) as fee_USD           

        FROM cases P1 WHERE 1";             
          if (!empty($department)) { $sql .= " AND P1.department = '$department'"; } 
          if (!empty($status)) { $sql .= " AND P1.status = '$status'"; } 
+0

Sie die Abfrage Verkettung als Zeichenfolge verwenden kann, nachdem Sie den Test auf null zu tun und führe es später aus !! versuchen Sie bitte mehr Ihre Anfrage zu klären bitte – PacMan

Antwort

0

scheint keine Notwendigkeit IF zu bedienen, nur wird AND auch gut sein;)

,(SELECT SUM(P2.fee) FROM cases P2 WHERE 
curency = 1 AND '$department' IS NOT NULL AND P2.department = P1.department) as fee_USD 

Herausgegeben

,(SELECT SUM(P2.fee) FROM cases P2 WHERE 
curency = 1 AND ('$department' = '0' OR P2.department = P1.department)) as fee_USD 

Diese Abfrage wird P2.department = P1.department nur ausgeführt, wenn $department nicht 0 ist.

+0

Hier wird die Bedingung P2.department = P1.Department ausgeführt, unabhängig vom Status von $ department. Ich möchte, dass diese Bedingung gelöscht wird, wenn $ department 0 ist –

+0

@JohnSiniger Was ist, wenn $ department null ist? Wenn nur für "0", überprüfen Sie bitte die *** Edited *** Antwort. – Blank

+0

wenn 0 ist dann muss nichts passieren, P2.department = P1.department muss nicht als Bedingung in der WHERE sein. –

1

Es sieht so aus, als ob Sie versuchen, eine PHP-Variable in ein qouted SQL-String-Literal zu interpolieren. (Btw .: Interpolation in SQL ist fast immer eine schlechte Idee, außer dass Sie den dynamischen Inhalt zur Entwicklungszeit wirklich kennen; suchen Sie nach "SQL Injection".) Ein String-Literal wird niemals NULL sein. Wenn PHP NULL in eine Zeichenfolge interpoliert wird, führt dies zu einer leeren Zeichenfolge. Das SQL $sql = "WHERE ('$department' = '' OR ...) würde funktionieren, um die folgende Bedingung zu ignorieren, und $sql = "WHERE '$department' != '' AND ... würde erfordern, dass die Variable festgelegt wird, oder die Zeile wird überhaupt nicht ausgewählt, jedoch sollten Sie einen sichereren Weg wählen. Da das PHP-Variable wird nicht während der Ausführung von SQL ändern, bauen nur Ihre SQL-Zeichenfolge auf dem abhängigen das PHP-Variable NULL ist oder nicht:

$department_cond = is_null($department) ? '' : ' `P2`.`department` = `P1`.`department` AND'; 

$sql = "... ,(SELECT SUM(`P2`.`fee`) FROM `cases` `P2` WHERE{$department_cond} curency = 1) `fee_USD`;"; 
Verwandte Themen