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