сопоставление оракула sql

У меня вопрос по sql. Я использую jDeveloper и Oracle SQL Developer.

Я хочу сделать поиск нечувствительным к регистру, и я написал так:

        String word = jTextField5.getText();
        ResultSet rs = statement.executeQuery("SELECT NAMES, AUTHOR, ID FROM BOOKS WHERE NAMES LIKE '%"+word+"%' OR AUTHOR LIKE '%"+word+"%' COLLATE Latin1_General_CS_AS ");

но я получил ошибку: java.sql.SQLException: ORA-00933: команда SQL не закончилась должным образом

что я должен сделать, чтобы решить эту проблему. Кстати, я новичок в SQL.


person newbie    schedule 12.11.2012    source источник


Ответы (3)


COLLATE Latin1_General_CS_AS это не синтаксис оракула, это похоже на сервер sql

ваш базовый sql может быть:

ResultSet rs = statement.executeQuery("SELECT NAMES, AUTHOR, ID FROM BOOKS WHERE upper(NAMES) LIKE upper('%"+word+"%') OR upper(AUTHOR) LIKE upper('%"+word+"%') ");

но это полное сканирование таблицы/полного индекса, поэтому оно не будет быстрым. для быстрого поиска строк в Oracle есть текст оракула . я бы посоветовал вам прочитать это и реализовать текстовый индекс, если вам нужно выполнять неограниченный поиск такого типа (в больших таблицах).

person DazzaL    schedule 12.11.2012

Другим вариантом может быть переключение вашего сеанса на использование сравнения лингвистических символов:

ALTER SESSION SET nls_comp = Linguistic;
ALTER SESSION SET nls_sort = XGerman_CI;

SELECT NAMES, AUTHOR, ID 
FROM BOOKS 
WHERE NAMES LIKE '%foo%' 
  OR AUTHOR LIKE '%bar%'

Это немного сложнее, чем «просто» делать ПРОПИСЬ для значений, поскольку при этом учитываются правила языка (например, в немецком языке ß эквивалентно ss).

Он будет использовать полное сканирование таблицы так же, как решение с использованием UPPER, но это из-за % в начале значения поиска, а не из-за настройки NLS (или применения функции upper. Оба выражения могут поддерживаться индексом. В отличие от PostgreSQL, Oracle никогда не может использовать индекс для условия %foo%, только для foo%.

Список доступных значений NLS_SORT см. здесь

Подробное объяснение того, как работает лингвистический поиск и сортировка, см. здесь

person a_horse_with_no_name    schedule 12.11.2012

Тебе нужно:

ГДЕ ИМЕНА СОРТИРОВАТЬ Latin1_General_CS_AS LIKE '%"+word+"'% ИЛИ АВТОР СОРТИРОВАТЬ Latin1_General_CS_AS LIKE '%"+word+"%' и т. д....

person HackyStack    schedule 12.11.2012