回答編集履歴

1 誤字脱字の修正

Panzer_vor

Panzer_vor score 1616

2016/12/23 16:33  投稿

とうの昔にクローズしているQAですが、どうしてもDB側の世界で解決することを強いられた場合のご参考に回答しておきます。
とはいっても今回のようなケースは、
どちらかというとレアケースと考えていますが。
#MySQL系以外の主要なDBMSの場合
例えばOracle、SQL Server、PostgreSQLでは**ユーザ定義関数(以下UDFと書きます)の戻り値でテーブル型を返却**できます。
厳密にいうと**Oracleはユーザ独自定義したTYPE型の返却**なので、返却するテーブル型と同構造のTYPE型を作成して戻り値に指定する必要があります。
少し横にそれましたが、
それを用いるとFROM句に関数を記載でき、さもテーブルのように扱えるのです。
それがどうしたの?、
となるかもしれませんが、
これができるということは**JOINも当然できますよね**というお話になる訳です。
これが可能になると、IN句に与えるカンマ区切りパラメータを引数に与えて、
IN句に与えるカンマ区切りパラメータを引数に与えて、
その条件をテーブル型として返却するUDFを作れば以下のようなことができちゃう訳です。
```SQL
SELECT
   a.*
FROM
   accounts a
   -- INNER JOIN TABLE(make_cond_tbl('1, 1, 2')) c ← Oracle風
   INNER JOIN make_cond_tbl('1, 1, 2') c
     ON a.id = c.cond
```
作成したUDFがすなおに3行検索値テーブルを返しさえすれば、
作成したUDFが素直に3行検索値を返しさえすれば、
恐らく要望通りの動作をしてくれるなどはないでしょうか。
#MySQLの場合
恐らくMariaDBもそうなんだろうなと踏んでいますが、
残念なことに今の所はUDFでテーブル型を戻す手段はないようです。
(調べた限り、`STRING|INTEGER|REAL|DECIMAL`系の戻り値しか不可のようです。)
では上記のようなアプローチは不可能か、
というと不可能ではなく回りくどい方法になりますが**ストアドプロシージャ(PROCEDURE)を用いると似たようなことは可能**なようです。
英語ですが、[こちら](http://stackoverflow.com/questions/30558921/mysql-using-the-result-of-a-stored-procedure-in-an-inner-join)が参考になるでしょう。
今回のQAでいくと以下のようなイメージでしょうか。
```SQL
CALL make_cond_tbl('1, 1, 2');
SELECT
   a.*
FROM
   accounts a
   INNER JOIN cond_tbl c
     ON a.id = c.cond
```
ただし上記の手法をとると、
**検索条件を実際に格納するテーブルが必要**となるのでご注意ください。
---
恐らく課題はとっくの昔に解決してるとはずなので、
こういったアプローチもあるよ、というご参考程度に。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る