ホームページ >データベース >mysql チュートリアル >MySQL の WHERE 句で列エイリアスを使用できないのはなぜですか?

MySQL の WHERE 句で列エイリアスを使用できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-22 08:17:13219ブラウズ

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

MySQL の WHERE 句で列のエイリアスが許可されない: エラーの説明

#1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery' のような MySQL クエリ エラーが発生しましたか? これは通常、guaranteed_postcode 句内で列のエイリアス (以下の例の WHERE など) を使用しようとしたときに発生します。

問題のあるクエリは次のとおりです:

<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>
根本的な原因は? MySQL の

句は、エイリアスが定義されている WHERE 句のを処理します。 したがって、エイリアス SELECT は、guaranteed_postcode 句の実行中にまだ認識されません。WHERE

MySQL ドキュメントの説明:

MySQL のドキュメントには、

句では列のエイリアスが許可されないことが明確に記載されています。 これはクエリの実行順序に起因する制限です。WHERE

解決策: サブクエリまたは HAVING 句

これを解決するには、主に 2 つのオプションがあります:

  1. ネストされたサブクエリ: 関数を SUBSTRING 句のサブクエリ内に直接埋め込みます:WHERE
<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 句 (効率が低い): 可能ではありますが、このシナリオでは を使用すると一般に効率が低くなります。 HAVING は、基本的な行フィルタリングではなく、HAVING 集計後のフィルタリングを目的として設計されています。 クエリを再構築する必要があります。 詳細な説明については、WHERE を比較する他のリソースを参照してください。HAVING
正しいアプローチの選択:

この特定のケースでは、ネストされたサブクエリ (オプション 1) がよりクリーンで効率的なソリューションを提供します。

句のスコープ内でエイリアス計算を適用することで、この問題に直接対処します。 集計を実行する場合を除き、WHERE の使用は避けてください。HAVING

以上がMySQL の WHERE 句で列エイリアスを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。