135 ;1111776698 ;AB555678765 I have the above string and what I am looking for is to retrieve all the digits before the first occurrence of ;.But the number of characters before the first occurrence of ; varies i.e. it may be a 4 digit number or 3 digit number.I have played with regex_instr and instr, but I unable to figure this out.The query should return all the digits before the first occurrence of ;
5 Réponses :
Cette réponse suppose que vous utilisez la base de données Oracle. Je ne connais pas le moyen de faire cela en utilisant Voici le Modèle de regex utilisé: p> regex_instr code> seul, mais nous pouvons faire avec regexp_replace code> à l'aide de groupes de capture: Démo h2> P>
^\s*(\d{3,4})\s*;.*
Utilisation de INSTR, SUTRTSR code> et CORM code> devrait fonctionner (basé sur votre commentaire qu'il existe " juste des espaces blancs et des chiffres em>") select TRIM(SUBSTR(s,1, INSTR(s,';')-1)) FROM t;
L'utilisation suivante en utilisant regexp_substr () code> devrait fonctionner:
Assurez-vous d'essayer toutes les valeurs possibles dans cette première position, même à celles que vous ne vous attendez pas et assurez-vous qu'ils sont manipulés comme vous le souhaitez. Attendez-vous toujours à l'inattendu! Cette regex correspond au premier sous-groupe de chiffres zéro ou plus optionnels (permet de renvoyer un null) lorsqu'il est suivi d'un espace optionnel, puis d'un demi-point, ou de la fin de la ligne. Vous devrez peut-être resserrer (ou desserrer) les règles correspondantes de votre situation, assurez-vous de tester des valeurs incorrectes, en particulier si l'entrée provient des données saisies par l'utilisateur.
with tbl(id, str) as (
select 1, '135 ;1111776698 ;AB555678765' from dual union all
select 2, ' 135 ;1111776698 ;AB555678765' from dual union all
select 3, '135;1111776698 ;AB555678765' from dual union all
select 4, ';1111776698 ;AB555678765' from dual union all
select 5, ';135 ;1111776698 ;AB555678765' from dual union all
select 6, ';;1111776698 ;AB555678765' from dual union all
select 7, 'xx135 ;1111776698 ;AB555678765' from dual union all
select 8, '135;1111776698 ;AB555678765' from dual union all
select 9, '135xx;1111776698 ;AB555678765' from dual
)
select id, regexp_substr(str, '(\d*?)( ?;|$)', 1, 1, NULL, 1) element_1
from tbl
order by id;
ID ELEMENT_1
---------- ------------------------------
1 135
2 135
3 135
4
5
6
7 135
8 135
9
9 rows selected.
Que fait le 6ème paramètre?
Cela indique quel sous-groupe de retourner.
Pour obtenir le résultat souhaité, vous devez utiliser solution à vos exemples de données: strong> Alors, ce que c'est, regex scinde la chaîne sur la base de La syntaxe pour Voici le lien pour plus d'exemples:
https://www.techonthenet.com/oracle/functions/regexp_substr.php p>
laissez-moi savoir si cela fonctionne pour vous. Meilleure chance. P> regex_substr code> car il sera sous-traitant des données souhaitées de la chaîne que vous donnez. Voici l'exemple de la requête. P>
Sélectionnez Regexp_substr ('135; 1111776698; AB555678765', '[^;] +', 1,1) de double; code> p> p>
; code> séparateur. Vous aviez besoin de la première occurrence, donc j'ai donné des arguments comme 1,1 code>.
Donc, si vous avez besoin de la seconde chaîne 1111776698 code> comme sortie, vous pouvez donner un argument comme 1,2 code>. p>
regexp_substr code> est comme suit:
REGEXP_SUBSTR (chaîne, motif [ start_position [ NTH_Pappression [ Match_Parameter [ Sub_Expression]]]]]]]] code> p>
Quelle base de données utilisez-vous? Oracle?
Pourrait-il y avoir quelque chose autre i> que des chiffres avant le premier point-virgule? Je vois des espaces là-bas en ce moment; Pourrait-il y avoir des autres personnages?
Excuses oui oracle et juste des espaces blancs et des chiffres, rien d'autre