Extraer Apellidos en Mayuscula


03 de Junio del 2021

Buenas noches solicito de su colaboración tengo un ejercicio para resolver necesito crear una consulta para extraer el primer apellido y el segundo apellido en mayúscula
la tabla que tengo es la siguiente tiene nombres combinado lo estoy realizando asi pero no me da me podrian colaborar gracias

esta es la consulta que estoy realizando

select upper(substr(nombre_completo,instr (nombre_completo,' ',1,3)+1,instr (nombre_completo,' ',1,3)-instr (nombre_completo,' ',2,1))) Apellido2
from final_bd ;

esta es la tabla

123 ana maria paz gil
721 maria fernanda torrez santamaria
456 margarita sinisterra
567 rodrigo rodriguez sanchez
155 diana marcela vera sandoval
789 luis felipe castro lopez
678 fernando jose gomez garcia
345 santiago emiliano sarmiento saldarriaga
233 claudia martinez bravo
444 liz lina soto zambrano
222 javier salazar


Antonia G.
12 de Agosto del 2026

Hola,

Tu consulta con INSTR contando ocurrencias de espacios es difícil de seguir y además asume que siempre hay exactamente 4 palabras, cosa que no se cumple en tu tabla (hay filas con 2, 3 y 4 palabras). Una forma más robusta de sacar «las dos últimas palabras», sea cual sea la longitud del nombre completo, es con expresiones regulares:

SELECT
    nombre_completo,
    UPPER(REGEXP_SUBSTR(nombre_completo, 'S+', 1, REGEXP_COUNT(nombre_completo, 'S+') - 1)) AS apellido1,
    UPPER(REGEXP_SUBSTR(nombre_completo, 'S+s*$')) AS apellido2
FROM final_bd;

REGEXP_COUNT(nombre_completo, 'S+') cuenta cuántas palabras tiene el campo. Con ese número, REGEXP_SUBSTR(..., 1, total_palabras - 1) extrae directamente la penúltima palabra (tu primer apellido), y el patrón 'S+s*$' extrae la última palabra de la cadena (tu segundo apellido), sin importar cuántas palabras haya antes. Con «ana maria paz gil» te daría PAZ y GIL igual que con cualquier otro nombre de 4 palabras.

Aviso honesto: con esto en la mano hay un problema de fondo que no tiene solución puramente mecánica. Mirando tus datos, filas como margarita sinisterra o javier salazar solo tienen 2 palabras: un nombre y un único apellido, no dos. Si aplicas esta misma fórmula a esas filas, te va a coger «margarita» como si fuera un apellido, cuando en realidad es el nombre de pila. No hay forma de que SQL adivine, solo a partir del texto, si una fila tiene 1 o 2 apellidos: esa información no está en los datos, está en el conocimiento de quién miró la lista y sabe quién es quién.

Si el ejercicio permite asumirlo, puedes tratar esas filas de 2 palabras como caso especial (nombre + 1 apellido) con un CASE según REGEXP_COUNT. Pero si esto es para un sistema real (no un ejercicio de clase), la solución de fondo es guardar nombre y apellidos en columnas separadas desde el origen, en vez de en un único campo de texto libre; una vez mezclados en un solo campo, separarlos correctamente al 100% deja de ser un problema de SQL y pasa a ser un problema de análisis de datos con margen de error.

Un saludo,
Antonia G.