[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 メーリングリストの案内