Oracle SQL - l'analisi di una stringa di nome e la sua conversione al iniziale del nome e ultima

StackOverflow https://stackoverflow.com/questions/371490

  •  21-08-2019
  •  | 
  •  

Domanda

Qualcuno sa come trasformare questa stringa: "Smith, John R"
In questa stringa: "jsmith"

?

Ho bisogno di tutto con lettere minuscole inferiore)
( Trovare dove la virgola è e tenere traccia la sua posizione intero valore
Prendi il primo carattere dopo la virgola e metterlo davanti alla stringa di
Quindi ottenere l'intero cognome e bastone dopo la prima iniziale.
Sidenote - funzione InStr () non è compatibile con la mia versione
Grazie per qualsiasi aiuto!

È stato utile?

Soluzione

Inizia scrivendo la propria funzione INSTR - chiamano my_instr per esempio. Si inizierà alle char 1 e ciclo fino a quando non trova un ''.

Quindi utilizzare come si farebbe INSTR.

Altri suggerimenti

Il modo migliore per farlo è usare Oracle espressioni regolari caratteristica, in questo modo:

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

che dice: 1) quando si trova il modello di qualsiasi insieme di caratteri, seguito da "", seguito da un carattere maiuscolo, seguito da qualsiasi caratteri rimanenti, prendere il terzo elemento (iniziale del nome) e aggiungere il cognome. Poi rendere tutto minuscolo.

La tua nota a margine: "la funzione Instr () non è compatibile con la mia versione" non ha senso per me, come quella funzione è stato in giro per le età. Controlla la tua versione, perché le espressioni regolari è stato aggiunto solo per Oracle versione 9i.

Grazie per i punti.

- Stew

Instr () non è compatibile con la versione di che cosa? Oracolo? Si sta utilizzando la versione 4 o qualcosa del genere?

Non c'è bisogno di creare la propria funzione, e francamente, sembra una perdita di tempo in cui questo può essere fatto abbastanza facilmente con funzioni SQL che già esistono. Si deve prestare attenzione per tenere conto di immissione dei dati sciatta.

Ecco un altro modo per raggiungere il tuo obiettivo dichiarato:

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

Non ho difficoltà a credere che non ha accesso a un adeguato Instr (), ma se questo è il caso, di implementare la propria versione.

Supponendo di avere raddrizzato che:

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;

Inoltre, fare attenzione circa il vostro presupposto che tutti i nomi saranno in quel formato. Attenzione per qualcosa di diverso da un singolo spazio dopo la virgola, ultimi nomi che hanno dati come “Parisi, Jr.”, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top