質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

5回答

13022閲覧

SQLで、IN句の条件を文字列でテーブルに格納しておき、検索に使用することはできるでしょうか

hos

総合スコア33

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/06/22 04:11

SQLで、IN句の条件を文字列でテーブルに格納しておき、検索に使用することはできるでしょうか。
できるのであればやり方を教えてください。

下記のようなmasterテーブルを使用して

condition_idcondition
aaa'hoge', 'fuga'

下記のような検索を行いたいです。

SQL

1SELECT * FROM table WHERE row in (SELECT condition FROM master WHERE condition_id = 'aaa');

SQL Server 2012 を使用するので方言でもかまいません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

やるならこうじゃないでしょうか。

condition_idcondition
aaahoge
aaafuga

'hoge'とシングルクォーテーションで囲ってしまうと、シングルクォーテーションも検索文字の一つとみなされてしまうので、囲わないように定義します。
どうしても文字列の羅列で定義したいというと、SQL Serverだとちょっと厳しいかもしれません。
PostgreSQLならregexp_split_to_tableなんかで文字列を分割できるんですけどね。

投稿2017/06/22 04:32

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hos

2017/06/22 04:54

ありがとうございます。マスタをメンテナンスする人の問題で縦持ちにしたくなかったのでこの質問になりました。
guest

0

ベストアンサー

IN 区の右項は値でなくリテラルですので、RDBMS 特有の eval 相当の物を使わないと出来ないと思います。代わりといっては何ですが

sql

1SELECT 2 * 3FROM 4 tbl 5WHERE 6 ( 7 SELECT 8 ',' || condition || ',' 9 FROM 10 master 11 WHERE 12 condition_id = 'aaa' 13 ) like '%,''' || row || ''',%';

これで行けると思います。

説明すると 'hoge','fuga' から一つのアイテムが row と同じかどうかを確認する際に

  • クオートされている
  • 区切りが , である

という所を考慮して row の前後に ,'', を付け、かつ condition の前後にも , を付けて like で検索しました。like なので row の中に % があるとうまく機能しませんのでその場合は %% といった風に2重打ちするなどの対策をして下さい。または RDBMS 専用の文字列検索関数を使って下さい。

投稿2017/06/22 04:26

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hos

2017/06/22 04:56

ありがとうございます。考え方はわかりました。ちょっと面白いですね。この形でいくか、専用の関数を作成して使用するかになると思います。 とても参考になりました。
mattn

2017/06/22 04:59

in 句で出来ない事は見えているので、2行に出来ないならクオートも取ってしまうのが良いと思います。その方が楽そうなので。
hos

2017/06/22 05:05

ありがとうございます。そうですね。質問の説明としては文字列として使用したいのでクオートをつけましたがなくていいですね。 ファンクションにするかこの方法にするかになると思います。ありがとうございます。
guest

0

mattnさんのやり方か、もしくはテーブルを返す関数を作成することになると思います。

投稿2017/06/22 05:06

hos

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(かってに補足)
こういっては元も子もないが、ストアド(プロシージャorファンクション)組んで内部で動的SQLを生成すれば大概のことはできる。どうしてもDB問い合わせ1回で複雑な抽出を行いたいのであったら一つの選択肢ではある。
もっとも他の方が書いているように検索条件を正規化した形で持つのが正攻法だと思います。
性能・保守性とも期待できるので(in->existsの置き換えも可能)。

投稿2017/06/22 04:55

kurokoba

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hos

2017/06/22 05:02

そうなんです。マスタを正規化するのが本筋なのですが、メンテをする人の関係で正規化せずに使いたいのです(マスタの形が先にきている)。 たぶん簡単なファンクションを組むと思います。
guest

0

マスターの入れ方を以下のようにはできないですか?

condition_idcondition
aaahoge
aaafuga

そうすれば、提示いただいているSQLで行けそうに思えますが

投稿2017/06/22 04:25

tsh-nnb

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hos

2017/06/22 04:54

ありがとうございます。マスタをメンテナンスする人の問題で縦持ちにしたくなかったのでこの質問になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問