次のようなテーブルを想定します。
CREATE TABLE tbl (
link_ids int[] PRIMARY KEY -- which is odd for a PK
, length int[]
, CHECK (length <> '{}'::int[]) -- rules out null and empty in length
);
Postgres 9.3 以降のクエリ:
SELECT link_ids, min(len) AS min_length
FROM tbl t, unnest(t.length) len -- implicit LATERAL join
GROUP BY 1;
または、小さな関数を作成します (Postgres 8.4+):
CREATE OR REPLACE FUNCTION arr_min(anyarray)
RETURNS anyelement LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
'SELECT min(i) FROM unnest($1) i';
PARALLEL SAFE
Postgres 9.6 以降でのみ追加してください。それで:
SELECT link_ids, arr_min(length) AS min_length FROM t;
関数はインライン化でき、高速です。
または、単純な長さの配列integer
の場合は、追加のモジュールとその組み込み関数(Postgres 8.3+) を使用します。intarray
sort()
SELECT link_ids, (sort(length))[1] AS min_length FROM t;