En grundläggande guide för nybörjare

Vill du sammanfoga två eller flera strängkolumner i SQL? Lär dig hur du använder SQL CONCAT-funktionen för att sammanfoga strängar.

När du frågar en databastabell kan du ibland behöva sammanfoga flera text-/strängkolumner istället för att hämta data från en enda kolumn. Detta är användbart när du behöver en mer lätttolkad och läsbar utdata.

Du kan till exempel välja ett fullständigt namn-fält genom att sammanfoga fälten förnamn och efternamn. På samma sätt kan du få full_address genom att sammanfoga gata, stad, stat och andra nödvändiga fält.

I SQL kan du använda CONCAT-funktionen för att sammanfoga strängar. I den här guiden går vi igenom:

  • Syntaxen för SQL CONCAT-funktionen
  • Användningsexempel
  • Hanterar NULL-värden i en eller flera kolumner under sammanlänkning

Låt oss börja!

Syntax för SQL CONCAT-funktionen

Syntaxen för att använda SQL CONCAT-funktionen är följande:

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

Här betecknar sträng_1, sträng_2, …, sträng n strängarna som ska sammanfogas. Dessa kan vara strängliteraler eller kolumner eller en kombination av båda.

Sammanfoga strängbokstavar med CONCAT

Eftersom CONCAT-funktionen också kan användas för att sammanfoga strängliteraler, låt oss försöka koda ett enkelt exempel.

Här sammanfogar vi strängarna ’Hello,’ och ’world!’ som hälsningssträngen:

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

Om du kör ovanstående fråga får du följande utdata:

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

I praktiken kanske du kanske vill sammanfoga de obligatoriska kolumnerna i en databastabell och inte strängliteraler. Så låt oss koda några exempel med CONCAT-funktionen i SQL.

Hur man sammanfogar kolumner i SQL

Låt oss sedan gå vidare till att fråga efter en databastabell.

📑 Alla exempelfrågor i denna handledning kördes på en MySQL databastabell. Men du kan också följa med i ett annat RDBMS du väljer.

Skapa en databastabell med poster

Låt oss skapa en databas som vi kan använda:

CREATE DATABASE db1;
use db1;

Låt oss skapa en personaltabell i databasen db1. För att göra det, kör CREATE TABLE-satsen med följande kolumner och motsvarande datatyper:

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)
);

Låt oss sedan infoga några poster i personaltabellen:

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');

Exempel 1: Visa fullständiga namn

Som ett första exempel, låt oss sammanfoga kolumnerna first_name och last_name för att få full_name. För att göra det kan vi använda SQL CONCAT-funktionen i SELECT-frågan som visas:

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

Du bör få följande utdata:

+----------------+
| 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)

Utöver förnamn och efternamn, lägg märke till att vi också har använt mellanslag som avgränsare – specificerat av den bokstavliga strängen ’ ’.

Exempel 2: Konstruera adresser

Låt oss nu ta ett annat exempel.

Vi har kolumnerna gata, stad och delstat i tabellen för anställda. Så vi kan välja full_address genom att sammanfoga dessa tre fält med ett kommatecken som avgränsare:

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

Här är utgången:

+---------------------------+
| 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)

Exempel 3: Skapa profilwebbadresser

Kom ihåg att vi har ett användarnamnsfält i tabellen för anställda.

Säg att du har en rotdomän https://www.example.com/ och användarprofiler finns på https://www.example.com/user. Du kan skapa profile_url med CONCAT-funktionen så här:

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

Som sett får vi profilwebbadresserna för alla anställda:

+-----------------------------------------+
| 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)

Hantera NULL-värden

I personaltabellen har alla poster alla fält. Men vad händer om du har ett eller flera fält med NULL-värden?

Låt oss ta ett exempel för det här fallet. Här uppdaterar vi posten som motsvarar ID = 2 för att ställa in gatukolumnen till 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

Nu använder vi CONCAT för att välja den fullständiga adressen:

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

Här är utgången:

+---------------------------+
| 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)

Observera att det andra elementet i resultatuppsättningen är NULL.

Men vi skulle ha önskat att resultatet var sammanlänkningen av staden och statens kolumner för att få en ungefärlig uppfattning om adressen. När du har sådana NULL-värden kan du använda CONCAT_WS som ett alternativ till CONCAT-funktionen. Låt oss se hur det fungerar.

Använda CONCAT_WS för att hantera NULL-värden under sammanlänkning

CONCAT_WS är ett alternativ till CONCAT som kan användas om du misstänker att ett eller flera fält innehåller NULL-värden.

Du kan använda CONCAT_WS-funktionen så här:

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

Kör nu följande SELECT-fråga:

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

Du får följande utdata:

+---------------------------+
| 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)

Som sett, för den andra posten i resultatuppsättningen, får vi ’Boston MA’ eftersom gatufältet är NULL.

⚠ När du använder CONCAT_WS måste du ange separatorn. Om du inte anger separatorn blir resultatet NULL om en eller flera kolumner är NULL (liknar CONCAT).

Avslutar

Låt oss granska vad vi har lärt oss:

  • När du frågar en databastabell för att hämta data, kanske du vill sammanfoga flera strängkolumner för att få mer användbara och lätttolkade frågeresultat. För att göra det kan du använda CONCAT-funktionen i SQL med syntaxen CONCAT(sträng_1, sträng_2, …, sträng_n).
  • Du kan sammanfoga strängliteraler, kolumner eller en kombination av båda. Men om det finns ett eller flera NULL-värden är resultatet för den specifika posten NULL. För att hantera detta kan du använda CONCAT_WS med syntaxen CONCAT_WS(separator, sträng_1, sträng_2, …, sträng_n).
  • CONCAT_WS hanterar NULL-värden mer elegant genom att sammanfoga endast de strängar som finns med den angivna avgränsaren.

För snabb granskning av SQL-kommandon och deras användning kan du bokmärka detta SQL Cheat Sheet.