Oracle: "grep" через несколько столбцов? - PullRequest
2 голосов
/ 29 января 2010

Я хотел бы выполнить like или regexp для нескольких столбцов. Эти столбцы содержат теги, ключевые слова и т. Д. Что-то, что эквивалентно:

sqlplus scott/tiger @myquery.sql | grep somestring

Прямо сейчас у меня есть что-то вроде

select * from foo where c1 || c2 || c3  like '%somestring%'

но я надеюсь, что смогу получить что-то более общее и / или оптимизированное. Любые подсказки приветствуются!

Ответы [ 5 ]

3 голосов
/ 29 января 2010

Задумывались ли вы об использовании каскадного хранилища данных в Oracle Text?

Oracle Text позволяет создавать полнотекстовые индексы для нескольких столбцов в одной таблице. Или, по крайней мере, есть процесс, с помощью которого вы можете сделать это.

На сайте Oracle, который я использовал ранее, есть хороший пример документа:

http://www.oracle.com/technology/sample_code/products/text/htdocs/concatenated_text_datastore/cdstore_readme.html

Поиски Oracle Text смехотворно быстры. Я думаю, что я бы посмотрел на сохранение отдельных контекстных индексов для каждого отдельного столбца, чтобы вы могли применять релевантность и приоритет для каждого соответствия столбца.

Дайте мне знать, если вам нужен пример, и я добавлю кое-что к ответу.

Надеюсь, это поможет.

3 голосов
/ 29 января 2010

На 11G вы можете создать виртуальный столбец:

alter table foo add all_text varchar2(4000) generated always as (c1 ||','|| c2 ||','|| c3);

(См. Новые возможности Oracle 11G ).

Тогда запрос:

select * from foo where all_text like '%somestring%'

Вы можете добавить индекс для all_text, если он также помогает производительности (см. этот ответ , когда это может помочь, а когда нет).

До 11G вы могли делать то же самое, но с обычным столбцом, поддерживаемым с помощью триггера.

1 голос
/ 19 декабря 2018

Как консультант мне часто приходится искать в плохо документированных базах данных, и мне нужно иметь несколько удобных сценариев для поиска данных. Вот два примера того, как создать предложение select для поиска данных во всех столбцах VARCHAR2 в таблице:

Пример1. Искать часть строки:

SELECT 'SELECT * FROM ' || min(TABLE_NAME) ||' WHERE ' || LISTAGG(COLUMN_NAME, ' like ''%somestring%'' or ') WITHIN GROUP (ORDER BY COLUMN_ID) || ' like ''%somestring%'';' 
from ALL_TAB_COLUMNS
WHERE OWNER = 'YOUR_SCHEMA_NAME' -- Uppercase
AND TABLE_NAME = 'YOUR_TABLE_NAME' --Uppercase
AND DATA_TYPE LIKE 'VARCHAR2';

Пример2. Поиск по всему значению:

SELECT 'SELECT * FROM ' || min(TABLE_NAME) ||' WHERE ''somestring'' in (' || LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY COLUMN_ID) || ');' 
from ALL_TAB_COLUMNS
WHERE OWNER = 'YOUR_SCHEMA_NAME' -- Uppercase
AND TABLE_NAME = 'YOUR_TABLE_NAME' --Uppercase
AND DATA_TYPE LIKE 'VARCHAR2';
0 голосов
/ 29 января 2010
SELECT * FROM table WHERE REGEXP_LIKE(col1, <pattern>)
union
SELECT * FROM table WHERE REGEXP_LIKE(col2, <pattern>)
union
SELECT * FROM table WHERE REGEXP_LIKE(col3, <pattern>)

это должно работать. но я сомневаюсь, что это будет лучше по производительности, чем ваш запрос. Вы могли бы хотеть сравнить действия обоих. очень хотел бы услышать от вас о ваших выводах. : -)

0 голосов
/ 29 января 2010

regexp_like помогает.

http://www.psoug.org/reference/regexp.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...