[pgsql-jp: 41145] Re: ANYを使用した問い合わせについて

Tomoaki Sato sato @ sraoss.co.jp
2012年 7月 10日 (火) 21:00:28 JST


佐藤です。

> 花田です。
> 
> (2012/07/10 17:25), ISH 井野 wrote:
>> 目的とするのは、
>> where
>>     (A >= 300 and A <= 300)
>> or (B >= 300 and B <= 300)
>> or (C >= 300 and C <= 300)
>> です。
> 
> この条件だと、結果として
> 
>     where A = 300 or B = 300 or C = 300
> 
> となると思いますが、意図通りでしょうか?300をそれぞれ二回ずつ使っている
> のが少し気になりますが…。もしこれでよいのであれば
> 
>     where 300 = ANY(array[A, B, C])
> 
> と書けるので、
> 
>> ANYで表現できればシンプルになりそうだったので。
> 
> は達成できそうですね。

ちなみに、1 つ目と 2 つ目の 300 が必ずしも同じでない場合には、現在開発
中の 9.2 では範囲型を使って以下のように書くこともできます。

  WHERE int4range(300, 300 + 1) @> ANY(ARRAY[a,b,c])

int4range は integer 型の範囲を表すデータ型で、上記の場合には 300 以上、
300 + 1 未満の整数の範囲になります。@> は範囲に値が含まれているかどう
かを返す演算子です。

ただ、上記では各列にインデックスを張っただけではインデックスを使えない
ので、少し長くなってしまっても以下のように書いたほうがインデックスも使
えて分かりやすいと思います。

  WHERE a BETWEEN 300 AND 300
    OR b BETWEEN 300 AND 300
    OR c BETWEEN 300 AND 300


----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


pgsql-jp メーリングリストの案内