Oracle SQL - l'analisi di una stringa di nome e la sua conversione al iniziale del nome e ultima
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!
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.