これに似たレイアウトのテーブルがあります (所有していないため、変更できません)。
ID | CATEGORIES
---------------
1 | c1
2 | c2,c3
3 | c3,c2
4 | c3
5 | c4,c8,c5,c100
特定のカテゴリ ID を含む行を返す必要があります。値は文字列のどこにでもある可能性があるため、LIKE ステートメントを使用してクエリを作成することから始めます。
SELECT id FROM table WHERE categories LIKE '%c2%';
行 2 と 3 を返します
SELECT id FROM table WHERE categories LIKE '%c3%' and categories LIKE '%c2%';
行 2 と 3 は取得できますが、行 4 は取得できません
SELECT id FROM table WHERE categories LIKE '%c3%' or categories LIKE '%c2%';
再び行 2、3、および 4 を取得します
LIKE
私はすべてのステートメントが好きではありません。Oracle のドキュメントで見つけましFIND_IN_SET()
たが、10g では動作しないようです。次のエラーが表示されます。
ORA-00904: "FIND_IN_SET": invalid identifier
00904. 00000 - "%s: invalid identifier"
このクエリを実行する場合: SELECT id FROM table WHERE FIND_IN_SET('c2', categories);
(ドキュメントの例) またはこのクエリ: SELECT id FROM table WHERE FIND_IN_SET('c2', categories) <> 0;
(Google の例)
行 2 と 3 が返されることを期待します。
LIKE
大量のステートメントを使用する代わりに、これらのクエリを作成するより良い方法はありますか?