[pgsql-jp: 38775] Re: 3種類の値を持つ6つの項目の検索方法

河本陽一 komoto.yoichi @ kcc.co.jp
2007年 9月 20日 (木) 15:44:01 JST


こうもとです。

藤澤 さんの書いたこと:
> 比較データというのは、所与の条件として、外部から与えられる値
> ですね?

 そうです。


> で、ここまでの理解で書くと、(すみません。Oracle の PL/SQLです。)
> 以下になります。
> ----------------------------------------------
> declare 
>     n_hikakuData number(1) := 1;
>     n_cnt  number; 
> begin
>     SELECT COUNT(*) INTO n_cnt 
>     FROM img 
>     WHERE 
>         (n_hikakuData = 1 AND data1 IN (1, 2))  OR
>         (n_hikakuData = 2 )                     OR
>         (n_hikakuData = 3 AND data1 IN (2, 3));
>     
>     DBMS_OUTPUT.PUT_LINE(TO_CHAR(n_cnt) || ' 件');
> end;
> ----------------------------------------------

 data1の比較条件としては合っています。
 これを、data1〜data6の全てでチェックします。
 上記のプロシージャ(?)だと以下のようになるかと思います。

----------------------------------------------
declare 
    n_hikakuData number1(1) := 1;
    n_hikakuData number2(1) := 2;
             <中略>
    n_hikakuData number6(1) := 3;
    n_cnt  number; 
begin
    SELECT COUNT(*) INTO n_cnt
    FROM img
     WHERE
       ((n_hikakuData1 = 1 AND data1 IN (1, 2))  OR
        (n_hikakuData1 = 2 )                     OR
        (n_hikakuData1 = 3 AND data1 IN (2, 3))) AND
       ((n_hikakuData2 = 1 AND data2 IN (1, 2))  OR
        (n_hikakuData2 = 2 )                     OR
        (n_hikakuData2 = 3 AND data2 IN (2, 3))) AND
                       <中略>
       ((n_hikakuData6 = 1 AND data6 IN (1, 2))  OR
        (n_hikakuData6 = 2 )                     OR
        (n_hikakuData6 = 3 AND data6 IN (2, 3)));
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(n_cnt) || ' 件');
end;
----------------------------------------------


> でも、ちょっとずれてますよね、これ?
> 条件を、別の言い方で教えてもらえませんか?

 ちょっとややこしい条件なのでわかりにくかったです。

 取得条件に使用するデータは、レコードごとに複数(今回の例では6個)あ
り、全ての取得条件にマッチするものだけを取得します。

 比較時の単一項目でのマッチ条件は、
・取り出し条件が1のときは、対象データは1と2
・取り出し条件が2のときは、対象データは1と2と3
・取り出し条件が3のときは、対象データは2と3
 となります。
 別の言い方だと、
・取り出し条件が1のときは、対象データは3以外
・取り出し条件が2のときは、対象データは全て
・取り出し条件が3のときは、対象データは1以外
 となります。

 項目が二つの場合をマトリックスにすると、以下のようになります。

     | 11 | 12 | 13 | 21 | 22 | 23 | 31 | 32 | 33 
 ----+----+----+----+----+----+----+----+----+----
  11 | ○ | ○ | × | ○ | ○ | × | × | × | × 
  12 | ○ | ○ | ○ | ○ | ○ | ○ | × | × | × 
  13 | × | ○ | ○ | × | ○ | ○ | × | × | × 
  21 | ○ | ○ | × | ○ | ○ | × | ○ | ○ | × 
  22 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ 
  23 | × | ○ | ○ | × | ○ | ○ | × | ○ | ○ 
  31 | × | × | × | ○ | ○ | × | ○ | ○ | × 
  32 | × | × | × | ○ | ○ | ○ | ○ | ○ | ○ 
  33 | × | × | × | × | ○ | ○ | × | ○ | ○ 


 あと、最初のメール([pgsql-jp: 38773])の検索例は、取り出したい条件
は同じです。datah,datalと、data1〜data6には、同じ意味のデータが入っ
ています。

======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp




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