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

藤澤 qsecofr1 @ hotmail.com
2007年 9月 20日 (木) 16:22:14 JST


こうもとさんへ

藤澤です。
比較データが、1, 2, 3 として受け取ったあと少し加工する、
っていうのはどうでしょうか?

    比較データ ⇒ 比較データA
      1             3
      2             0
      3             1



で、「比較データA」と一致しないものを条件としては?
以下のようになり、少し改善するのではありませんか?

あるいは、動的にSQL文を作れるなら、下記のWHERE条件を
「<>」 ではなく、「< 」か「> 」 を特定できるので、
それもありかと。。。

----------------------------------------------
declare 
    -- 比較データ
    n_hikakuData1  number(1) := 1;
    n_hikakuData2  number(1) := 2;
             <中略>
    n_hikakuData6  number(1) := 3;

    -- 比較データA
    n_hikakuData1_A  number(1) := 1;
    n_hikakuData2_A  number(1) := 2;
             <中略>
    n_hikakuData6_A  number(1) := 3;

    n_cnt  number; 
begin
    ---------------
    -- 初期処理
    ---------------
    IF n_hikakuData1 = 1 THEN
        n_hikakuData1_A := 3:
    ELSIF n_hikakuData1 = 2 THEN
        n_hikakuData1_A := 0:
    ELSE
        n_hikakuData1_A := 1:
    END IF;

    IF n_hikakuData2 = 1 THEN
        n_hikakuData2_A := 3:
    ELSIF n_hikakuData2 = 2 THEN
        n_hikakuData2_A := 0:
    ELSE
        n_hikakuData2_A := 1:
    END IF;

             <中略>

    IF n_hikakuData6 = 1 THEN
        n_hikakuData6_A := 3:
    ELSIF n_hikakuData6 = 2 THEN
        n_hikakuData6_A := 0:
    ELSE
        n_hikakuData6_A := 1:
    END IF;

    ---------------
    -- 主処理 ★★★
    ---------------
    SELECT COUNT(*) INTO n_cnt
    FROM img
    WHERE 
        data1 <> n_hikakuData1_A  AND
        data2 <> n_hikakuData2_A  AND
        data3 <> n_hikakuData3_A  AND
        data4 <> n_hikakuData4_A  AND
        data5 <> n_hikakuData5_A  AND
        data6 <> n_hikakuData6_A;

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(n_cnt) || ' 件');
end;
----------------------------------------------


/藤澤




On Thu, 20 Sep 2007 16:00:00 +0900 (JST)
河本陽一 <komoto.yoichi @ kcc.co.jp> wrote:

> こうもとです。
> 
> 藤澤 さんの書いたこと:
> > 比較データというのは、所与の条件として、外部から与えられる値
> > ですね?
> 
>  そうです。
> 
> 
> > で、ここまでの理解で書くと、(すみません。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 メーリングリストの案内