Oracle SQL - Analizar una cadena de nombre y su conversión a la inicial del nombre y apellido

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

  •  21-08-2019
  •  | 
  •  

Pregunta

¿Alguien sabe cómo convertir esta cadena: "Smith, John R"
En esta cadena: "jsmith"

?

Necesito a minúsculas todo con menor) gratis ( Encuentra donde la coma es y rastrear su ubicación valor entero
Obtener el primer carácter después de que coma y ponerlo delante de la cadena
A continuación, obtener el nombre completo del pasado y pegarlo después de la primera inicial.
Nota al margen - la función Instr () no es compatible con mi versión
Gracias por cualquier ayuda!

¿Fue útil?

Solución

Para comenzar a escribir su propia función INSTR - llaman my_instr por ejemplo. Comenzará a Char 1 y el bucle hasta que encuentra un ''.

A continuación, utilice como lo haría INSTR.

Otros consejos

La mejor manera de hacer esto es utilizando Oracle expresiones regulares cuentan, por ejemplo:

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

Eso dice, 1) cuando encuentre el patrón de cualquier conjunto de caracteres, seguido de "", seguido de un carácter en mayúscula, seguida de los caracteres restantes, tomar el tercer elemento (inicial del nombre) y anexar la apellido. A continuación, hacer todo en minúsculas.

Su nota al margen: "la función Instr () no es compatible con mi versión" no tiene sentido para mí, ya que la función ha sido alrededor de las edades. Para comprobar la versión, porque las expresiones regulares solamente se añadió a Oracle en la versión 9i.

Gracias por los puntos.

- Guiso

Instr () no es compatible con tu versión de qué? ¿Oráculo? ¿Está utilizando la versión 4 o algo?

No hay necesidad de crear su propia función, y francamente, parece una pérdida de tiempo cuando esto se puede hacer con bastante facilidad con funciones SQL que ya existen. Se debe tener cuidado para tener en cuenta la entrada de datos descuidado.

Esta es otra manera de lograr su objetivo declarado:

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

Se me hace difícil creer que no tiene acceso a una adecuada instr (), pero si ese es el caso, poner en marcha su propia versión.

Asumiendo que tiene que enderezar:

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;

Además, tenga cuidado acerca de su supuesto de que todos los nombres estarán en ese formato. Mirar hacia fuera para algo que no sea un solo espacio después de la coma, apellidos que tienen datos como “Parisi, Jr.”, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top