Ønsker du å kombinere to eller flere tekstkolonner i SQL? Oppdag hvordan du benytter SQL CONCAT-funksjonen for å sammenslå tekststrenger.
Ved forespørsler mot en databasetabell, kan det være nødvendig å kombinere flere tekst- eller strengkolonner, istedenfor å hente data fra en enkelt kolonne. Dette er spesielt nyttig når du ønsker et utdata som er lettere å forstå og mer lesbart.
For eksempel kan et felt som «fullt_navn» konstrueres ved å kombinere feltene for «fornavn» og «etternavn». På samme måte kan en «full_adresse» genereres ved å sette sammen «gate», «by», «stat» og andre relevante felt.
I SQL kan du benytte CONCAT-funksjonen for å kombinere tekststrenger. I denne veiledningen vil vi utforske:
- Syntaksen for SQL CONCAT-funksjonen
- Konkrete eksempler på bruk
- Håndtering av NULL-verdier i en eller flere kolonner ved sammenslåing
La oss begynne!
Syntaks for SQL CONCAT-funksjonen
Syntaksen for å bruke SQL CONCAT-funksjonen er som følger:
CONCAT(streng_1, streng_2, ..., streng_n);
Her angir streng_1, streng_2, …, streng_n de tekststrengene som skal sammenslås. Disse kan være tekstliteraler, kolonner eller en kombinasjon av begge.
Kombinere tekstliteraler med CONCAT
Siden CONCAT-funksjonen også kan benyttes til å kombinere tekstliteraler, la oss se på et enkelt eksempel.
Her slår vi sammen tekststrengene «Hei,» og «verden!» for å generere en hilsen:
SELECT CONCAT('Hei, ', 'verden!') AS hilsen;
Ved å utføre denne spørringen, får vi følgende utdata:
hilsen |
Hei, verden! |
I praksis vil det ofte være mer relevant å kombinere kolonner fra en databasetabell enn tekstliteraler. La oss derfor undersøke noen eksempler på bruk av CONCAT-funksjonen i SQL.
Slik kombineres kolonner i SQL
Nå skal vi se på spørringer mot en databasetabell.
📑 Alle eksempler i denne veiledningen er utført på en MySQL database. Du kan imidlertid følge med i et annet RDBMS etter eget valg.
Opprette en databasetabell med innhold
La oss lage en database som vi kan bruke:
CREATE DATABASE db1;
use db1;
La oss nå opprette en «ansatte»-tabell i databasen «db1». For å gjøre dette, utfør CREATE TABLE-setningen med følgende kolonner og tilhørende datatyper:
CREATE TABLE ansatte ( ID INT AUTO_INCREMENT PRIMARY KEY, fornavn VARCHAR(50), etternavn VARCHAR(50), gate VARCHAR(100), by VARCHAR(50), stat VARCHAR(2), brukernavn VARCHAR(20) );
Deretter setter vi inn noen få oppføringer i «ansatte»-tabellen:
INSERT INTO ansatte (fornavn, etternavn, gate, by, stat, brukernavn) 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');
Eksempel 1: Vise fullt navn
Som et første eksempel, la oss slå sammen «fornavn» og «etternavn» kolonnene for å få «fullt_navn». For å gjøre det, kan vi benytte SQL CONCAT-funksjonen i SELECT-spørringen som vist:
SELECT CONCAT(fornavn, ' ', etternavn) AS fullt_navn FROM ansatte;
Dette gir følgende utdata:
fullt_navn |
John Smith |
Alice Johnson |
Bob Williams |
Mary Davis |
James Brown |
Emily Jones |
Michael Miller |
Jessica Wilson |
William Taylor |
Sarah Martinez |
I tillegg til «fornavn» og «etternavn», ser vi at vi også har inkludert et mellomrom som skilletegn – representert ved tekststrengen « «.
Eksempel 2: Konstruere adresser
La oss ta et annet eksempel.
Vi har kolonnene «gate», «by» og «stat» i «ansatte»-tabellen. Vi kan kombinere disse tre feltene med et komma som skilletegn for å få «full_adresse»:
SELECT CONCAT(gate, ', ', by, ', ', stat) AS full_adresse FROM ansatte;
Her er utdata:
full_adresse |
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 |
Eksempel 3: Opprette profil-URLer
Husk at vi har et felt for brukernavn i «ansatte»-tabellen.
La oss anta at du har et rotdomene på https://www.example.com/ og at brukerprofiler er tilgjengelige på https://www.example.com/user. Du kan generere en «profil_url» ved å benytte CONCAT-funksjonen på følgende måte:
SELECT CONCAT('https://www.example.com/user/', brukernavn) AS profil_url FROM ansatte;
Som vi ser, får vi profil-URLer for alle ansatte:
profil_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 |
Håndtering av NULL-verdier
I «ansatte»-tabellen har alle oppføringene verdier i alle feltene. Men hva skjer hvis ett eller flere felter inneholder NULL-verdier?
La oss illustrere dette med et eksempel. Vi oppdaterer oppføringen som tilsvarer ID = 2, og setter «gate»-kolonnen til NULL:
UPDATE ansatte SET gate = NULL WHERE ID = 2; -- Oppdater oppføringen med ID 2
Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0
Nå bruker vi CONCAT for å hente «full_adresse»:
SELECT CONCAT(gate, ', ', by, ', ', stat) AS full_adresse FROM ansatte;
Her er utdata:
full_adresse |
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 |
Vi ser at det andre elementet i resultatsettet er NULL.
Vi ønsker imidlertid å kombinere «by» og «stat» kolonnene for å få en indikasjon på adressen. Når du har slike NULL-verdier, kan du benytte CONCAT_WS som et alternativ til CONCAT-funksjonen. La oss se hvordan det fungerer.
Bruk av CONCAT_WS for å håndtere NULL-verdier under sammenslåing
CONCAT_WS er et alternativ til CONCAT som kan være nyttig hvis du mistenker at ett eller flere felter inneholder NULL-verdier.
Du kan bruke CONCAT_WS-funksjonen som følger:
CONCAT_WS(separator, streng_1, streng_2,..., streng_n)
Utfør nå følgende SELECT-spørring:
SELECT CONCAT_WS(', ', gate, by, stat) AS full_adresse FROM ansatte;
Dette gir følgende utdata:
full_adresse |
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 |
Som vi ser, for det andre elementet i resultatsettet, får vi «Boston, MA» ettersom gate-feltet er NULL.
⚠ Ved bruk av CONCAT_WS, er det nødvendig å spesifisere et skilletegn. Hvis du ikke spesifiserer et skilletegn, vil resultatet bli NULL hvis en eller flere kolonner er NULL (samme som med CONCAT).
Oppsummering
La oss gå gjennom det vi har lært:
- Når du utfører spørringer mot en databasetabell for å hente data, kan det være hensiktsmessig å kombinere flere tekstkolonner for å oppnå mer informative og enklere tolkelige resultater. Du kan bruke CONCAT-funksjonen i SQL med syntaksen CONCAT(streng_1, streng_2, …, streng_n) for å gjøre dette.
- Du kan kombinere tekstliteraler, kolonner eller en blanding av begge. Imidlertid, hvis det finnes en eller flere NULL-verdier, vil resultatet for den aktuelle oppføringen bli NULL. For å håndtere dette kan du bruke CONCAT_WS med syntaksen CONCAT_WS(separator, streng_1, streng_2, …, streng_n).
- CONCAT_WS håndterer NULL-verdier på en mer elegant måte, ved kun å sammenslå de tekststrengene som faktisk har en verdi, og benytter det definerte skilletegnet.
For en rask oversikt over SQL-kommandoer og deres bruk, kan du lagre dette SQL-juksearket som bokmerke.