Question

Quelqu'un sait comment transformer cette chaîne: "Smith, John R"
Dans cette chaîne: "dupont"

?

Je dois en minuscules tout avec inférieur ()
Trouver où la virgule est et de suivre sa valeur emplacement entier
Obtenez le premier caractère après la virgule et le mettre en face de la chaîne
Ensuite, obtenir le nom entier dernier et le coller après la première initiale.
Sidenote - fonction instr () n'est pas compatible avec ma version
Merci pour toute aide!

Était-ce utile?

La solution

Commencez par écrire votre propre fonction instr - appeler my_instr par exemple. Il commencera à ombles 1 et boucle jusqu'à ce qu'il trouve un « ».

Utilisez ensuite comme vous le feriez INSTR.

Autres conseils

La meilleure façon de le faire est d'utiliser les expressions régulières Oracle fonctionnalité, comme ceci:

SELECT LOWER(regexp_replace('Smith, John R', 
             '(.+)(, )([A-Z])(.+)', 
             '\3\1', 1, 1)) 
  FROM DUAL;

qui dit: 1) lorsque vous trouvez le modèle d'un ensemble de caractères, suivi de « », suivi d'un caractère majuscule, suivi par tous les autres caractères, prendre le troisième élément (initiale du prénom) et ajouter la nom de famille. Puis tout faire en minuscules.

Votre remarque: « fonction instr () n'est pas compatible avec ma version » n'a pas de sens pour moi, comme cette fonction a été autour depuis des siècles. Vérifiez votre version, car les expressions régulières n'a été ajoutée à Oracle dans la version 9i.

Merci pour les points.

- Ragoût

instr () n'est pas compatible avec votre version de quoi? Oracle? Utilisez-vous la version 4 ou quelque chose?

Il n'y a pas besoin de créer votre propre fonction, et tout à fait franchement, il semble une perte de temps quand cela peut se faire assez facilement avec des fonctions SQL qui existent déjà. Il faut prendre soin de tenir compte pour la saisie des données bâclée.

Voici une autre façon d'atteindre votre objectif déclaré:

with name_list as
  (select '   Parisi, Kenneth R' name from dual)
select name
      -- There may be a space after the comma.  This will strip an arbitrary
      -- amount of whitespace from the first name, so we can easily extract
      -- the first initial.
     , substr(trim(substr(name, instr(name, ',') + 1)), 1, 1) AS first_init
      -- a simple substring function, from the first character until the
      -- last character before the comma.
     , substr(trim(name), 1, instr(trim(name), ',') - 1) AS last_name
      -- put together what we have done above to create the output field      
     , lower(substr(trim(substr(name, instr(name, ',') + 1)), 1, 1)) ||
       lower(substr(trim(name), 1, instr(trim(name), ',') - 1)) AS init_plus_last
  from name_list;  

HTH, Gabe

J'ai du mal à croire que vous n'avez pas accès à un bon instr () mais si tel est le cas, mettre en œuvre votre propre version.

En supposant que vous avez redressé que:

select 
  substr( 
      lower( 'Smith, John R' )
    , instr( 'Smith, John R', ',' ) + 2
    , 1 
  ) || -- first_initial
  substr( 
      lower( 'Smith, John R' )
    , 1
    , instr( 'Smith, John R', ',' ) - 1 
  ) -- last_name
from dual;

En outre, faites attention à votre hypothèse que tous les noms seront dans ce format. Méfiez-vous quelque chose d'autre qu'un seul espace après la virgule, noms de famille ayant des données comme « Parisi, Jr. », etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top