MySQL divide la cadena en filas

Migel Hewage Nimesha 15 febrero 2024
  1. Dividir cadena en filas en MySQL
  2. Dividir cadena en filas utilizando el método SUBSTRING_INDEX()
  3. Conclusión
MySQL divide la cadena en filas

MySQL almacena datos en columnas y filas de tablas, y los usuarios pueden definir, controlar, manipular y consultar esos datos. MySQL nos brinda varias características, y una característica que podemos tener es dividir cadenas en filas.

Este artículo analiza la división de una cadena en filas, sus usos y cómo realizarla en MySQL.

Dividir cadena en filas en MySQL

Cuando manipulamos los datos en las bases de datos, a veces interactuamos con cadenas. Por ejemplo, una tabla puede incluir los nombres completos de los clientes, sus direcciones y algunas descripciones.

A veces, agregamos esos datos como cadenas y es posible que necesitemos dividirlos en filas para varios propósitos. Para lograr este objetivo, MySQL nos proporciona un método, SUBSTRING_INDEX().

Dividir cadena en filas utilizando el método SUBSTRING_INDEX()

SUBSTRING_INDEX() es una característica que MySQL nos proporciona para derivar una subcadena de una cadena. Comprueba un delimitador específico, por lo que se generará la subcadena anterior.

La sintaxis es la siguiente:

SUBSTRING_INDEX(string, delimiter, number);

En la sintaxis anterior, hay tres parámetros. La cadena se refiere a la fila que ingresamos para derivar subcadenas, y el delimitador es el valor que buscará la función.

El número de veces que se buscará el delimitador se denomina número. El número puede ser un número positivo o un número negativo.

Si es un número positivo, dejaremos la subcadena en el delimitador desde el frente hacia atrás de la cadena. Si es un número negativo, llevaremos la subcadena directamente al delimitador y comenzaremos a buscar el delimitador desde atrás hacia adelante de la cadena.

Probemos un ejemplo.

SELECT SUBSTRING_INDEX('England, America, Japan, China',',',2) AS newp;

Como se muestra arriba, hemos dado una cadena que contiene cuatro países separados por comas. Luego como delimitador ha pasado la coma, y como número le asignamos dos.

Veamos el resultado.

Producción:

MySQL divide la cadena en filas - Salida 1

Como puede ver, obtenemos la subcadena a la izquierda de la segunda coma ya que hemos dado dos como número. Intentemos esto de nuevo con un número negativo en cuanto a número.

SELECT SUBSTRING_INDEX('England, America, Japan, China',',',-1) AS newp;

A continuación se muestra el resultado del código anterior y, como puede ver, obtenemos China como salida porque le hemos dado -1 como número y, dado que es un número negativo, buscó el último delimitador y generó la subcadena correcta. lo.

Producción:

MySQL divide la cadena en filas - Salida 2

Ahora, veamos cómo podemos dividir una cadena en filas usando este método. Consulte el siguiente ejemplo.

DELIMITER //

-- Creating a procedure
CREATE procedure newProcedure()

BEGIN
-- Declaring a variable as myvar to store the string
DECLARE myvar varchar (300);

-- Assigning the string to the variable
SET myvar = 'China.Japan.USA';

-- Deriving the substrings
(SELECT SUBSTRING_INDEX(myvar, '.', 1) AS Countries)
UNION
(SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(myvar, '.', 2),'.','-1') AS Countries)
UNION
(SELECT SUBSTRING_INDEX(myvar, '.', -1) AS Countries);
END //
DELIMITER ;

-- Calling the procedure
CALL newProcedure()

En el código anterior, creamos un procedimiento llamado nuevoProcedimiento y luego declaramos una variable para almacenar la cadena. La cadena contiene símbolos de punto final para que sea nuestro delimitador.

Hemos usado el método SUBSTING_INDEX cuatro veces (dos veces en el medio para obtener la subcadena del medio) y UNION para tener esas subcadenas en una sola columna. Por fin, hemos llamado a nuestro procedimiento y el resultado se muestra a continuación.

Producción:

MySQL divide la cadena en filas - Salida 3

Hemos dividido la cadena en filas, pero este código será un desafío cuando tengamos más de tres símbolos de punto final.

Para superar este problema, podemos construir una solución. Primero, podemos crear una tabla con una sola columna que incluya nombres de países.

Los nombres de países que agregamos tienen más de un nombre ya que necesitamos dividir el nombre completo. Vamos a crear una tabla que tenga tres nombres de países de la siguiente manera.

CREATE TABLE countries (countryName VARCHAR(100));
INSERT INTO countries VALUES
('United States America'),
('New Zeland'),
('United Kingdom');

Ahora vamos a crear otra tabla llamada numberList, que incluye uno, dos y tres como datos.

CREATE TABLE numberList (indexing INT);
INSERT INTO numberList VALUES (1),(2),(3);

El propósito de esta tabla es establecer un número máximo de subcadenas para dividir. Hemos agregado tres dígitos y, cuando se ejecuta el código, divide la cadena en un máximo de tres subcadenas, incluso si tiene cuatro subcadenas dentro de la línea.

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(countries.countryName, ' ', numberList.indexing), ' ', -1) countryName
FROM numberList
INNER JOIN countries
ON CHAR_LENGTH (countries.countryName) -CHAR_LENGTH(REPLACE(countries.countryName, ' ', '')) >= numberList.indexing - 1

En el fragmento de código anterior, hemos utilizado la función SUBSTRING_INDEX, y dentro de ella, la hemos puesto como delimitador para buscar, ya que los nombres de los países están separados por espacios. Luego verificamos si los nombres de los países tienen más de tres subcadenas.

Después de eso, imprimimos las subcadenas en filas.

Código completo:

-- Creating the table
CREATE TABLE countries (countryName VARCHAR(100));

-- Inserting values
INSERT INTO countries VALUES
('United States America'),
('New Zeland'),
('United Kingdom');

-- Create a table that contains the numbers
CREATE TABLE numberList (indexing INT);
INSERT INTO numberList VALUES (1),(2),(3);

-- Deriving the substrings
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(countries.countryName, ' ', numberList.indexing), ' ', -1) countryName
FROM numberList
INNER JOIN countries
ON CHAR_LENGTH (countries.countryName) -CHAR_LENGTH(REPLACE(countries.countryName, ' ', '')) >= numberList.indexing - 1

A continuación se muestra el resultado que obtenemos después de ejecutar el código.

Producción:

MySQL divide la cadena en filas - Salida 4

Como puede ver, los nombres de los países se dividen en subcadenas, como esperábamos.

Conclusión

A través de este artículo, tuvimos una breve introducción a MySQL. Luego aprendimos por qué necesitamos dividir una cadena en filas y cómo hacerlo en MySQL.

Para lograr el objetivo, MySQL nos proporcionó el método SUBSTRING_INDEX y vimos cómo usarlo para completar la tarea.

Existen otros métodos para realizar esta tarea, como la función STRING_SPLIT, pero la técnica que discutimos en este artículo es la mejor en MySQL.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

Artículo relacionado - MySQL String

Artículo relacionado - MySQL Row