Oracle APEXで複数の値を指定して検索する方法（WHERE 項目名 in 値 の実装方法）

ローコード開発プラットフォームとして提供されているOracle Apex（Oracle Application Express）。
使い慣れると、とても便利なツールです。

この記事では、APEXを使ってテーブルのある項目の値を複数選択して表示する機能について、実装方法を解説します。
イメージとしては、SQLのWHERE句に『__where xxx項目 in ('AAA','BBB')__』と条件指定するケースです。
これをAPEXで実装する方法を解説します。

説明を飛ばすのであれば、こちらの[**リンク**](https://qiita.com/kfe22/private/d6c89ad80af3e1df3f9f#対応方法)から対応方法に移動して下さい。

### ◆テーブルサンプル
今回のサンプルで、APEXが参照するテーブルとそのデータは以下の構成です。
[テーブル]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/cf06ebf2-8d91-9da0-7e94-ef3a30487057.png)

[データ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/f1ff3891-5c44-291d-9504-3b9a42077c4f.png)

[使用したAEPXのバージョン]
Oracle APEX 22.1.2
（これより以前のバージョンでも同じ方法で対応できました。）

# ◆APEX－デザイナ画面とWeb画面
APEXにおいて、複数項目を選択できるようにするには、デザイナ画面で次のアイテムのいずれかを実装します。
> ○ チェック・ボックス・グループ
> ○ リスト・マネージャ

それぞれの設定で作成されるWeb画面は以下のようになります。
##### ○ チェック・ボックス・グループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/2da8b23b-bff7-cc86-d20a-90da34fe7b4a.png)

##### ○ リスト・マネージャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/bdeb0fb5-ef6c-b5ea-637a-0d62c897ea55.png)

どのデザインにするかは、作成時に検討してください。
以降は、デザインによる設定差異はないため、「チェック・ボックス・グループ」のデザインで記載します。




## ◆APEX－デザイナ画面で設定するSQL
前述でデザイナ画面に設定したアイテムを、データ表示に使用できるようにしていきます。
ここでは、「対話モード・レポート」形式で、テーブルの値を表示する方法で考えていきます。

「対話モード・レポート」で値を表示するには、[ソース]の部分でテーブル名を指定することで実装出来ます。
＞デザイナ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/0dffd4c1-424f-150f-769d-7fe05117a8b4.png)

デザイナ画面で設定することで、Web画面で表示される結果は、以下のようになります。
＞Web画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/dc72522a-aa11-d122-927f-a3900c0834d1.png)


それでは、「チェック・ボックス・グループ」を設定したアイテムを検索で使用するように設定していきます。
設定は、デザイナ画面の[ソース]の部分の、「WHERE句」に検索条件を記載することで、アイテムを参照した検索を実装出来ます。
試しに、通常のSQLを記述するように記述してみます。
＞デザイナ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/afd2cd0b-831c-19db-ac78-7c7b0805d262.png)
（:P4_LISTは、このサンプル画面作成でチェック・ボックス・グループを設定したアイテムの名称です）

＞Web画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/0b705dbf-871b-5936-5018-f86f8aa90770.png)
→初期表示の画面では、すべてのメンバにチェックが入っていないため、何も表示されません。

では、検索対象をチェックしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/72196cac-277f-e893-158b-d444c48876f3.png)
→1項目だけチェックを入れて検索すると、チェックを入れたデータだけ表示されます。

次に、複数メンバを検索対象にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/8343f44e-e3ae-aa9c-2a09-95ba317a790d.png)
→何も表示されません。**失敗**です。


１つのメンバだけを対象にすると表示されますが、複数のメンバをチェックすると表示されない動作になりました。

原因を探るため、WHERE句で指定しているアイテムの結果を表示させてみます。
[デザイナ画面で設定]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/9ae05ef1-97a3-6470-a5fa-090ec01df4c0.png)
→アイテム[P4_NEW]を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/f3a9503a-6851-c12a-8e46-f638013dd5e2.png)
→[ソース設定]で、チェック・ボックス・グループを設定したアイテムの[P4_LIST]を参照する設定をする

↓
検索結果画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/a74d1f5f-01e8-31db-87e6-0146e18195af.png)

アイテムを表示すると分かりますが、選択した値が[:]で繋がっています。

SQL文でinを使用する場合[,]で区切ります。区切りが異なるため1つの値としてSQLが動いているようです。


## ◆対応方法
このように[:]で繋がったアイテムをSQLで記載する方法として容易な方法は、
「WHERE句で**instr関数**を使用する」方法です。

SQLの実装としては、
`instr(':'||:P4_LIST||':',':'||ARIANM||':') > 0`
となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/949c8796-0e21-7132-9e8c-ca62ff382e96.png)


構文としては
`instr(':'||アイテム名||':',':'||検索列名||':') > 0`
です。

検索結果は、下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/dce1b1ef-cf13-5b7e-c6f8-69f13c1daf11.png)
→1つ選択でも表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2750654/1305dc2e-7adb-954e-07b9-ec79e31b9da8.png)
→複数選択でも表示されます。



### ◆最後に
細かいことを言えば、「チェック・ボックス・グループ」の設定方法なども記載したいですが、
今回は、『WHERE 項目名 in 値 の実装』に焦点を絞って記載することにし、省略させて頂きました。
機会があれば、別途記載しようかと思います。

尚、表示される値に対して検索するのであれば、デフォルトで表示される検索フィールドを利用する方法が最も手軽です。諸事象で検索フィールドを使用しない場合に参考にして下さい。