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
Barbara StreisandOriginal
2025-01-22 08:17:13287Durchsuche

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:

<code class="language-sql">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')
)</code>

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:
<code class="language-sql">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')
)</code>
  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!

Stellungnahme:
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