Behöver du kombinera flera textkolumner i SQL? Upptäck hur SQL-funktionen CONCAT används för att sammanfoga strängar.
Vid databashantering kan behov uppstå att slå ihop data från flera textkolumner istället för att bara hämta information från en enda. Detta underlättar presentationen av mer överskådliga och läsbara resultat.
Ett exempel är att skapa ett fullständigt namn genom att förena förnamns- och efternamnsfälten. Likaså kan en komplett adress konstrueras genom att kombinera gatuadress, ort, region och andra relevanta fält.
SQL:s CONCAT-funktion är verktyget för att kombinera strängar. Denna handledning kommer att guida dig genom:
- Syntaxen för SQL CONCAT-funktionen
- Praktiska exempel
- Hantera förekomsten av NULL-värden i kolumner vid sammanslagning
Låt oss börja utforska detta!
Syntax för SQL CONCAT-funktionen
Här följer syntaxen för SQL CONCAT:
CONCAT(strang_1, strang_2, ..., strang_n);
Variablerna strang_1, strang_2, …, strang_n representerar de strängar som ska sammanfogas. Dessa kan vara textuttryck, kolumner eller en blandning av båda.
Sammanfoga textsträngar med CONCAT
Eftersom CONCAT-funktionen kan användas för att kombinera textsträngar, kan vi börja med ett grundläggande exempel.
Vi kommer att sammanfoga strängarna ’Hej,’ och ’världen!’ för att bilda en hälsningsfras:
SELECT CONCAT('Hej, ', 'världen!') AS halsning;
Detta SQL-uttryck genererar följande output:
+---------------+ | halsning | +---------------+ | Hej, världen! | +---------------+ 1 rad i resultatet (0.00 sek)
I praktiken är det troligare att du vill sammanfoga databasens kolumner, inte bara textsträngar. Därför ska vi gå vidare och studera exempel där vi använder CONCAT med kolumner.
Hur man sammanfogar kolumner i SQL
Nu går vi vidare till att ställa frågor till en databas.
📑 De SQL-uttryck som används i den här handledningen körs på en MySQL databas. Du kan även följa med med valfritt annat RDBMS.
Skapa en databastabell med data
Först skapar vi en ny databas:
CREATE DATABASE db1;
use db1;
Låt oss nu skapa en tabell för anställda i databasen db1. Vi använder CREATE TABLE-uttrycket med följande kolumner och datatyper:
CREATE TABLE anstallda ( ID INT AUTO_INCREMENT PRIMARY KEY, fornamn VARCHAR(50), efternamn VARCHAR(50), gata VARCHAR(100), ort VARCHAR(50), region VARCHAR(2), anvandarnamn VARCHAR(20) );
Därefter infogar vi några poster i tabellen:
INSERT INTO anstallda (fornamn, efternamn, gata, ort, region, anvandarnamn) VALUES ('John', 'Smith', '123 Storgatan', 'Stockholm', 'ST', 'john123'), ('Alice', 'Johnson', '456 Allégatan', 'Göteborg', 'VG', 'alice456'), ('Bob', 'Williams', '789 Ekgränd', 'Malmö', 'SK', 'bob789'), ('Mary', 'Davis', '321 Tallvägen', 'Uppsala', 'UP', 'mary456'), ('James', 'Brown', '555 Lönngatan', 'Västerås', 'VS', 'james789'), ('Emily', 'Jones', '777 Björkvägen', 'Örebro', 'OR', 'emily123'), ('Michael', 'Miller', '999 Aspgatan', 'Linköping', 'OG', 'michael456'), ('Jessica', 'Wilson', '111 Valnötsvägen', 'Helsingborg', 'KL', 'jessica789'), ('William', 'Taylor', '222 Körsbärsgränd', 'Jönköping', 'JN', 'william123'), ('Sarah', 'Martinez', '444 Furuvägen', 'Norrköping', 'ÖG', 'sarah456');
Exempel 1: Visa fullständiga namn
Låt oss som första exempel kombinera kolumnerna fornamn och efternamn för att få fullstandigt_namn. Detta gör vi genom att använda SQL CONCAT-funktionen i en SELECT-fråga:
SELECT CONCAT(fornamn, ' ', efternamn) AS fullstandigt_namn FROM anstallda;
Detta ger oss följande resultat:
+-----------------+ | fullstandigt_namn | +-----------------+ | John Smith | | Alice Johnson | | Bob Williams | | Mary Davis | | James Brown | | Emily Jones | | Michael Miller | | Jessica Wilson | | William Taylor | | Sarah Martinez | +-----------------+ 10 rader i resultatet (0.00 sek)
Observera att vi förutom för- och efternamn även inkluderat ett blanksteg som avgränsare – specificerat med textsträngen ’ ’.
Exempel 2: Konstruera adresser
Låt oss ta ett annat exempel.
Vi har kolumnerna gata, ort och region i tabellen anställda. Vi kan hämta en fullstandig_adress genom att sammanfoga dessa tre fält med ett kommatecken som avgränsare:
SELECT CONCAT(gata, ', ', ort, ', ', region) AS fullstandig_adress FROM anstallda;
Här är resultatet:
+---------------------------------+ | fullstandig_adress | +---------------------------------+ | 123 Storgatan, Stockholm, ST | | 456 Allégatan, Göteborg, VG | | 789 Ekgränd, Malmö, SK | | 321 Tallvägen, Uppsala, UP | | 555 Lönngatan, Västerås, VS | | 777 Björkvägen, Örebro, OR | | 999 Aspgatan, Linköping, OG | | 111 Valnötsvägen, Helsingborg, KL | | 222 Körsbärsgränd, Jönköping, JN | | 444 Furuvägen, Norrköping, ÖG | +---------------------------------+ 10 rader i resultatet (0.00 sek)
Exempel 3: Skapa profilwebbadresser
Vi har också en kolumn för användarnamn i tabellen.
Tänk att du har en basadress https://www.exempel.se/ och att användarprofiler finns på https://www.exempel.se/anvandare. Du kan skapa profile_url med CONCAT-funktionen på detta vis:
SELECT CONCAT('https://www.exempel.se/anvandare/', anvandarnamn) AS profile_url FROM anstallda;
Detta ger oss alla användarprofilers webbadresser:
+--------------------------------------------+ | profile_url | +--------------------------------------------+ | https://www.exempel.se/anvandare/john123 | | https://www.exempel.se/anvandare/alice456 | | https://www.exempel.se/anvandare/bob789 | | https://www.exempel.se/anvandare/mary456 | | https://www.exempel.se/anvandare/james789 | | https://www.exempel.se/anvandare/emily123 | | https://www.exempel.se/anvandare/michael456 | | https://www.exempel.se/anvandare/jessica789 | | https://www.exempel.se/anvandare/william123 | | https://www.exempel.se/anvandare/sarah456 | +--------------------------------------------+ 10 rader i resultatet (0.00 sek)
Hantera NULL-värden
I tabellen anställda har alla poster värden i alla fält. Men vad händer om ett eller flera fält innehåller NULL?
Vi undersöker det med ett exempel. Vi uppdaterar posten med ID = 2 och sätter gatufältet till NULL:
UPDATE anstallda SET gata = NULL WHERE ID = 2; -- Uppdatera posten med ID 2
Query OK, 1 rad påverkad (0.05 sek) Rader matchade: 1 Ändrade: 1 Varningar: 0
Nu använder vi CONCAT för att hämta fullständig adress:
SELECT CONCAT(gata, ', ', ort, ', ', region) AS fullstandig_adress FROM anstallda;
Och detta blir resultatet:
+---------------------------------+ | fullstandig_adress | +---------------------------------+ | 123 Storgatan, Stockholm, ST | | NULL | | 789 Ekgränd, Malmö, SK | | 321 Tallvägen, Uppsala, UP | | 555 Lönngatan, Västerås, VS | | 777 Björkvägen, Örebro, OR | | 999 Aspgatan, Linköping, OG | | 111 Valnötsvägen, Helsingborg, KL | | 222 Körsbärsgränd, Jönköping, JN | | 444 Furuvägen, Norrköping, ÖG | +---------------------------------+ 10 rader i resultatet (0.00 sek)
Lägg märke till att det andra resultatet i uppsättningen är NULL.
Vi hade istället velat att resultatet skulle vara en sammanslagning av ort- och regionkolumnerna för att få en ungefärlig adress. När du har NULL-värden kan CONCAT_WS användas som ett alternativ till CONCAT-funktionen. Låt oss se hur det fungerar.
Använda CONCAT_WS för att hantera NULL-värden vid sammanfogning
CONCAT_WS är ett alternativ till CONCAT om du vet att en eller flera kolumner kan innehålla NULL-värden.
CONCAT_WS-funktionen används på följande sätt:
CONCAT_WS(avgransare, strang_1, strang_2,..., strang_n)
Kör nu följande SELECT-fråga:
SELECT CONCAT_WS(', ', gata, ort, region) AS fullstandig_adress FROM anstallda;
Detta ger följande resultat:
+---------------------------------+ | fullstandig_adress | +---------------------------------+ | 123 Storgatan, Stockholm, ST | | Göteborg, VG | | 789 Ekgränd, Malmö, SK | | 321 Tallvägen, Uppsala, UP | | 555 Lönngatan, Västerås, VS | | 777 Björkvägen, Örebro, OR | | 999 Aspgatan, Linköping, OG | | 111 Valnötsvägen, Helsingborg, KL | | 222 Körsbärsgränd, Jönköping, JN | | 444 Furuvägen, Norrköping, ÖG | +---------------------------------+ 10 rader i resultatet (0.01 sek)
Som vi ser får vi för den andra posten ’Göteborg, VG’ eftersom gatufältet är NULL.
⚠ När du använder CONCAT_WS måste du ange en avgränsare. Om du inte anger en avgränsare blir resultatet NULL om en eller flera kolumner är NULL (likt CONCAT).
Sammanfattning
Låt oss repetera det vi har lärt oss:
- När du begär data från en databastabell kan det vara användbart att sammanfoga textkolumner för att få mer begripliga och användbara resultat. Detta kan göras med CONCAT-funktionen i SQL med syntaxen CONCAT(sträng_1, sträng_2, …, sträng_n).
- Du kan sammanfoga textsträngar, kolumner eller en kombination. Men om det finns en eller flera NULL-värden i en post kommer resultatet för just den posten att vara NULL. För att undvika det kan du använda CONCAT_WS med syntaxen CONCAT_WS(avgränsare, sträng_1, sträng_2, …, sträng_n).
- CONCAT_WS hanterar NULL-värden smidigt genom att endast sammanfoga de tillgängliga strängarna med den givna avgränsaren.
För en snabb genomgång av SQL-kommandon kan du spara denna SQL-spickzettel.