PostgreSQL では、WHERE 句に、正規表現が使えるので、いつも重宝している。
こんな感じ。
- 使用前:
select * from some_table where some_field = 1 or some_field = 4 or ... ;
- 使用後:
select * from some_table where some_field ~ '^(1|4|...)$';
ANY(some_array) をカマせば、これができるだろうと期待していた。
いろいろ試したが、どうも無理っぽい[マニュアルより ANY/SOME(array)]。
そういう目的では、
配列型ではなく TEXT 型とかに配列表現を突っ込むのが良いだろう。
とりあえず TEXT 型で用意しておいて、記法は充分検討してゆっくり決めれば良い。
例えば、PHP の serialize(); の場合、数値配列は、
a:2:{i:0;i:123;i:1;i:456;}
という感じで、キーと値とが交互に表れるが、このキーと値との選り分けを正規表現なんかでやってられない。
そうなると独自記法がベストな気がしてきた( JSON とか XML とかも無意味に面倒)。
正規表現のメタキャラクタとして解釈されなくて、
尚且つ、データに使われなさそうな文字列を、セパレータにすれば良い。
クォーテーションの扱いにも注意。
以下、例:
create table fruit
(
fruit_id serial,
name text
);
create table member
(
member_id serial,
name text,
gender text,
fruit text
);
insert into fruit(name) values('りんご');
insert into fruit(name) values('みかん');
insert into fruit(name) values('いちご');
insert into fruit(fruit_id,name) values(12,'いちじく');
insert into
member(name,gender,fruit)
values('太郎','男',':::::1:::::3:::::');
insert into
member(name,gender,fruit)
values('花子','女',':::::2:::::3:::::');
insert into
member(name,gender,fruit)
values('次郎','男',':::::12:::::');
select * from member,fruit
where member.fruit ~ (select ':{5}'||fruit.fruit_id||':{5}')
order by member_id;
member_id | name | gender | fruit | fruit_id | name
-----------+------+--------+-------------------+----------+----------
1 | 太郎 | 男 | :::::1:::::3::::: | 1 | りんご
1 | 太郎 | 男 | :::::1:::::3::::: | 3 | いちご
2 | 花子 | 女 | :::::2:::::3::::: | 2 | みかん
2 | 花子 | 女 | :::::2:::::3::::: | 3 | いちご
3 | 次郎 | 男 | :::::12::::: | 12 | いちじく
(5 rows)
Time: 1.069 ms
select * from member
where fruit ~ ':{5}(2|3):{5}'
order by member_id;
member_id | name | gender | fruit
-----------+------+--------+-------------------
1 | 太郎 | 男 | :::::1:::::3:::::
2 | 花子 | 女 | :::::2:::::3:::::
(2 rows)
Time: 0.557 ms
