PostgreSQL のデュアルから選択
 
今日のチュートリアルでは、dual テーブル、PostgreSQL でのその重要性、および PostgreSQL で dual から選択する方法について説明します。
dual テーブルの概要
    
データベース システムでは、テーブルに存在しないデータを選択するためにクエリを使用する必要がある場合があります。 たとえば、次のクエリを実行して現在の日付と時刻を取得できます。
select now();

このクエリは、どのテーブルからもデータを選択していないため、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 の dual テーブルに代わるものを検討する必要があるのでしょうか? この質問は以下で回答されています。
PostgreSQL における dual テーブルの重要性
PostgreSQL 自体は dual テーブルを必要としませんが、データベースを PostgreSQL から Oracle に、またはその逆に移植する際に問題が発生する可能性があります。
組織は、スケーラビリティの問題と最新化のために、あるデータベース管理システムから別のデータベース管理システムにデータベースを移行することを希望する場合があります。 ただし、この目的のためには、両方のプラットフォームの互換性も考慮する必要があります。
互換性の問題の 1つは、Oracle には存在するが PostgreSQL には存在しない dual テーブルです。 したがって、あるプラットフォームから別のプラットフォームにコードを移行すると、エラーが発生することが保証されます。
たとえば、次のコードは Oracle では完全に実行されますが、PostgreSQL ではエラーが発生します。
select 2*2 as result from dual;

これは、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 と 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 でテーブルまたはビューを作成できます。これは、Oracle のデュアルテーブルと同じように機能します。
PostgreSQL で dual テーブルを使用して疑似列を選択する他の例を見て、それがすべての場合に機能するかどうかを確認してみましょう。
次の例では、次のクエリを使用して現在の日付と時刻を選択してみます。
select now() from dual;
次の出力が得られます。

次の方法で、データベースの現在のユーザーを選択することもできます。
select user from dual;
次の出力が得られます。

そのため、FROM 句を指定する必要がある Oracle などの一部のデータベース管理システムでは、dual テーブルが必要であると説明しました。
互換性の問題に対処するために、PostgreSQL でダミーのデュアルテーブルまたはビューを作成する方法を学びました。 これらの概念を十分に理解していただければ幸いです。 学び続けます!
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