Motif de Correspondance avec Comme Clause
Je suis d'essayer d'utiliser une clause LIKE dans une instruction SQL pour correspondre à un certain modèle dans Oracle.
Je voudrais faire quelque chose en tant que telle:
LIKE '[A-Z][A-Z][1-4]%'
..mais je ne peux pas utiliser une regex parce que c'est sur Oracle9i (regex soutien dans 10g).
Je suis tenter de correspondre à quelque chose qui a deux caractères avant, puis un nombre entre 1 et 4 et que quoi que l'au-delà. J'ai essayé ceci, mais il ne semble pas fonctionner. Le seul moyen que j'ai été en mesure de l'obtenir pour fonctionner est de faire:
WHERE ...
LIKE '%1__' OR
LIKE '%2__' OR
LIKE '%3__' OR
LIKE '%4__'
Je ne suis pas sûr de la façon dont je voudrais faire c'est possible ou de la bonne façon, comme je n'ai jamais essayé avec des motifs à la clause LIKE.
Toute aide que vous pourriez donner serait grandement apprécié.
OriginalL'auteur | 2009-09-30
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Si vous voulez aussi faire correspondre inférieure des lettres, puis appliquer le haut() pour les 2 premières substr():
par exemple. where upper(substr(c1,1,1), ...
Performance
J'ai testé les Performances de la requête avec regexp_like et sans. Comme vous pouvez le voir la requête sans le regexp_like fonction était de 100% plus rapide.
(Note. Les deux requêtes sur fait un soft-parse)
Deuxième Méthode
Obtenir les valeurs ascii de A,Z,1 et 4
Maintenant, vous pouvez écrire votre déclaration beaucoup plus courte
Il suffit de ne OÙ substr(c1,1,1) entre 'A' et 'Z' ... au lieu d'où ascii(substr(c1,1,1)) ENTRE 65 ET 90 .
J'espère que ce n'était pas la mesure de votre test de comparaison. Certaines des économies pourraient venir du fait que vos rangs étaient dans la mémoire de la première requête. Aussi, ne l'ASCII truc travailler avec des jeux de caractères multioctets? Je ne sais pas, demande simplement.
OriginalL'auteur Thomas Aregger
Maladroit, mais peut-être:
peut répondre à vos besoins....
EDIT: Incorporé xlnt suggestion de @Hobo de traduire les sous-chaîne, plutôt que de prendre de la sous-chaîne de la chaîne traduite...
+1. Si <blablabla> est long, vous serait mieux de faire traduire(substr(<blablabla>,1,3), 'ABC...', 'AAA...')? Je suis en supposant que traduire, c'est moins cher sur une chaîne plus courte, et de la durée de la sous-chaîne serait le même dans les deux cas.
Bon point...........
OriginalL'auteur DCookie
Je recommande d'utiliser INSTR:
Le problème avec l'aide d'un joker dans un COMME l'est il n'y a pas de contrôle sur où dans la colonne valeur de la 1/2/3/4/etc va tourner jusqu' - c'est peut-être à la fin.
DCookie est de droite cette réponse n'est pas disposer d'un moyen de manutention si il y a des données numériques dans cet endroit. Mais c'est toujours mieux que de l'aide COMME avec des caractères génériques.
OriginalL'auteur OMG Ponies
Total de wild-card mais suggèrent de toute façon.
Votre 9i installation de Base de données ont le PL/SQL Web Toolkit est installé? La raison de la demande est que l'un de nos clients a souligné qu'il est limité support des expressions régulières à l'aide de l'un des packages fournis qui vient avec elle.
Le package s'appelle owa_pattern et la seule 9i lien que j'ai pu trouver est ce un
Je ne l'ai jamais utilisé et je suis encore à essayer de se familiariser avec les Expressions Régulières ne peut donc pas vous dire s'il pourrait convenir à votre but, mais il pense qu'il peut-être utile.
OriginalL'auteur Ian Carpenter
Si vous voulez vraiment utiliser reg exps vous pouvez développer un java stockées proc et un accompagnement pl/sql wrapper. (Je suppose que le Java de presse pris en charge dans Oracle 9 prend en charge reg exps, je ne suis pas sûr à 100%). Vous pouvez appeler que java stockées proc via le pl/sql wrapper dans votre instruction select.
Mais plus facile et plus rapide:
Une variante de zürigschnäzlets 's solution sans l'utilisation de la ascci fonction.
OriginalL'auteur tuinstoel
Je pense que vous voulez utiliser REGEXP_LIKE au lieu de comme.
OÙ REGEXP_LIKE(fieldName, '[A-Z]{2}[1-4]?.+','i');
Ouais, je voudrais utiliser facilement REGEXP_LIKE, mais comme rexem mentionné, pas de support pré-10g.
Rouler vos propres REGEXP_LIKE, je suppose...
Apparemment je ne peux pas lire...je n'ai pas vu la version Oracle dans le post quand je l'ai lu. Désolé.
La version n'était pas présent lorsque vous avez répondu. Juste être prudent au sujet des réponses quand l'information pertinente n'est pas disponible immédiatement.
OriginalL'auteur CaffGeek