ホームページ > データベース > mysql チュートリアル > WHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?

WHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-19 15:26:10
オリジナル
830 人が閲覧しました

Why Can't I Directly Compare Aliases in a WHERE Clause, and How Can I Work Around This?

WHERE 句のエイリアスの制限と解決策

問題:

最近更新されていないレコードに対して table_a をクエリする場合、WHERE 句で別名を使用すると、「ORA-00904 無効な識別子」エラーが発生します。 これは、MONTH_NO 句の処理時にエイリアス WHERE がまだ定義されていないために発生します。

これが例です:

<code class="language-sql">SELECT A.identifier
     , A.name
     , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO
     , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
  FROM table_a A, table_b B
 WHERE A.identifier = B.identifier
   AND MONTH_NO > UPD_DATE</code>
ログイン後にコピー

解決策:

WHERE 句は、 句のSELECTに実行され、エイリアスの直接使用を防ぎます。 解決策は、サブクエリを使用することです:

<code class="language-sql">SELECT * FROM
(
  SELECT A.identifier
    , A.name
    , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO
    , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
  FROM table_a A, table_b B
  WHERE A.identifier = B.identifier
) AS inner_table
WHERE MONTH_NO > UPD_DATE</code>
ログイン後にコピー

このアプローチでは、まず内部クエリ内のエイリアスを定義します。外側のクエリはこれらの定義済みのエイリアスを参照し、「無効な識別子」エラーを解決します。 外側のクエリの SELECT * は、内側のクエリの結果セットからすべての列を選択します。

以上がWHERE 句でエイリアスを直接比較できないのはなぜですか?また、これを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート