Una guía básica para principiantes

¿Quiere concatenar dos o más columnas de cadena en SQL? Aprenda a utilizar la función CONCAT de SQL para concatenar cadenas.

Cuando consulta una tabla de base de datos, es posible que a veces necesite concatenar varias columnas de texto/cadenas en lugar de recuperar datos de una sola columna. Esto es útil cuando necesita un resultado más fácil de interpretar y legible.

Por ejemplo, puede seleccionar un campo de nombre completo concatenando los campos de nombre y apellido. De manera similar, puede obtener la dirección_completa concatenando la calle, la ciudad, el estado y otros campos necesarios.

En SQL, puede utilizar la función CONCAT para concatenar cadenas. En esta guía, repasaremos:

  • La sintaxis de la función SQL CONCAT
  • Ejemplos de uso
  • Manejo de valores NULL en una o más columnas durante la concatenación

¡Empecemos!

Sintaxis de la función CONCAT de SQL

La sintaxis para utilizar la función SQL CONCAT es la siguiente:

CONCAT(string_1, string_2, ..., string_n);

Aquí, cadena_1, cadena_2,…, cadena n denotan las cadenas que se van a concatenar. Pueden ser cadenas literales o columnas o una combinación de ambos.

Concatenar literales de cadena con CONCAT

Debido a que la función CONCAT también se puede usar para concatenar cadenas literales, intentemos codificar un ejemplo simple.

Aquí concatenamos las cadenas ‘Hola’ y ‘¡mundo!’ como cadena de saludo:

SELECT CONCAT('Hello, ', 'world!') AS greeting;

Al ejecutar la consulta anterior obtendrá el siguiente resultado:

+---------------+
| greeting      |
+---------------+
| Hello, world! |
+---------------+
1 row in set (0.00 sec)

En la práctica, sin embargo, es posible que desee concatenar las columnas requeridas en una tabla de base de datos y no cadenas literales. Entonces, codifiquemos algunos ejemplos usando la función CONCAT en SQL.

Cómo concatenar columnas en SQL

A continuación, pasemos a consultar una tabla de base de datos.

📑 Todas las consultas de muestra de este tutorial se ejecutaron en un mysql tabla de base de datos. Pero también puedes seguirlo en otro RDBMS de tu elección.

Crear una tabla de base de datos con registros

Creemos una base de datos que podamos usar:

CREATE DATABASE db1;
use db1;

Creemos una tabla de empleados en la base de datos db1. Para hacerlo, ejecute la instrucción CREATE TABLE con las siguientes columnas y los tipos de datos correspondientes:

CREATE TABLE employees (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    street VARCHAR(100),
    city VARCHAR(50),
    state VARCHAR(2),
    username VARCHAR(20)
);

A continuación, insertemos algunos registros en la tabla de empleados:

INSERT INTO employees (first_name, last_name, street, city, state, username) VALUES
    ('John', 'Smith', '123 Main St', 'New York', 'NY', 'john123'),
    ('Alice', 'Johnson', '456 Elm St', 'Boston', 'MA', 'alice456'),
    ('Bob', 'Williams', '789 Oak St', 'Chicago', 'IL', 'bob789'),
    ('Mary', 'Davis', '321 Pine St', 'Houston', 'TX', 'mary456'),
    ('James', 'Brown', '555 Cedar St', 'Seattle', 'WA', 'james789'),
    ('Emily', 'Jones', '777 Maple St', 'Atlanta', 'GA', 'emily123'),
    ('Michael', 'Miller', '999 Birch St', 'Miami', 'FL', 'michael456'),
    ('Jessica', 'Wilson', '111 Walnut St', 'Dallas', 'TX', 'jessica789'),
    ('William', 'Taylor', '222 Cherry St', 'Denver', 'CO', 'william123'),
    ('Sarah', 'Martinez', '444 Pine St', 'Phoenix', 'AZ', 'sarah456');

Ejemplo 1: mostrar nombres completos

Como primer ejemplo, concatenemos las columnas nombre y apellido para obtener el nombre completo. Para hacerlo, podemos usar la función SQL CONCAT en la consulta SELECT como se muestra:

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

Debería obtener el siguiente resultado:

+----------------+
| full_name      |
+----------------+
| John Smith     |
| Alice Johnson  |
| Bob Williams   |
| Mary Davis     |
| James Brown    |
| Emily Jones    |
| Michael Miller |
| Jessica Wilson |
| William Taylor |
| Sarah Martinez |
+----------------+
10 rows in set (0.00 sec)

