Volver a la lista de artículos Artículos
Lectura de 8 minutos

La función de subcadena de SQL en 5 ejemplos

¿Trabaja con datos de texto en SQL? Explicamos cómo obtener valores de cualquier punto de una cadena.

Cuando piensa en trabajar con datos en SQL, lo primero que se le ocurre es una base de datos llena de números y su código SQL haciendo cálculos muy sofisticados. Pero el texto también es un dato. Es muy común encontrar datos de texto en las bases de datos. No sólo hay que extraerlos, sino que a menudo también hay que manipularlos. Las funciones que te permiten hacerlo se llaman funciones de texto.

Para cualquiera que quiera practicar las funciones SQL, recomiendo nuestro curso interactivo Funciones estándar de SQL interactivo. Contiene 211 ejercicios y te enseña a utilizar funciones comunes de texto, numéricas y de fecha y hora en SQL.

Una de las funciones de texto más comunes que cubre el curso es SUBSTRING(). En este artículo, tenemos cinco ejemplos empresariales de la vida real que cubren los principales usos de esta función. Algunos ejemplos pueden parecer complicados si no estás familiarizado con las funciones de texto, así que asegúrate de tener a tu lado la hoja de trucos deFunciones estándar de SQL o un resumen de las funciones de texto de SQL.

¿Qué es la función SUBSTRING()?

SUBSTRING() es una función de texto que permite extraer caracteres de una cadena. Su sintaxis es

SUBSTRING(expression, start, length)

Para el argumento expression, se escribe un literal de cadena o se especifica una columna de la que se quiere extraer la subcadena. El argumento start es un número entero que indica la posición numérica del carácter en la cadena donde comienza la subcadena. El argumento length, como su nombre indica, define la longitud, un valor entero, de la subcadena a devolver.

¿Cómo funciona SUBSTRING()?

La pista está en el propio nombre de la función. Una subcadena es una cadena dentro de la cadena principal. Por lo tanto, SUBSTRING() extrae una subcadena tal y como se especifica en su argumento.

Funciona así:

función sql substring

En la cadena anterior, la subcadena que comienza en la posición 1 y tiene una longitud de tres caracteres es ‘STR’.

Ahora que tenemos los principios cubiertos, permíteme mostrarte varios ejemplos. Empezando, por supuesto, por el más sencillo.

Ejemplo 1: Subcadena de una cadena literal

La función SUBSTRING() devuelve una subcadena de cualquier cadena que desee. Puedes escribir la cadena explícitamente como argumento, así:

SELECT SUBSTRING('This is the first substring example', 9, 10) AS substring_extraction;

Esto significa: Quiero encontrar una subcadena del texto ‘This is the first substring example’. Los argumentos dicen que la subcadena comienza en el noveno carácter de la cadena y que su longitud es de 10 caracteres.

Veamos lo que devuelve este código:

substring_extraction
the first

Hay una columna y una fila. La subcadena extraída es ‘the first’. Este es el uso más básico de SUBSTRING(); ¡el código ni siquiera utiliza ninguna tabla!

La tabla de empleados

Para mostrarte más ejemplos interesantes, necesito algunos datos. Permítame presentarle una tabla llamada employees.

La tabla almacena información sobre los empleados de una empresa imaginaria, Kooler, en las siguientes columnas

  • id - El ID del empleado.
  • first_name - El nombre del empleado.
  • last_name - El apellido del empleado.
  • email - El correo electrónico del empleado.
  • job_title - El cargo del empleado.
  • department - El departamento del empleado.
  • start_date - La fecha de inicio del empleado en Kooler.

Aquí están las primeras filas para que tenga una idea de los datos:

idfirst_namelast_nameemailjob_titledepartmentstart_date
1ClarenceWilkinsoncwilkinson@kooler.comJunior Sales AssistantSales09/2021
2MirandaBrownmbrown@kooler.comSenior Sales SpecialistSales01/2020
3FrankDrebinfdrebin@kooler.comJunior Sales ManagerSales08/2019

Ejemplo 2: Subcadena de una columna

Como puede imaginar, escribir la expresión de cadena explícitamente no es la única manera de utilizar SUBSTRING(). También puede utilizarla en una columna de una tabla.

He aquí un ejemplo. Quiero encontrar las iniciales de todos los empleados. Utilizo la columna email ya que sé que las dos primeras letras de la dirección de correo electrónico son las iniciales:

SELECT first_name,
	 last_name,
	 email,
	 SUBSTRING(email, 1, 2) AS employee_initials
FROM employees;

Especifico la columna email en la función. Obtener las dos primeras letras de la dirección de correo electrónico significa que la subcadena comienza en el primer carácter para una longitud de dos caracteres. Esto devuelve el resultado deseado:

first_namelast_nameemailemployee_initials
ClarenceWilkinsoncwilkinson@kooler.comcw
MirandaBrownmbrown@kooler.commb
FrankDrebinfdrebin@kooler.comfd
VivienKellyvkelly@kooler.comvk
SteveStephenssstephens@kooler.comss
NastassjaHarrisonnharrison@kooler.comnh
ThomasPetersontpeterson@kooler.comtp
MathildeKinskimkinski@kooler.commk
MateuszWozniakmwozniak@kooler.commw
AineDoyleadoyle@kooler.comad
LorenzoAlfieriaalfieri@kooler.comaa
PetraBabićpbabic@kooler.compb
DuarteSimoesdsimoes@kooler.comds
OlenaKostenkookostenko@kooler.comok
LaurensGrotenhuislgrotenhuis@kooler.comlg

Ejemplo 3: Subcadena sin el argumento de longitud

Puede omitir el argumento de longitud en SUBSTRING(), y la función seguirá funcionando. Un buen ejemplo es cuando se quiere mostrar sólo el año de la fecha de inicio del empleo. La columna start_date es poco amigable para eso. Esta fecha se escribe como datos de texto en el formato MM/AAAA.

Afortunadamente, SUBSTRING() resuelve este problema:

SELECT first_name,
	 last_name,
	 start_date,
	 SUBSTRING(start_date, 4) AS start_year
FROM employees;

Para obtener el año de la columna start_date, basta con definir el inicio de la subcadena. En este código, la subcadena comienza a partir del cuarto carácter. Como omito el argumento de la longitud, la longitud de la subcadena es la que haya hasta el final de la cadena desde el cuarto carácter. Así obtengo fácilmente el año, como se ve a continuación:

first_namelast_namestart_datestart_year
ClarenceWilkinson09/20212021
MirandaBrown01/20202020
FrankDrebin08/20192019
VivienKelly03/20192019
SteveStephens07/20212021
NastassjaHarrison03/20222022
ThomasPeterson01/20222022
MathildeKinski01/20222022
MateuszWozniak01/20222022
AineDoyle10/20212021
LorenzoAlfieri10/20212021
PetraBabić05/20212021
DuarteSimoes04/20202020
OlenaKostenko11/20192019
LaurensGrotenhuis06/20172017

Ejemplo 4: POSITION() y CHARINDEX()

Volviendo al trabajo con los correos electrónicos. Por política de la empresa, el punto local de una dirección de correo electrónico (es decir, la parte que precede a la '@') es también el nombre de usuario del empleado para acceder a todas las aplicaciones de la empresa. Es necesario extraer este nombre de usuario. Así es como se hace:

SELECT first_name,
       last_name,
	 SUBSTRING (email, 1, POSITION('@' IN email)-1) AS username
FROM employees;

Los dos primeros argumentos son los que ya has visto. Quiero extraer una subcadena de la columna email, y quiero que empiece por el primer carácter de la cadena. Pero ahora, la longitud de la subcadena es diferente para cada empleado. ¿Cómo le digo a la función que devuelva todos los caracteres anteriores al signo '@'?

Utilizo POSITION(), que es equivalente a CHARINDEX() en SQL Server o MySQL. Localiza el carácter especificado en la cadena y devuelve su posición numérica. Así, la longitud de la subcadena que es el nombre de usuario del empleado es igual a POSITION('@' IN email)-1. ¿Por qué menos uno? Porque no quiero que se incluya '@' en el nombre de usuario del empleado.

Este es el resultado:

first_namelast_nameusername
ClarenceWilkinsoncwilkinson
MirandaBrownmbrown
FrankDrebinfdrebin
VivienKellyvkelly
SteveStephenssstephens
NastassjaHarrisonnharrison
ThomasPetersontpeterson
MathildeKinskimkinski
MateuszWozniakmwozniak
AineDoyleadoyle
LorenzoAlfieriaalfieri
PetraBabićpbabic
DuarteSimoesdsimoes
OlenaKostenkookostenko
LaurensGrotenhuislgrotenhuis

