2012年7月10日

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

佐藤です。

> 花田です。
>
> (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@xxxxx>
SRA OSS, Inc. Japan


投稿者 xml-rpc : 2012年7月10日 21:00
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/110061
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。