Además del nombre y el apellido, observe que también hemos utilizado espacio como separador, especificado por la cadena literal ‘ ‘.

Ejemplo 2: construir direcciones

Ahora tomemos otro ejemplo.

Tenemos las columnas de calle, ciudad y estado en la tabla de empleados. Entonces podemos seleccionar full_address concatenando estos tres campos con una coma como separador:

SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;

Aquí está el resultado:

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| 456 Elm St, Boston, MA    |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.00 sec)

Ejemplo 3: crear URL de perfil

Recuerde que tenemos un campo de nombre de usuario en la tabla de empleados.

Supongamos que tiene un dominio raíz https://www.example.com/ y los perfiles de usuario están en https://www.example.com/user. Puedes generar el perfil_url usando la función CONCAT de esta manera:

SELECT CONCAT('https://www.example.com/user/', username) AS profile_url 
FROM employees;

Como se ve, obtenemos las URL del perfil de todos los empleados:

+-----------------------------------------+
| profile_url                             |
+-----------------------------------------+
| https://www.example.com/user/john123    |
| https://www.example.com/user/alice456   |
| https://www.example.com/user/bob789     |
| https://www.example.com/user/mary456    |
| https://www.example.com/user/james789   |
| https://www.example.com/user/emily123   |
| https://www.example.com/user/michael456 |
| https://www.example.com/user/jessica789 |
| https://www.example.com/user/william123 |
| https://www.example.com/user/sarah456   |
+-----------------------------------------+
10 rows in set (0.00 sec)

Manejo de valores NULL

En la tabla de empleados, todos los registros tienen todos los campos. Pero ¿qué pasa si tienes uno o más campos con valores NULL?

Pongamos un ejemplo para este caso. Aquí actualizamos el registro correspondiente a ID = 2 para establecer la columna de calle en NULL:

UPDATE employees
SET street = NULL
WHERE ID = 2; -- Update the record with ID 2
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Ahora usamos CONCAT para seleccionar la dirección_completa:

SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;

Aquí está el resultado:

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| NULL                      |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.00 sec)

Observe que el segundo elemento del conjunto de resultados es NULL.

Pero nos hubiera gustado que el resultado fuera la concatenación de las columnas de ciudad y estado para tener una idea aproximada de la dirección. Cuando tenga dichos valores NULL, puede usar CONCAT_WS como alternativa a la función CONCAT. Vamos a ver cómo funciona.

Uso de CONCAT_WS para manejar valores NULL durante la concatenación

CONCAT_WS es una alternativa a CONCAT que se puede utilizar si sospecha que uno o más campos contienen valores NULL.

Puedes usar la función CONCAT_WS así:

CONCAT_WS(separator, string_1, string_2,..., string_n)

Ahora ejecute la siguiente consulta SELECT:

SELECT CONCAT_WS(', ', street, city, state) AS full_address FROM employees;

Obtendrá el siguiente resultado:

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| Boston, MA                |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.01 sec)

Como se ve, para el segundo elemento del conjunto de resultados, obtenemos ‘Boston MA’ ya que el campo de la calle es NULL.

⚠ Cuando se utiliza CONCAT_WS, es necesario especificar el separador. Si no especifica el separador, el resultado es NULL si una o más columnas son NULL (similar a CONCAT).

Terminando

Repasemos lo que hemos aprendido:

  • Cuando consulta una tabla de base de datos para recuperar datos, es posible que desee concatenar varias columnas de cadena para obtener resultados de consulta más útiles y fáciles de interpretar. Para hacerlo, puede utilizar la función CONCAT en SQL con la sintaxis CONCAT(cadena_1, cadena_2,…, cadena_n).
  • Puede concatenar cadenas literales, columnas o una combinación de ambas. Sin embargo, si hay uno o más valores NULL, el resultado para ese registro en particular es NULL. Para manejar esto, puede usar CONCAT_WS con la sintaxis CONCAT_WS(separador, cadena_1, cadena_2,…, cadena_n).
  • CONCAT_WS maneja valores NULL de manera más elegante al concatenar solo aquellas cadenas que están presentes usando el separador especificado.

Para una revisión rápida de los comandos SQL y su uso, puede marcar esta hoja de referencia de SQL.