#sql #oracle
#sql #Oracle
Вопрос:
Я создал таблицу с двумя столбцами.Я вставил две строки.
id name
1 narsi reddy
2 narei sia
один — это просто числовой тип, а другой — тип CLOB.Поэтому я решил использовать индексацию для этого. Я запросил это с помощью contains.
запрос:
select * from emp where contains(name,'%a%e%')>0
2 narei sia
Я ожидал, что придет 2, но нет. Но если я даю то же самое с помощью like, это дает то, что я хотел.
запрос:
select * from emp where name like '%a%e%'
ID NAME
1 (CLOB) narsi reddy
2 (CLOB) narei sia
2 rows selected
наконец, я понял, что like выполняет поиск по всему документу или абзацу, а contains ищет по словам.
итак, как я могу получить требуемый вывод?
Ответ №1:
LIKE и CONTAINS — это принципиально разные методы поиска.
LIKE — это очень простой механизм сопоставления шаблонов строк — он распознает два подстановочных знака (%) и (_), которые соответствуют нулю или более, или ровно одному символу соответственно. В вашем случае %a%e% сопоставляет две записи в вашей таблице — он ищет ноль или более символов, за которыми следует a
, за которыми следует ноль или более символов, за которыми следует e
, за которыми следует ноль или более символов. , За которыми следует ноль или более символов. Это также очень упрощенное возвращаемое значение: оно либо возвращает «соответствует», либо «не соответствует» — никаких оттенков серого.
CONTAINS — это мощный инструмент поиска, который использует контекстный индекс, который строит своего рода дерево слов, в котором можно выполнять поиск с использованием синтаксиса поиска CONTAINS. Он может использоваться для поиска одного слова, комбинации слов и имеет собственный богатый синтаксис, такой как логические операторы (И, РЯДОМ, ACCUM). Он также более эффективен в том смысле, что вместо простого «соответствует» или «не соответствует» он возвращает «оценку», которую можно использовать для ранжирования результатов в порядке релевантности; например, CONTAINS(col, ‘dog NEAR cat’) вернет более высокую оценку для документа, где эти два слова находятся близко друг к другу.
Комментарии:
1. Это означает, что contains не может выполнять поиск как
LIKE
делают . Предположим, у меня есть строкаperson name is himans
. Если я выполню поиск поcontains
forers
, я получу пустое значение?2. Если вы просто хотите определить
ers
в строке, используйтеlike
илиinstr
.
Ответ №2:
Я полагаю, что ваш CONTAINS
запрос соответствует ‘narei sia’, потому что шаблон ‘%a%e%’ соответствует слову ‘narei’. Это не совпадает с ‘narsi reddy’, потому что ни одно слово, взятое по отдельности, не соответствует шаблону.
Я предполагаю, что вы хотите использовать CONTAINS
вместо LIKE
из соображений производительности. Я ни в коем случае не эксперт по CONTAINS
выражениям запросов, но я не вижу простого способа выполнить точный поиск, который вы хотите, поскольку вы ищете буквы, которые могут быть в одном слове или в разных словах, но должны встречаться в заданном порядке. Я думаю, что лучше всего использовать комбинацию двух методов:
WHERE CONTAINS(name,'%a% AND %e%') > 0
AND name LIKE '%a%e%'
Я думаю, это позволило бы использовать текстовый индекс для поиска возможных совпадений (все, что содержит хотя бы одно слово, содержащее ‘a’, и хотя бы одно слово, содержащее ‘e’). Затем они будут отфильтрованы по LIKE
условию, обеспечивающему выполнение требования, чтобы ‘a’ предшествовало ‘e’ в строке.