У меня (и не владею, поэтому я не могу изменить) таблицу с макетом, подобным этому.
ID | CATEGORIES
---------------
1 | c1
2 | c2,c3
3 | c3,c2
4 | c3
5 | c4,c8,c5,c100
Мне нужно вернуть строки, содержащие определенный идентификатор категории. Я начинаю с написания запросов с помощью операторов 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, но не row 4
SELECT id FROM table WHERE categories LIKE '%c3%' or categories LIKE '%c2%';
Снова получим строки 2, 3 и 4
Мне не нравятся все операторы LIKE
. Я нашел FIND_IN_SET()
в документации Oracle, но, похоже, не работает в 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
?