Ejemplo 5: LENGTH() + POSITION()

El último ejemplo muestra cómo encontrar el puesto de trabajo de un empleado a partir de los datos. Trabajando en Kooler, sé cómo se forman los títulos de los puestos de trabajo: primero viene la antigüedad del empleado, luego el departamento y después el puesto. Por ejemplo, "Asistente de ventas junior" significa que el empleado tiene una antigüedad menor, está en Ventas y trabaja como asistente.

Utilizando SQL, puedo extraer esto como una subcadena:

SELECT first_name,
       last_name,
       job_title,
       SUBSTRING(job_title, LENGTH(job_title) - POSITION(' ' IN REVERSE(job_title))+2) AS position
FROM employees;

Este es otro ejemplo de omisión del argumento de longitud, aunque un poco más complejo. Como siempre, primero especifico la columna de la cadena - job_title en este caso. Después, necesito encontrar una subcadena que consista sólo en la última palabra del título del puesto.

Para ello, primero utilizo LENGTH(). Me devuelve la longitud de la cadena en la columna job_title. Eso es un comienzo; es la longitud de las tres palabras juntas, incluyendo los espacios en blanco. Si pudiera restarle de alguna manera el número de caracteres de la última palabra, entonces tendría la longitud de las dos primeras palabras, lo que me daría el inicio de la subcadena que quiero.

Esto es un poco complicado porque los diferentes nombres de puestos de trabajo tienen diferentes longitudes. Lo único que separa las palabras es el espacio en blanco. Así que, para obtener la longitud de la tercera palabra de la cadena, tengo que contar el número de caracteres hasta el espacio en blanco, pero desde la derecha.

La función POSITION() vuelve a salvar el día, pero esta vez combinada con REVERSE(). La función REVERSE() invierte la expresión de la cadena de manera que "Asistente de ventas junior" se convierte en "tnatsissA selaS roinuJ". La última palabra se convierte en la primera; la propia palabra también se invierte, pero eso no importa aquí.

POSITION() encuentra la posición del espacio en blanco después de la primera palabra de la cadena invertida. Esto es igual al lugar del espacio en blanco antes de la última palabra de la cadena original (no invertida).

¡Uf! Ahora, si resto este número de la longitud total de la cadena original, obtengo el inicio de la subcadena, ¿verdad?

Pues no es así. Al utilizar esta diferencia, se obtiene una subcadena que incluye la última letra de la segunda palabra y el espacio en blanco antes de la última palabra. ¿A qué se debe esto?

Por dos cosas. El argumento de inicio de la función SUBSTRING() es inclusivo. Además, POSITION() calcula la posición del espacio en blanco, no el número de caracteres hasta el espacio en blanco. Así que tengo que sumar 2 para obtener este resultado:

first_namelast_namejob_titleposition
ClarenceWilkinsonJunior Sales AssistantAssistant
MirandaBrownSenior Sales SpecialistSpecialist
FrankDrebinJunior Sales ManagerManager
VivienKellySenior Sales ManagerManager
SteveStephensJunior Sales SpecialistSpecialist
NastassjaHarrisonJunior Sales SpecialistSpecialist
ThomasPetersonJunior Reporting SpecialistSpecialist
MathildeKinskiJunior Reporting AnalystAnalyst
MateuszWozniakSenior Reporting ExpertExpert
AineDoyleJunior Reporting ManagerManager
LorenzoAlfieriSenior Reporting ManagerManager
PetraBabićJunior HR AssistantAssistant
DuarteSimoesJunior HR AssistantAssistant
OlenaKostenkoSenior HR AssistantAssistant
LaurensGrotenhuisSenior HR ManagerManager

Ahora que he introducido algunas otras funciones, puede que quieras echar un vistazo a otras funciones de texto que pueden serte útiles.

Más información sobre SUBSTRING () y el trabajo con datos de texto

Ahora ya sabes cuándo y cómo usar SUBSTRING(). ¡Es hora de practicar!

Hay otras funciones de texto, no sólo SUBSTRING(). Puedes encontrarlas (¡y muchas más!) en el Funciones estándar de SQL curso.

¿Hasta que no esté seguro de si el curso es para usted? Aquí tienes una descripción detallada de lo que cubre el curso y cómo te ayuda.