2010-01-29 9 views
2

Je voudrais effectuer un like ou regexp sur plusieurs colonnes. Ces colonnes contiennent des balises, des mots-clés, etc. Quelque chose qui est l'équivalent de:Oracle: "grep" sur plusieurs colonnes?

sqlplus scott/tiger @myquery.sql | grep somestring 

En ce moment j'ai quelque chose comme

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

mais j'espère que je peux obtenir quelque chose d'un peu plus polyvalent et/ou optimisé. Des indices appréciés!

Répondre

3

Avez-vous envisagé d'utiliser la fonctionnalité Concatenated Datastore d'Oracle Text? Oracle Text vous permet de créer des index de texte intégral sur plusieurs colonnes dans la même table. Ou au moins il existe un processus par lequel vous pouvez le faire.

Il y a un bon exemple de document sur le site Oracle Je l'ai utilisé avant:

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

Oracle Text recherches sont ridiculement rapide. Je pense que je chercherais à garder des index de contexte séparés sur chaque colonne afin que vous puissiez appliquer la pertinence et la priorité à chaque correspondance de colonne. Faites-moi savoir si vous voulez un exemple et j'ajouterai quelque chose à la réponse.

Espérons que cela aide.

3

Sur 11G, vous pouvez créer une colonne virtuelle:

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

(Voir Oracle 11G new features).

Puis requête:

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

Vous pouvez ajouter un index sur all_text si elle aide les performances trop (voir this answer quand cela pourrait aider et quand ne pas).

Avant 11G, vous pouviez faire la même chose mais avec une colonne normale, maintenue par un trigger.

0
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>) 

cela devrait fonctionner. mais je doute que ce serait mieux dans la performance que votre requête. vous pourriez vouloir comparer les performances des deux. J'adorerais avoir de vos nouvelles sur vos découvertes. :-)

Questions connexes