J'ai effectué des recherches dans cette question et trouvé une réponse dans MySQL, mais il s'agit d'un de ces incidents où l'instruction ne parvient pas à se retrouver dans Oracle.
Puis-je utiliser des caractères génériques dans une déclaration MySQL "IN"?
résume assez bien ma question et ce que je voudrais faire, mais dans Oracle
Je voudrais trouver l’équivalent juridique de
Select * from myTable m
where m.status not in ('Done%', 'Finished except%', 'In Progress%')
Merci pour toute aide
Select * from myTable m
where m.status not like 'Done%'
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'
Cela semble correspondre à ce que vous recherchez: https://forums.Oracle.com/forums/thread.jspa?threadID=2140801
Fondamentalement, vous devrez utiliser des expressions régulières, car rien ne semble être intégré à Oracle pour cela.
J'ai extrait l'exemple du fil et l'ai converti pour vos besoins. Je suis nul chez regex, alors ça pourrait être modifié :)
SELECT *
FROM myTable m
WHERE NOT regexp_like(m.status,'((Done^|Finished except^|In Progress^)')
Pas à 100% ce que vous cherchiez, mais une façon de le faire à l'envers
SQL> CREATE TABLE mytable (id NUMBER, status VARCHAR2(50));
Table created.
SQL> INSERT INTO mytable VALUES (1,'Finished except pouring water on witch');
1 row created.
SQL> INSERT INTO mytable VALUES (2,'Finished except clicking Ruby-slipper heels');
1 row created.
SQL> INSERT INTO mytable VALUES (3,'You shall (not?) pass');
1 row created.
SQL> INSERT INTO mytable VALUES (4,'Done');
1 row created.
SQL> INSERT INTO mytable VALUES (5,'Done with it.');
1 row created.
SQL> INSERT INTO mytable VALUES (6,'In Progress');
1 row created.
SQL> INSERT INTO mytable VALUES (7,'In progress, OK?');
1 row created.
SQL> INSERT INTO mytable VALUES (8,'In Progress Check Back In Three Days'' Time');
1 row created.
SQL> SELECT *
2 FROM mytable m
3 WHERE +1 NOT IN (INSTR(m.status,'Done')
4 , INSTR(m.status,'Finished except')
5 , INSTR(m.status,'In Progress'));
ID STATUS
---------- --------------------------------------------------
3 You shall (not?) pass
7 In progress, OK?
SQL>
Un peu compliqué, mais:
Select * from myTable m
join (SELECT a.COLUMN_VALUE || b.COLUMN_VALUE status
FROM (TABLE(Sys.Dbms_Debug_Vc2coll('Done', 'Finished except', 'In Progress'))) a
JOIN (Select '%' COLUMN_VALUE from dual) b on 1=1) params
on params.status like m.status;
C'était une solution à un problème très particulier, mais cela pourrait aider quelqu'un. Essentiellement, il n'y a pas d'instruction "in like" et il n'y avait aucun moyen d'obtenir un index pour les premiers caractères variable_n de la colonne. J'ai donc créé une dynamique "in like" rapide à utiliser dans SSRS.
Le contenu de la liste ('Terminé', 'Terminé sauf', 'En cours') peut être variable.
L'équivalent juridique le plus proche de la syntaxe illégale mentionnée est:
select * from myTable m
where not exists (
select 1
from table(sys.ku$_vcnt('Done', 'Finished except', 'In Progress')) patterns
where m.status like patterns.column_value || '%'
)
Les réponses de mine et @ Sethionic permettent toutes les deux de lister les motifs de manière dynamique (simplement en choisissant une autre source que la table auxiliaire sys.whatever
).
Notez que si nous devions rechercher le modèle inside string (plutôt que depuis le début) et que la base de données contenait par exemple status = 'Done In Progress'
, thenmy solution (modifiée en like '%' || patterns.column_value || '%'
) générerait toujours une ligne pour un enregistrement donné, whileas la solution de @ Sethionic (modifiée en une autre jointure auxiliaire avant a
) produirait plusieurs lignes pour chaque occurrence de motif . Ne pas juger lequel est le mieux, il suffit de connaître les différences et de choisir celle qui correspond le mieux à vos besoins.