PostgreSQL のデュアルから選択

Bilal Shahid 2024年2月15日
  1. dual テーブルの概要
  2. dual テーブルの紹介
  3. PostgreSQL における dual テーブルの重要性
  4. PostgreSQL で dual テーブルを作成する
PostgreSQL のデュアルから選択

今日のチュートリアルでは、dual テーブル、PostgreSQL でのその重要性、および PostgreSQL で dual から選択する方法について説明します。

dual テーブルの概要

データベース システムでは、テーブルに存在しないデータを選択するためにクエリを使用する必要がある場合があります。 たとえば、次のクエリを実行して現在の日付と時刻を取得できます。

select now();

postgresql でデュアルから選択 - 出力 1

このクエリは、どのテーブルからもデータを選択していないため、FROM キーワードなしで SELECT ステートメントを使用します。 この疑似列の選択は、PostgreSQL で有効な可能性です。

ただし、Oracle などの一部のデータベース管理システムでは、この構文を使用できません。 代わりに、SELECT ステートメントに FROM 句が必要です。

では、上記のような基本的なステートメントを実行するとき、Oracle で何を行うのでしょうか? dual テーブルを使用します。

dual テーブルの紹介

dual テーブルは、上記の問題に対処するために使用される Oracle のダミー テーブルです。

列名が dummy で、データ型 VARCHAR2(1) の行に格納されている x の値を持つ 1つの行と列のみがあります。

Oracle の dual テーブルを見てみましょう。 SQL で簡単な計算をしたいとします。 次の方法でそれを行うことができます。

select 2*2;

ただし、Oracle でこのクエリを実行すると、ORA-00923: FROM キーワードが期待される場所に見つかりませんというエラーが表示されます。 これは、Oracle では、SELECT ステートメントで FROM 句とテーブルを指定する必要があるためです。

したがって、エラーに対抗するために次のクエリを実行します。

select 2*2 as result from dual;

dual がダミー テーブルとして使用されるため、エラーが解消されます。

PostgreSQL では、FROM 句を必ず SELECT ステートメントに含めるという制限はありません。 したがって、エラーなしで次のステートメントを実行できます。

select 2*2 as result;

postgresql でデュアルから選択 - 2つ出力

では、なぜ PostgreSQL の dual テーブルに代わるものを検討する必要があるのでしょうか? この質問は以下で回答されています。

PostgreSQL における dual テーブルの重要性

PostgreSQL 自体は dual テーブルを必要としませんが、データベースを PostgreSQL から Oracle に、またはその逆に移植する際に問題が発生する可能性があります。

組織は、スケーラビリティの問題と最新化のために、あるデータベース管理システムから別のデータベース管理システムにデータベースを移行することを希望する場合があります。 ただし、この目的のためには、両方のプラットフォームの互換性も考慮する必要があります。

互換性の問題の 1つは、Oracle には存在するが PostgreSQL には存在しない dual テーブルです。 したがって、あるプラットフォームから別のプラットフォームにコードを移行すると、エラーが発生することが保証されます。

たとえば、次のコードは Oracle では完全に実行されますが、PostgreSQL ではエラーが発生します。

select 2*2 as result from dual;

postgresql でデュアルから選択 - 3つを出力

これは、PostgreSQL が SELECT ステートメントで FROM キーワードの省略を許可しているため、そこに dual テーブルが存在しないためです。 したがって、そこから選択するとエラーが発生します。

同様に、PostgreSQL では問題なく動作する単純な select 2*2 クエリは、Oracle で実行するとエラーと見なされます。 前に説明したように、Oracle では SELECT ステートメントに FROM 句を含める必要があります。

したがって、これらのプラットフォーム間のデータベース移行に互換性を持たせるには、PostgreSQL でいくつかの代替手段を探す必要があります。 ただし、解決策は簡単です。PostgreSQL には dual テーブルがないため、作成することができます。

PostgreSQL で dual テーブルを作成する

はい、この互換性の問題の解決策は、Oracle のテーブルと同じように、PostgreSQL データベースに dual テーブルを作成することと同じくらい簡単です。 これは次の方法で行うことができます。

CREATE TABLE public.dual ( dummy varchar);

varchar データ型の dummy という名前の列を含めました。 Oracle の dual テーブルと同様に、ダミーの値も入力します。

insert into dual values ('X');

次のクエリを実行して、これが機能するかどうかをテストしましょう。以前は PostgreSQL でエラーが発生していました。

select 2*2 as result from dual;

postgresql でデュアルから選択 - 2つ出力

それは今働いています! これにより、PostgreSQL と Oracle の間のデュアル互換性の問題から選択が除外されます。

または、テーブルの代わりに PostgreSQL で dual ビューを作成することもできます。 これは次の方法で行われます。

CREATE VIEW public.dual AS 
SELECT 'X'::varchar AS dummy;

ここでは、dual ビューの定義で、Oracle の dual テーブルにあるものと同様に、ダミーの varchar 変数を選択しています。 このクエリを再度実行して、これが機能するかどうかを確認しましょう。

select 2*2 as result from dual;

postgresql でデュアルから選択 - 2つ出力

予想通り、これもうまくいきます! したがって、PostgreSQL でテーブルまたはビューを作成できます。これは、Oracle のデュアルテーブルと同じように機能します。

PostgreSQL で dual テーブルを使用して疑似列を選択する他の例を見て、それがすべての場合に機能するかどうかを確認してみましょう。

次の例では、次のクエリを使用して現在の日付と時刻を選択してみます。

select now() from dual;

次の出力が得られます。

postgresql でデュアルから選択 - 出力 1

次の方法で、データベースの現在のユーザーを選択することもできます。

select user from dual;

次の出力が得られます。

postgresql でデュアルから選択 - 4つを出力

そのため、FROM 句を指定する必要がある Oracle などの一部のデータベース管理システムでは、dual テーブルが必要であると説明しました。

互換性の問題に対処するために、PostgreSQL でダミーのデュアルテーブルまたはビューを作成する方法を学びました。 これらの概念を十分に理解していただければ幸いです。 学び続けます!

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub