¿Cómo puedo buscar texto en una cadena en Oracle?

SUBSTR en Oracle: Extrae Partes de Cadenas

Valoración: 4.92 (1053 votos)

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.

¿Qué hace la función InStr?
InStr(String, String, CompareMethod) Devuelve un entero que especifica la posición inicial de la primera aparición de una cadena dentro de otra.

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.

Índice de Contenido

¿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 posicion es 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 posicion es 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 posicion es 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_subcadena es positivo (mayor que 0): Oracle extrae exactamente ese número de caracteres, siempre y cuando haya suficientes caracteres disponibles desde la posicion hasta el final de la cadena. Si la longitud solicitada excede los caracteres restantes, Oracle simplemente extrae todos los caracteres desde la posicion hasta el final de la cadena.
  • Si longitud_subcadena es omitido: Oracle extrae todos los caracteres desde la posicion especificada 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_subcadena es menor que 1 (cero o negativo): Oracle devuelve NULL. 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: NULL

SUBSTR 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ónUnidad de Conteo (Posición y Longitud)Notas
SUBSTRCaracteres (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.
SUBSTRBBytesÚtil para trabajar con tamaños físicos en almacenamiento o redes. Ignora la estructura lógica de los caracteres multi-byte.
SUBSTRCCaracteres Unicode completosManeja caracteres compuestos o combinados como una sola unidad cuando es apropiado.
SUBSTR2Puntos de Código UCS2Para conteo basado en unidades de 16 bits.
SUBSTR4Puntos de Código UCS4Para 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 SUBSTR junto con funciones como INSTR (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 SUBSTR usa 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 la posicion o longitud_subcadena resultan 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, SUBSTR es 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 SUBSTR y SUBSTRB.

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.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir