Int Array の列があります。その行のその配列の数値要素を常に表示する別の列をテーブルに追加したいと思います。この値は自動的に更新されます。関数をデフォルト値として埋め込む方法はありますか? もしそうなら、この関数はその引数 (int 配列の列/行番号) を選択する場所をどのように知るのでしょうか。
1 に答える
正規化されたテーブルでは、この機能的に依存する冗長な情報を別の列として含めません。
その場で計算するのに十分簡単で高速です。
SELECT array_dims ('{1,2,3}'::int[]);
または:
SELECT array_length('{1,2,3}'::int[], 1);
array_length()
PostgreSQL 8.4 で導入されました。たぶん、アップグレードのインセンティブですか?8.3 は間もなくサービスを終了します。
Postgres 8.3 では、以下を使用できます。
SELECT array_upper('{1,2,3}'::int[], 1);
しかし、明示的に入力した場合、配列インデックスは任意の数値で開始できるため、これは劣ります。array_upper()
実際の長さがわからない場合は、array_lower()
最初に減算する必要があります。また、PostgreSQL では、宣言された次元の数に関係なく、配列は常に複数の次元を含むことができることに注意してください。ここでマニュアルを引用します:
現在の実装では、宣言された次元数も強制されません。特定の要素型の配列は、サイズや次元数に関係なく、すべて同じ型であると見なされます。したがって、CREATE TABLE で配列のサイズまたは次元数を宣言することは、単なるドキュメントです。実行時の動作には影響しません。
(8.3 と 9.1 の両方に当てはまります。)array_dims()
全体像を示すために最初に述べたのはそのためです。
マニュアルの配列関数の詳細。
ビューを作成して、機能的に依存する列を含めることができます。
CREATE VIEW v_tbl AS
SELECT arr_col, array_length(arr_col, 1) AS arr_len
FROM tbl;