SQL WHERE-Klausel und berechnete Spalten: Eine häufige Gefahr
SQL erfordert häufig das Filtern von Daten basierend auf Berechnungen mit Spalten, wie z. B. Datumsunterschieden. Die direkte Verwendung von Spaltenaliasen innerhalb der WHERE
-Klausel führt jedoch häufig zu Fehlern aufgrund eines „ungültigen Spaltennamens“. Dies liegt daran, dass SQL die SELECT
-Anweisung vor der WHERE
-Klausel verarbeitet, was bedeutet, dass der Alias noch nicht definiert ist, wenn die WHERE
-Klausel versucht, ihn zu verwenden.
Betrachten Sie dieses Beispiel:
<code class="language-sql">SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE daysdiff > 120;</code>
Dies wird fehlschlagen.
Hier sind zwei effektive Lösungen:
1. Unterabfragen (oder Klammern): Vorberechnung des Werts
Setzen Sie die Berechnung in Klammern ein, um SQL zu zwingen, sie zuerst auszuwerten:
<code class="language-sql">SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE (DATEDIFF(day, maxlogtm, GETDATE()) > 120);</code>
Die Klammern erstellen eine Unterabfrage und stellen sicher, dass daysdiff
für die WHERE
-Klausel verfügbar ist.
2. Gemeinsame Tabellenausdrücke (CTEs): Definieren einer temporären Tabelle
Ein CTE stellt einen benannten, temporären Ergebnissatz bereit, der es Ihnen ermöglicht, berechnete Spalten sauberer zu referenzieren:
<code class="language-sql">WITH logDiff AS ( SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary ) SELECT logcount, logUserID, maxlogtm, daysdiff FROM logDiff WHERE daysdiff > 120;</code>
Der CTE logDiff
berechnet daysdiff
vorab und macht ihn in der WHERE
-Klausel der Hauptabfrage zugänglich. Dieser Ansatz verbessert die Lesbarkeit und Wartbarkeit, insbesondere bei komplexeren Berechnungen.
Das obige ist der detaillierte Inhalt vonWie kann ich berechnete Spalten in SQL-WHERE-Klauseln verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!