1. ホーム
  2. sql

[解決済み] PostgreSQLの計算/計算/仮想/派生カラム

2022-06-23 12:39:45

質問

PostgreSQL は MS SQL Server のような計算された列をサポートしていますか? ドキュメントには何も書かれていませんが、この機能は他の多くのDBMSに含まれているため、何か見落としているのではないかと思いました。

例えば http://msdn.microsoft.com/en-us/library/ms191250.aspx

どのように解決するのですか?

Postgres 11 まで 生成されたカラム はサポートされていません - 標準SQLで定義され、DB2、MySQL、Oracleを含むいくつかのRDBMSで実装されているように。また、同様の computed columns" のような SQL Server の列もサポートされていません。

STORED で生成されたカラムが導入されます。 Postgres 12 . 些細な例です。

CREATE TABLE tbl (
  int1    int
, int2    int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);

db<>フィドル ここで

VIRTUAL 生成された列は、次の反復処理のいずれかに含まれるかもしれません。(Postgres 14ではまだです)。

関連する


それまでは のように、エミュレートすることができます。 VIRTUAL で生成されたカラムを 機能 を使って 属性表記で ( tbl.col ) を使用することで は、仮想生成カラムのように見え、動作します。 . これは歴史的な理由からPostgresに存在する、ちょっとした構文の奇妙さであり、たまたまこのケースに合致しています。この関連する回答には コード例 :

式(カラムのように見える)を SELECT * FROM tbl には含まれませんが。常に明示的にリストアップする必要があります。

も対応可能で、一致する 式インデックス - である場合、その関数は IMMUTABLE . のように。

CREATE FUNCTION col(tbl) ... AS ...  -- your computed expression here
CREATE INDEX ON tbl(col(tbl));

代替案

別の方法として、同じような機能を VIEW で実装することもできます。次に SELECT * は生成されたカラムを含むことができます。

"パーシステッド" ( STORED ) 計算カラムは トリガー で実装することができます。

マテリアライズド・ビュー は密接に関連した概念です。 はPostgres 9.3から実装されています。 .

それ以前のバージョンでは、MVを手動で管理することができます。