web-dev-qa-db-fra.com

Rechercher des lignes où n'importe quelle colonne correspond à un modèle de recherche

J'ai une table "Test" avec 15 colonnes différentes de types de données différents.

Je recherche des lignes contenant des caractères comme "ABC". Mais "ABC" peut être présent dans n'importe quelle colonne et je veux trouver des enregistrements entiers ayant "ABC".

Je ne peux pas restreindre la ligne à l'aide d'une clause WHERE, car je n'ai vraiment aucune idée de la colonne dans laquelle se trouve le ABC? Y a-t-il un moyen de faire cela?

7
Sagar Makhesana

Eh bien, il y a le moyen simple et "brutal":

SELECT *
FROM   "Test"
WHERE (col1 LIKE '%ABC%' OR
       col2 LIKE '%ABC%' OR
       col3 LIKE '%ABC%' OR
       ...
       col15 LIKE '%ABC%');

Les parenthèses ne seront pas nécessaires si vous n'avez pas d'expressions WHERE supplémentaires. Probablement plus rapide (et plus robuste dans tous les cas) que la concaténation de toutes les colonnes pour un seul test LIKE.

5
Erwin Brandstetter

Dans Oracle 11g, vous pouvez utiliser UNPIVOT

select *
from test unpivot (any_column for source_column in (col1, col2, col3, ...))
where any_column like '%ABC%';

Notez que si une ligne contient ABC dans plusieurs colonnes, cette requête les renvoie toutes. Si vous avez besoin des lignes d'origine, utilisez une sous-requête

select *
from test
where id in (
  select id
  from test unpivot (any_column for source_column in (col1, col2, col3, ...))
  where any_column like '%ABC%'
);
2
sjk

En utilisant la fonction intégrée instr, vous pouvez faire comme ceci:

Select * from Test where instr(col1||col2||col3,'ABC') <> 0;
1
Nicolas Durand