Heim > Datenbank > MySQL-Tutorial > Warum kann ich in einer MySQL-WHERE-Klausel keinen Spaltenalias verwenden?

Warum kann ich in einer MySQL-WHERE-Klausel keinen Spaltenalias verwenden?

Barbara Streisand
Freigeben: 2025-01-22 08:17:13
Original
290 Leute haben es durchsucht

Why Can't I Use a Column Alias in a MySQL WHERE Clause?

MySQL WHERE-Klausel lässt keine Spaltenaliase zu: Fehler erklärt

Stößt du auf einen MySQL-Abfragefehler wie #1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'? Dies geschieht normalerweise, wenn Sie versuchen, einen Spaltenalias (wie guaranteed_postcode im Beispiel unten) innerhalb der WHERE-Klausel zu verwenden.

Hier ist die problematische Abfrage:

SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN 
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia')
)
Nach dem Login kopieren

Die Grundursache? Die WHERE-Klausel von MySQL verarbeitet vor der SELECT-Klausel, in der Aliase definiert werden. Daher wird der Alias ​​guaranteed_postcode während der Ausführung der WHERE-Klausel noch nicht erkannt.

Klarstellung der MySQL-Dokumentation:

In der MySQL-Dokumentation heißt es eindeutig, dass Spaltenaliase in WHERE-Klauseln nicht zulässig sind. Dies ist eine Einschränkung, die sich aus der Reihenfolge der Abfrageausführung ergibt.

Lösung: Unterabfrage oder HAVING-Klausel

Um dieses Problem zu beheben, haben Sie zwei Hauptoptionen:

  1. Verschachtelte Unterabfrage: Betten Sie die Funktion SUBSTRING direkt in die Unterabfrage der WHERE-Klausel ein:
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN 
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia')
)
Nach dem Login kopieren
  1. HAVING-Klausel (weniger effizient): Obwohl möglich, ist die Verwendung von HAVING für dieses Szenario im Allgemeinen weniger effizient. HAVING ist für die Filterung nach der Aggregation konzipiert, nicht für die einfache Zeilenfilterung. Es würde eine Umstrukturierung der Abfrage erfordern. Ausführliche Erläuterungen finden Sie in anderen Ressourcen, in denen WHERE und HAVING verglichen werden.

Den richtigen Ansatz wählen:

Für diesen speziellen Fall bietet die verschachtelte Unterabfrage (Option 1) eine sauberere und effizientere Lösung. Es geht das Problem direkt an, indem es die Aliasberechnung im Rahmen der WHERE-Klausel anwendet. Vermeiden Sie die Verwendung von HAVING, es sei denn, Sie führen Aggregationen durch.

Das obige ist der detaillierte Inhalt vonWarum kann ich in einer MySQL-WHERE-Klausel keinen Spaltenalias verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage