2011年9月30日金曜日

【PostgreSQL】2つの配列に共通する要素のインデックスを取得する関数

やりたいことは、配列A{1,3,4,5,8,10,11,12}と配列B{1,2,5,11,13}から共通する要素(1,5,11)を探し、
配列Aの要素番号(1,4,7)を取得すること。(配列Aの要素はユニークである仮定)


配列Bが数値1つでよければ、contribにidx関数がある。

idx(int[], int item)
戻り値の型:int
説明:itemに一致する要素番号(存在しなければ0)
例:idx(array[11,22,33,22,11], 22)
結果:2

intarray
http://www.postgresql.jp/document/current/html/intarray.html


これを利用して関数を作成(sort()とuniq()もintarrayモジュールに含まれる)

CREATE OR REPLACE FUNCTION idx_array(_int4, _int4) RETURNS _int4 AS
'SELECT
    uniq(sort(array_agg(idx($1, t.v))))
FROM
    unnest($2) AS t(v)
WHERE
    idx($1, t.v) > 0'
LANGUAGE SQL IMMUTABLE STRICT;

SELECT idx_array(ARRAY[1,3,4,5,8,10,11,12], ARRAY[1,2,5,11,13])
結果:{1,4,7}

0 件のコメント:

コメントを投稿