En el manejo de bases de datos, a menudo necesitamos trabajar con solo una parte de una cadena de texto almacenada en una columna. Ya sea para extraer códigos, prefijos, sufijos, o simplemente para analizar fragmentos específicos de datos, la capacidad de manipular cadenas es fundamental. Oracle Database, uno de los sistemas de gestión de bases de datos relacionales más potentes del mercado, ofrece una suite de funciones para este propósito. Entre ellas, una de las más utilizadas y versátiles es la función SUBSTR() y sus variantes.

Dominar SUBSTR() te permitirá realizar operaciones de extracción de subcadenas de manera eficiente y precisa, adaptándote a diferentes necesidades, como contar caracteres o bytes, o manejar complejidades de codificación como Unicode. En este artículo, exploraremos a fondo qué es SUBSTR(), cómo funciona, sus parámetros, y sus importantes variantes.
- ¿Qué es la Función SUBSTR() en Oracle?
- Cómo Funciona el Parámetro 'posicion'
- Cómo Funciona el Parámetro 'longitud_subcadena'
- SUBSTR vs. SUBSTRB: Caracteres vs. Bytes
- Otras Variantes de SUBSTR para Unicode
- Tabla Comparativa de Funciones SUBSTR
- Casos de Uso Comunes para SUBSTR
- Consideraciones Importantes
- Preguntas Frecuentes sobre SUBSTR en Oracle
- ¿Cuál es la diferencia principal entre SUBSTR y SUBSTRB?
- ¿Cómo extraigo los últimos N caracteres de una cadena?
- ¿Qué ocurre si la longitud solicitada excede la longitud real de la subcadena disponible?
- ¿Puedo usar SUBSTR para reemplazar parte de una cadena?
- Si la posición es mayor que la longitud de la cadena, ¿qué devuelve SUBSTR?
- Conclusión
¿Qué es la Función SUBSTR() en Oracle?
La función SUBSTR en Oracle SQL se utiliza para obtener una porción (una subcadena) de una cadena de caracteres dada. Esencialmente, le dices a la función de qué cadena quieres extraer, desde qué posición empezar y cuántos caracteres quieres tomar a partir de esa posición.
Sintaxis Básica de SUBSTR()
La sintaxis general de la función SUBSTR es la siguiente:
SUBSTR(cadena, posicion, [longitud_subcadena])
cadena: Es la cadena de la cual deseas extraer una subcadena. Puede ser una columna de una tabla, una variable o un literal de cadena.posicion: Es un número entero que indica la posición inicial desde donde la extracción debe comenzar. Las posiciones se basan en 1, no en 0.longitud_subcadena(Opcional): Es un número entero que especifica cuántos caracteres se deben extraer a partir de la posición inicial.
Cómo Funciona el Parámetro 'posicion'
El parámetro posicion determina el punto de partida para la extracción de la subcadena. Su interpretación depende de si el valor es positivo o negativo.
- Si
posiciones positivo (mayor que 0): Oracle cuenta los caracteres desde el principio de la cadena. La posición 1 es el primer carácter, la posición 2 es el segundo, y así sucesivamente. - Si
posiciones negativo (menor que 0): Oracle cuenta hacia atrás desde el final de la cadena. La posición -1 es el último carácter, la posición -2 es el penúltimo, y así sucesivamente. - Si
posiciones 0: Oracle trata la posición 0 como si fuera 1.
Ejemplos del Parámetro 'posicion'
Consideremos la cadena 'Oracle Database':
-- Posición positiva: Empezar desde el 8º carácter
SELECT SUBSTR('Oracle Database', 8) FROM dual;
-- Resultado: 'Database'
-- Posición positiva con longitud: Empezar desde el 8º, tomar 4 caracteres
SELECT SUBSTR('Oracle Database', 8, 4) FROM dual;
-- Resultado: 'Data'
-- Posición negativa: Empezar contando 8 caracteres desde el final
SELECT SUBSTR('Oracle Database', -8) FROM dual;
-- Resultado: 'Database'
-- Posición negativa con longitud: Empezar contando 8 desde el final, tomar 4
SELECT SUBSTR('Oracle Database', -8, 4) FROM dual;
-- Resultado: 'Data'
-- Posición 0 (tratada como 1)
SELECT SUBSTR('Oracle Database', 0, 6) FROM dual;
-- Resultado: 'Oracle'Es importante notar que si la posicion especificada excede la longitud de la cadena (contando desde el principio si es positiva, o desde el final si es negativa), SUBSTR devolverá NULL.
Cómo Funciona el Parámetro 'longitud_subcadena'
El parámetro longitud_subcadena (opcional) determina cuántos caracteres se extraerán a partir de la posicion especificada.
- Si
longitud_subcadenaes positivo (mayor que 0): Oracle extrae exactamente ese número de caracteres, siempre y cuando haya suficientes caracteres disponibles desde laposicionhasta el final de la cadena. Si la longitud solicitada excede los caracteres restantes, Oracle simplemente extrae todos los caracteres desde laposicionhasta el final de la cadena. - Si
longitud_subcadenaes omitido: Oracle extrae todos los caracteres desde laposicionespecificada hasta el final de la cadena. Este es un comportamiento muy útil cuando quieres obtener el 'resto' de una cadena a partir de un punto específico. - Si
longitud_subcadenaes menor que 1 (cero o negativo): Oracle devuelveNULL. No es posible extraer una subcadena de longitud cero o negativa.
Ejemplos del Parámetro 'longitud_subcadena'
Continuando con 'Oracle Database':
-- Longitud omitida: Empezar desde 8, tomar hasta el final
SELECT SUBSTR('Oracle Database', 8) FROM dual;
-- Resultado: 'Database'
-- Longitud positiva que excede los caracteres restantes: Empezar en 8, pedir 20
SELECT SUBSTR('Oracle Database', 8, 20) FROM dual;
-- La cadena 'Database' tiene 8 caracteres. Pedimos 20, pero solo hay 8 disponibles.
SELECT SUBSTR('Oracle Database', 8, 20) FROM dual;
-- Resultado: 'Database'
-- Longitud cero
SELECT SUBSTR('Oracle Database', 1, 0) FROM dual;
-- Resultado: NULL
-- Longitud negativa
SELECT SUBSTR('Oracle Database', 1, -5) FROM dual;
-- Resultado: NULLSUBSTR vs. SUBSTRB: Caracteres vs. Bytes
Una distinción crucial en Oracle, especialmente cuando se trabaja con datos que pueden contener caracteres especiales o de diferentes idiomas, es la diferencia entre contar caracteres y contar bytes. La función SUBSTR estándar calcula la longitud y la posición utilizando caracteres, según lo definido por el conjunto de caracteres de la base de datos o de la sesión. Sin embargo, la función SUBSTRB utiliza bytes en lugar de caracteres.
Esta diferencia es vital cuando se manejan conjuntos de caracteres multi-byte (como UTF8), donde un solo carácter puede ocupar más de un byte. Por ejemplo, una letra acentuada como 'é' o un símbolo de moneda como '€' pueden ser representados por 2 o 3 bytes en UTF8.
Ejemplo de SUBSTR vs. SUBSTRB
Considera la cadena 'Ñandú €' en un conjunto de caracteres UTF8.
- 'Ñ' puede ocupar 2 bytes.
- 'a', 'n', 'd', 'ú', ' ' (espacio) ocupan 1 byte cada uno.
- '€' puede ocupar 3 bytes.
La longitud de la cadena en caracteres es 7 ('Ñ','a','n','d','ú',' ','€').
La longitud de la cadena en bytes sería: 2 (Ñ) + 1 (a) + 1 (n) + 1 (d) + 2 (ú) + 1 ( ) + 3 (€) = 11 bytes (esto es una aproximación, depende exacto del encoding UTF8, pero ilustra la idea).
-- Usando SUBSTR (cuenta caracteres)
SELECT SUBSTR('Ñandú €', 1, 1) FROM dual;
-- Resultado: 'Ñ' (1 carácter)
-- Usando SUBSTRB (cuenta bytes)
SELECT SUBSTRB('Ñandú €', 1, 1) FROM dual;
-- Resultado: un carácter parcial o un byte inicial, probablemente ilegible,
-- porque 'Ñ' son 2 bytes y solo pedimos 1 byte.
SELECT SUBSTRB('Ñandú €', 1, 2) FROM dual;
-- Resultado: 'Ñ' (si 'Ñ' ocupa 2 bytes)
SELECT SUBSTR('Ñandú €', 6, 1) FROM dual;
-- Resultado: ' ' (el espacio, 1 carácter)
SELECT SUBSTRB('Ñandú €', 8, 3) FROM dual;
-- Asumiendo que 'Ñandú' son 2+1+1+1+2=7 bytes y el espacio 1 byte, el euro empieza en el byte 9.
-- Si el euro ocupa 3 bytes, pedimos 3 bytes desde la posición 9.
-- Resultado: '€'
-- (Nota: La posición para SUBSTRB también es en bytes. Si 'Ñandú €' tiene 11 bytes,
-- la posición 9 es el inicio del símbolo Euro).Entender la diferencia entre carácter y byte es fundamental para evitar errores inesperados al manipular cadenas, especialmente con datos multi-idioma o símbolos especiales.
Otras Variantes de SUBSTR para Unicode
Oracle proporciona otras variantes de SUBSTR para manejar específicamente diferentes representaciones de caracteres Unicode:
SUBSTRC(cadena, posicion, [longitud_subcadena]): Utiliza caracteres Unicode completos (complete characters). Esto es útil para manejar caracteres que pueden representarse con múltiples unidades de código en ciertos esquemas de codificación Unicode.SUBSTR2(cadena, posicion, [longitud_subcadena]): Utiliza puntos de código UCS2 (UCS2 code points). UCS2 representa la mayoría de los caracteres Unicode básicos (los primeros 65536).SUBSTR4(cadena, posicion, [longitud_subcadena]): Utiliza puntos de código UCS4 (UCS4 code points). UCS4 puede representar todos los caracteres Unicode, incluyendo aquellos fuera del plano básico multilingüe (como muchos emojis).
Estas variantes son más especializadas y se usan cuando necesitas un control preciso sobre cómo se cuentan e interpretan los caracteres en diferentes codificaciones Unicode, más allá del conteo simple de caracteres o bytes.
Tabla Comparativa de Funciones SUBSTR
| Función | Unidad de Conteo (Posición y Longitud) | Notas |
|---|---|---|
SUBSTR | Caracteres (según el conjunto de caracteres de la base de datos/sesión) | La función más común. Puede dar resultados inesperados con caracteres multi-byte si se espera un conteo por bytes. |
SUBSTRB | Bytes | Útil para trabajar con tamaños físicos en almacenamiento o redes. Ignora la estructura lógica de los caracteres multi-byte. |
SUBSTRC | Caracteres Unicode completos | Maneja caracteres compuestos o combinados como una sola unidad cuando es apropiado. |
SUBSTR2 | Puntos de Código UCS2 | Para conteo basado en unidades de 16 bits. |
SUBSTR4 | Puntos de Código UCS4 | Para conteo basado en unidades de 32 bits. |
Casos de Uso Comunes para SUBSTR
- Extraer Prefijos o Sufijos: Obtener los primeros N caracteres (
SUBSTR(cadena, 1, N)) o los últimos N caracteres (SUBSTR(cadena, -N)). - Extraer Componentes de Datos Compuestos: Si un campo almacena varios datos separados por un delimitador (ej: 'Código-ID-Versión'), puedes usar
SUBSTRjunto con funciones comoINSTR(para encontrar la posición del delimitador) para extraer cada parte. - Validación de Formato: Verificar si una subcadena en una posición específica cumple con un patrón esperado.
- Truncar Cadenas: Limitar la longitud de una cadena a un máximo, aunque
SUBSTR(cadena, 1, max_longitud)es una forma sencilla de hacerlo. - Anonimización Parcial: Mostrar solo una parte de un dato sensible (ej: los últimos 4 dígitos de una tarjeta).
Consideraciones Importantes
- Indexación Base 1: Recuerda siempre que
SUBSTRusa indexación base 1, no base 0 como en muchos lenguajes de programación. - Manejo de NULLs: Si la cadena de entrada es
NULL, o si laposicionolongitud_subcadenaresultan en una extracción inválida (ej: longitud < 1), la función devolveráNULL. - Rendimiento: Para operaciones muy intensivas en grandes volúmenes de datos, considera si la manipulación de cadenas en SQL es el enfoque más eficiente o si sería mejor manejarlo en la capa de aplicación. Sin embargo, para la mayoría de los casos,
SUBSTRes muy eficiente. - Conjunto de Caracteres: Siempre ten en cuenta el conjunto de caracteres de tu base de datos y de tus datos al decidir entre
SUBSTRySUBSTRB.
Preguntas Frecuentes sobre SUBSTR en Oracle
¿Cuál es la diferencia principal entre SUBSTR y SUBSTRB?
La diferencia clave es la unidad de conteo: SUBSTR cuenta caracteres, mientras que SUBSTRB cuenta bytes. Esto es importante con conjuntos de caracteres donde un carácter puede ocupar múltiples bytes.
¿Cómo extraigo los últimos N caracteres de una cadena?
Puedes usar una posición negativa. Por ejemplo, para los últimos 5 caracteres: SUBSTR(cadena, -5).
¿Qué ocurre si la longitud solicitada excede la longitud real de la subcadena disponible?
SUBSTR (y sus variantes) extraen todos los caracteres restantes desde la posición inicial hasta el final de la cadena. No produce un error, simplemente no extrae más caracteres de los que existen.
¿Puedo usar SUBSTR para reemplazar parte de una cadena?
No, SUBSTR solo extrae. Para reemplazar partes de una cadena, deberías usar la función REPLACE o combinar SUBSTR con concatenación para construir una nueva cadena.
Si la posición es mayor que la longitud de la cadena, ¿qué devuelve SUBSTR?
Si la posición inicial está fuera de los límites de la cadena, SUBSTR devuelve NULL.
Conclusión
La función SUBSTR() es una herramienta esencial en el arsenal de cualquier desarrollador o administrador que trabaje con Oracle Database. Su capacidad para extraer subcadenas basándose en posiciones y longitudes la hace increíblemente útil para una amplia variedad de tareas de manipulación de datos de texto. Comprender cómo funcionan sus parámetros, especialmente la distinción entre conteo de caracteres y bytes con SUBSTRB, te permitirá escribir consultas más robustas y precisas. Con las variantes adicionales como SUBSTRC, Oracle ofrece flexibilidad para manejar las complejidades de las codificaciones modernas como Unicode. Incorpora SUBSTR y sus variantes en tus scripts SQL para manipular tus datos de cadena de forma efectiva.
Si quieres conocer otros artículos parecidos a SUBSTR en Oracle: Extrae Partes de Cadenas puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL