PL/pgSQLで引数からIN句を構築する
PL/pgSQLでSELECT文をラップする時に引数の値でIN句を構築してみます。
IN句って
user_id IN (1, 2, 3)
のような書き方になるので、単純に考えると動的SQLを使わないとできそうにないです。
ここで利用するのが、配列とSOMEです。
呼び方は
複数のIDは文字列でカンマ区切りで渡します。
それをセパレーターで区切って配列にしてから、= SOMEを使うとIN句と同じ動作になってくれます。
ちなみに配列にしただけだとテキストの配列になってしまうので::BIGINT[]で数字の配列にキャストしています。
IN句って
user_id IN (1, 2, 3)
のような書き方になるので、単純に考えると動的SQLを使わないとできそうにないです。
ここで利用するのが、配列とSOMEです。
CREATE OR REPLACE FUNCTION get_user (
p_user_ids TEXT
,p_separator TEXT
) RETURNS SETOF t_user AS $$
BEGIN
RETURN QUERY SELECT
*
FROM
t_user
WHERE
user_id = SOME (regexp_split_to_array(p_user_ids, p_separator)::BIGINT[])
;
END;
$$ LANGUAGE plpgsql;
呼び方は
select * from get_user('1,2', ',');
複数のIDは文字列でカンマ区切りで渡します。
それをセパレーターで区切って配列にしてから、= SOMEを使うとIN句と同じ動作になってくれます。
ちなみに配列にしただけだとテキストの配列になってしまうので::BIGINT[]で数字の配列にキャストしています。