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

ISH 井野 ino_hirotaka @ ishp.co.jp
2012年 7月 10日 (火) 17:25:22 JST


井野です。

分解してみると確かに、目的の意図とは違ってました。

目的とするのは、
where
   (A >= 300 and A <= 300)
or (B >= 300 and B <= 300)
or (C >= 300 and C <= 300)
です。

ANYで表現できればシンプルになりそうだったので。


2012年7月10日 15:55 Tomoaki Sato <sato @ sraoss.co.jp>:
> 佐藤です。
>
>> 井野と申します。
>>
>> SQLでの問い合わせについてお伺いしたいことがあります。
>>
>> ※PostgreSQL 9.0.0
>> select * from (
>> select 100 as A ,200 AS B, 300 AS C  -- (1)
>> union all
>> select 201 as A ,301 AS B, 401 AS C  -- (2)
>> ) t
>> where 300 >= any(array[A,B,C])
>>   and 300 <= any(array[A,B,C])
>>
>> 上記問い合わせで取得される結果は、(1)のみを期待したのですが、(2)も対
>> 象となってしまいます。anyについては不等号は使用できないのでしょうか?
>
> ANY は配列の各要素に演算子を適用して 1 つでも真であれば結果が真になり
> ます。OR を使用して書き換えると以下のようになります。
>
>   WHERE (300 >= a OR 300 >= b OR 300 >= c)
>     AND (300 <= a OR 300 <= b OR 300 <= c)
>
> 従って、二行取得されるのは正しく、不等号も使用できています。
>
> (1) のみが取得される条件が思いつかないのですが、どういった条件で取得し
> ようとしているのでしょうか。
>
> すべてが真の場合に結果を真にしたいなら ALL がありますが、ALL では一行
> も取得できないので違うかな。


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