Основни водич за почетнике

Da li želite da spojite dve ili više kolona tekstualnih podataka u SQL-u? Naučite kako da koristite SQL funkciju CONCAT za spajanje stringova.

Kada vršite upit nad tabelom baze podataka, ponekad je neophodno kombinovati više tekstualnih kolona umesto da preuzimate podatke samo iz jedne kolone. Ovo je posebno korisno kada želite da dobijete izlaz koji je lakši za razumevanje i čitanje.

Na primer, možete kreirati polje puno_ime kombinovanjem polja ime i prezime. Slično, možete generisati punu_adresu kombinovanjem ulice, grada, države i drugih relevantnih polja.

U SQL-u, funkcija CONCAT se koristi za spajanje stringova. U ovom vodiču, razmotrićemo:

  • Sintaksu SQL funkcije CONCAT
  • Primere upotrebe
  • Kako se nositi sa NULL vrednostima u jednoj ili više kolona tokom spajanja

Počnimo!

Sintaksa SQL CONCAT funkcije

Sintaksa za upotrebu SQL funkcije CONCAT je sledeća:

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

Ovde, string_1, string_2, …, string_n predstavljaju nizove koje treba spojiti. To mogu biti doslovni nizovi, kolone, ili kombinacija oba.

Spajanje doslovnih stringova sa CONCAT

Pošto se CONCAT funkcija može koristiti i za spajanje doslovnih stringova, hajde da isprobamo jednostavan primer.

Ovde spajamo stringove ‘Zdravo, ‘ i ‘svete!’ da bismo dobili pozdravnu poruku:

SELECT CONCAT('Zdravo, ', 'svete!') AS pozdrav;

Izvršavanjem gornjeg upita, dobićete sledeći rezultat:

pozdrav
Zdravo, svete!

U praksi, verovatno ćete želeti da spojite kolone iz tabele baze podataka, a ne doslovne stringove. Pogledajmo nekoliko primera upotrebe CONCAT funkcije u SQL-u.

Kako spojiti kolone u SQL-u

Sada, hajde da istražimo tabelu baze podataka.

📑 Svi primeri upita u ovom vodiču su izvršeni na MySQL bazi podataka. Međutim, možete pratiti primere i na drugim RDBMS sistemima po vašem izboru.

Kreiranje tabele baze podataka sa podacima

Napravimo bazu podataka koju možemo koristiti:

CREATE DATABASE db1;
use db1;

Hajde da kreiramo tabelu zaposlenih u bazi podataka db1. Da bismo to uradili, izvršimo naredbu CREATE TABLE sa sledećim kolonama i odgovarajućim tipovima podataka:

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

Zatim, ubacimo nekoliko zapisa u tabelu zaposlenih:

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

Primer 1: Prikazivanje punih imena

Kao prvi primer, spojimo kolone first_name i last_name kako bismo dobili puno_ime. Da bismo to uradili, možemo koristiti SQL CONCAT funkciju u SELECT upitu kao što je prikazano:

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

Trebalo bi da dobijete sledeći izlaz:

full_name
John Smith
Alice Johnson
Bob Williams
Mary Davis
James Brown
Emily Jones
Michael Miller
Jessica Wilson
William Taylor
Sarah Martinez

Pored imena i prezimena, primetite da smo koristili i razmak kao separator—naveden kao doslovni string ‘ ‘.

Primer 2: Konstruisanje adresa

Pogledajmo sada još jedan primer.

U tabeli zaposlenih imamo kolone za ulicu, grad i državu. Dakle, možemo izabrati punu_adresu spajanjem ova tri polja sa zarezom kao separatorom:

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

Evo izlaza:

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

Primer 3: Kreiranje URL-ova profila

Podsetimo se da imamo polje korisničkog imena u tabeli zaposlenih.

Recimo da imate osnovni domen https://www.example.com/, a profili korisnika su na https://www.example.com/user. Profil_url možete generisati pomoću funkcije CONCAT na sledeći način:

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

Kao što se vidi, dobijamo URL-ove profila za sve zaposlene:

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

Rukovanje NULL vrednostima

U tabeli zaposlenih, svi zapisi imaju popunjena sva polja. Ali šta ako imate jedno ili više polja sa NULL vrednostima?

Uzmimo primer za ovaj slučaj. Ovde ažuriramo zapis koji odgovara ID = 2 kako bismo postavili kolonu ulice na NULL:

UPDATE employees
SET street = NULL
WHERE ID = 2; -- Ažuriranje zapisa sa ID-jem 2
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Sada koristimo CONCAT da izaberemo punu_adresu:

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

Evo izlaza:

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

Primetićete da je drugi element u rezultatu NULL.

Ali mi bismo želeli da rezultat bude spajanje kolona grada i države kako bismo dobili grubu predstavu o adresi. Kada imate takve NULL vrednosti, možete koristiti CONCAT_WS kao alternativu funkciji CONCAT. Pogledajmo kako to funkcioniše.

Upotreba CONCAT_WS za rukovanje NULL vrednostima tokom spajanja

CONCAT_WS je alternativa funkciji CONCAT koja se može koristiti ako sumnjate da jedno ili više polja sadrži NULL vrednosti.

Funkciju CONCAT_WS možete koristiti na sledeći način:

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

Sada izvršite sledeći SELECT upit:

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

Dobićete sledeći izlaz:

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

Kao što vidite, za drugu stavku u rezultatu dobijamo ‘Boston, MA’ jer je polje ulice NULL.

⚠ Kada koristite CONCAT_WS, neophodno je navesti separator. Ako ne navedete separator, rezultat će biti NULL ukoliko je jedna ili više kolona NULL (slično kao kod CONCAT).

Zaključak

Hajde da rezimiramo ono što smo naučili:

  • Kada postavljate upite nad bazom podataka za preuzimanje podataka, možda ćete poželeti da spojite više kolona stringova da biste dobili korisnije rezultate upita koji su laki za interpretaciju. Za to možete koristiti funkciju CONCAT u SQL-u sa sintaksom CONCAT(string_1, string_2, …, string_n).
  • Možete spojiti doslovne stringove, kolone ili kombinaciju oba. Međutim, ukoliko postoji jedna ili više NULL vrednosti, rezultat za taj određeni zapis biće NULL. Da biste rešili ovaj problem, možete koristiti CONCAT_WS sa sintaksom CONCAT_WS(separator, string_1, string_2, …, string_n).
  • CONCAT_WS elegantnije obrađuje NULL vrednosti tako što spaja samo one stringove koji su prisutni pomoću navedenog separatora.

Za brzi pregled SQL naredbi i njihove upotrebe, možete pogledati ovaj SQL Cheat Sheet.