0
votes

Oracle PL SQL String Fonctions

J'ai une colonne qui a des valeurs ou des lignes comme combinaison de nom et de code comme indiqué ci-dessous.

data_current p> xxx pré>

et je veux obtenir le nom et le code Différentes colonnes, mais le séparateur '_' et son occurrence (comptage et position) n'est pas la même dans chaque rangée ou toutes les valeurs ci-dessus. p>

Comment lire la chaîne à droite et extraire le nom et l'extraction du nom et de l'extraction du nom ci-dessous p>

Résultat requis P>

Name                                    Code
---------------------------------------------
Saint_Peter_King_Jr                      0001
Kishore_Prasad_Misra                     1253
George_Floyd                            21543
Veer_Venkata_Sai_Narsimha_Kishore       00015


1 commentaires

Bien sûr, la difficulté serait complètement éliminée si vous deviez réparer votre modèle de données gravement imparfait. "Nom" et "Code" doivent être deux colonnes distinctes. Votre conception actuelle enfreint la troisième conception de forme normale, ce qui est le cœur de la conception de données relationnelle.


3 Réponses :


1
votes

Sous SQL utilise des fonctions intégrées Oracle Instr et SUBSTR et suppose que le" Code "est toujours la dernière partie de la chaîne et est toujours précédée d'un seul, un soulignement caractère, c'est-à-dire _ xxx

résultat est ... xxx

Notez que vous pouvez remplacer le nom de la colonne , Ie colonne_x pour le littéral à chaîne.


1 commentaires

Salut Abra, merveilleux et merci une tonne. Ça a marché. -1 après que le séparateur ait fonctionné parfaitement. Sans -1, il lit de gauche mais avec -1, il lit de droite. génial.



-1
votes

Vous ne pouvez pas faire cela avec des fonctions intégrées. Vous allez devoir écrire votre propre fonction pour l'affronter de procédure.


0 commentaires

1
votes

la méthode REGEXP_SUBSTR. La déclaration avec la déclaration définit simplement les données, la viande est dans la sélection. Les expressions régulières gèrent ce que vous entendez par dynamique, c'est-à-dire un nombre inconnu de caractères du code et / ou un nombre inconnu de nombres dans le code. La parenthèse dans l'expression régulière définit un groupe capturé, qui est renvoyé. Pour le nom, l'ensemble de tous les caractères avant le dernier soulignement suivi de 1 ou plusieurs chiffres, et pour le code, l'ensemble de 1 chiffres ou plus après n'importe quel nombre de caractères et le dernier soulignement.

WITH tbl(column_X) AS (
  SELECT 'Saint_Peter_King_Jr_0001' FROM dual UNION ALL
  SELECT 'Kishore_Prasad_Misra_1253' FROM dual UNION ALL
  SELECT 'George_Floyd_21543' FROM dual UNION ALL
  SELECT 'Veer_Venkata_Sai_Narsimha_Kishore_00015' FROM dual
)
SELECT 
  REGEXP_SUBSTR(column_X, '(.*?)_\d+', 1, 1, NULL, 1) AS NAME,
  REGEXP_SUBSTR(column_X, '.*?_(\d+)', 1, 1, NULL, 1) AS code
FROM tbl;

NAME                                    CODE                                   
--------------------------------------- ---------------------------------------
Saint_Peter_King_Jr                     0001                                   
Kishore_Prasad_Misra                    1253                                   
George_Floyd                            21543                                  
Veer_Venkata_Sai_Narsimha_Kishore       00015                                  

4 rows selected.


2 commentaires

Bonjour Gary, il existe de nombreux disques et pas seulement 4, c'est trop difficile d'ajouter une requête Sélectionner pour tous les enregistrements.


@ kiss.shoremishra Veuillez noter que l'aide est appelée CTE pour une expression de table commune et utilisée ici pour créer un ensemble de données pour l'exemple. Le Select ci-dessous est appliqué sur ce jeu de données pour l'exemple. Vous n'utiliseriez que le choix ci-dessous et la clause de votre article sera votre table réelle.