5th Dec 2022 Lectura de 8 minutos La función de subcadena de SQL en 5 ejemplos Tihomir Babic SQL aprender SQL text functions Índice ¿Qué es la función SUBSTRING()? ¿Cómo funciona SUBSTRING()? Ejemplo 1: Subcadena de una cadena literal La tabla de empleados Ejemplo 2: Subcadena de una columna Ejemplo 3: Subcadena sin el argumento de longitud Ejemplo 4: POSITION() y CHARINDEX() Ejemplo 5: LENGTH() + POSITION() Más información sobre SUBSTRING () y el trabajo con datos de texto ¿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í: 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. Tags: SQL aprender SQL text functions