2013-07-06 25 views
6

Ich möchte eine andere SELECT basierend auf den Spaltendaten durchführen. Zum Beispiel habe ich eine Tabelle http://sqlfiddle.com/#!2/093a2, wo ich start_date und end_date nur vergleichen möchte, wenn use_schedule = 1 ist. Andernfalls wählen Sie alle Daten. (Eine andere Auswahl) Grundsätzlich möchte ich nur das Start- und Enddatum vergleichen, wenn nur use_schedule 1 ist und wenn use_schedule 0 ist, dann wähle Rest der Daten. nurSo wählen Sie basierend auf verschiedenen Spaltendaten

kann Ein Beispiel so etwas wie

select id, name from table 
where use_schedule = 0 
else 
select id, name, start_date from table 
where use_schedule = 0 and current_date >= start_date. 

Grundsätzlich sein ich die Daten haben, wo Zeitplan dann Datum schauen Sie in Start- und Ziel aktiviert ist. Denn wenn der Zeitplan nicht aktiviert ist, gibt es keinen Grund, in die Daten zu schauen. Wählen Sie einfach die Daten aus. Wenn der Zeitplan aktiviert ist, möchte ich bei der Auswahl der geplanten Daten selektiver vorgehen.

Ich versuche herauszufinden, ob MySQL CASE oder IF-Anweisungen funktionieren würden, aber nicht in der Lage, dies zu tun. Wie kann ich diese Auswahl ausführen?

Danke.

+0

Was meinst du damit, start_date und end_date zu vergleichen? WENN der Start wenn nach dem Ende? Der Start ist vorher? Bitte geben Sie mehr Daten an. –

+0

Grundsätzlich habe ich die Daten, wo Zeitplan aktiviert ist dann nur in Start-und Enddatum schauen. Denn wenn der Zeitplan nicht aktiviert ist, gibt es keinen Grund, in die Daten zu schauen. Wählen Sie einfach die Daten aus. Wenn der Zeitplan aktiviert ist, möchte ich bei der Auswahl der geplanten Daten selektiver vorgehen. – NBhatti

+0

OK, jetzt bekomme ich die Frage besser, füge das zur Frage hinzu, damit es besser erklärt wird. Ich sehe, dass Sie "mysql" nur als Tag verwenden, verwenden Sie auch eine serverseitige Sprache? –

Antwort

1

Sie UNION verwenden können, mischen und die Ergebnisse von zwei verschiedenen SQL-Abfragen in eine Ergebnismenge entsprechen.

select id, name, null from table 
where use_schedule = 0 
union 
select id, name, start_date from table 
where use_schedule = 1 and current_date >= start_date 

Beachten Sie, dass beide Abfragen kompatible Ausgabefelder haben müssen (gleiche Nummer und Typ, damit dies funktioniert). Die Verwendung von UNION führt automatisch nur unterschiedliche Datensätze zusammen - wenn Sie doppelte Ergebnisse behalten möchten, verwenden Sie stattdessen .

In diesem speziellen Fall eine weitergehende WHERE -Klausel würde natürlich auch arbeiten:

where use_schedule = 0 or (use_schedule = 1 and current_date >= start_date) 

Aber die Frage gegeben, ich bin dein realen Fall unter der Annahme, ein wenig komplexer ist.

.

+0

Union ist eigentlich zwei SELECTs, die ich versuche zu vermeiden. Wenn 2 SELECTS die Option ist, könnte ich das in meiner Programmiersprache getan haben. Deine Lösung funktioniert perfekt, aber lass uns sehen, ob wir etwas effizienteres herausfinden können? – NBhatti

+0

Eine Vereinigung von 2 Auswahlen ist viel effizienter als 2 separate Auswahlen intern. –

1

Use-Case, in diesem Fall ..:

SELECT id, name, 
    (CASE 
     WHEN start_date >= DATE(NOW()) AND use_schedule = 1 
     THEN start_date 
    ELSE NULL 
    END) AS cols FROM campaigns 

diese Weise ist es nur den Zeitplan 0 oder die 1 mit einem Datum größer oder gleich jetzt auswählt; I verwendet DATE (NOW()), so dass es die Zeit entfernt, die Sie nicht interessiert sind

Verwandte Themen