es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dividir una cadena de longitud variable en Oracle 10g.

Estoy teniendo problemas para dividir una cadena de longitud variable delimitada por espacios que contiene nombres en Oracle 10g. A continuación, se muestran algunos ejemplos de lo que quiero decir:

1. Nombre: Alpha Beta 
   Nombre_Primer: Alpha
   Nombre_Apellidos: Beta

2. Nombre: Alpha Beta Gamma
   Nombre_Primer: Alpha
   Nombre_Medio: Beta
   Nombre_Apellidos: Gamma

3. Nombre: Alpha Beta Gamma Omega
   Nombre_Primer: Alpha
   Nombre_Medio: Beta
   Nombre_Apellidos: Gamma Omega

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para dividir una cadena de texto de longitud variable delimitada por espacios que contiene nombres en Oracle 10g

    Para dividir una cadena de texto de longitud variable delimitada por espacios que contiene nombres en Oracle 10g, se puede utilizar la siguiente consulta SQL:

    SELECT 
        REGEXP_SUBSTR(Nombre, '[^ ]+', 1, 1) AS Primer_Nombre,
        CASE
            WHEN REGEXP_COUNT(Nombre, ' ') = 1 THEN REGEXP_SUBSTR(Nombre, '[^ ]+', 1, 2)
            WHEN REGEXP_COUNT(Nombre, ' ') = 2 THEN REGEXP_SUBSTR(Nombre, '[^ ]+', 1, 3)
            ELSE REGEXP_REPLACE(Nombre, '([^\s]+)\s+([^\s]+)\s(.*)', '\2 \3') 
        END AS Nombre_Intermedio,
        CASE
            WHEN REGEXP_COUNT(Nombre, ' ') = 1 THEN REGEXP_SUBSTR(Nombre, '[^ ]+', 1, 1)
            WHEN REGEXP_COUNT(Nombre, ' ') = 2 THEN REGEXP_SUBSTR(Nombre, '[^ ]+', 1, 2)
            ELSE REGEXP_REPLACE(Nombre, '([^\s]+)\s+([^\s]+)\s(.*)', '\1')
        END AS Apellido
    FROM 
        (SELECT 'Alpha Beta' AS Nombre FROM dual UNION ALL
         SELECT 'Alpha Beta Gamma' AS Nombre FROM dual UNION ALL
         SELECT 'Alpha Beta Gamma Omega' AS Nombre FROM dual
        )
    

    La consulta anterior utiliza la función REGEXP_SUBSTR y expresiones regulares para dividir la cadena de nombres en su primer nombre, nombre intermedio y apellido. La declaración CASE se utiliza para manejar cadenas de nombres con diferentes cantidades de espacios.

    Para el primer y último nombre, utilizamos REGEXP_SUBSTR(Nombre, '[^ ]+', 1, n) para obtener la n-ésima palabra en la cadena de nombres, donde n puede ser 1 o 2.

    Para el nombre intermedio, utilizamos REGEXP_REPLACE con una expresión regular que coincide con las primeras dos palabras y captura el resto de la cadena. Reemplazamos toda la cadena con el grupo capturado, lo cual nos da el nombre intermedio y el apellido.

    La consulta muestra los primeros, nombres intermedios y apellidos para cada cadena de nombres de entrada. Podemos reemplazar la columna Nombre con la columna de nombres de nuestra tabla actual para obtener el resultado deseado.

Comments are closed.