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?
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
.
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%'
);
En utilisant la fonction intégrée instr, vous pouvez faire comme ceci:
Select * from Test where instr(col1||col2||col3,'ABC') <> 0;