08.10. Implicitna i eksplicitna konverzija podataka
0. Ovo nam treba za ostatak lekcije:
Kreiranje i popunjavanje tabela
-- Kreiranje tabele Proizvodi
CREATE TABLE Proizvodi (
ProizvodID INT PRIMARY KEY,
Naziv VARCHAR(50),
Cena DECIMAL(10,2)
);
-- Popunjavanje tabele Proizvodi
INSERT INTO Proizvodi (ProizvodID, Naziv, Cena) VALUES
(1, 'Hleb', 60.00),
(2, 'Mleko', 120.00),
(3, 'Sir', 450.00),
(4, 'Sok', 150.00),
(5, 'Kafa', 500.00);
-- Kreiranje tabele Ucenici
CREATE TABLE Ucenici (
UcenikID INT PRIMARY KEY,
Ime VARCHAR(30),
Prezime VARCHAR(30),
Razred INT
);
-- Popunjavanje tabele Ucenici
INSERT INTO Ucenici (UcenikID, Ime, Prezime, Razred) VALUES
(1, 'Marko', 'Markovic', 3),
(2, 'Ana', 'Jovanovic', 4),
(3, 'Nikola', 'Petrovic', 2),
(4, 'Ivana', 'Stojanovic', 1),
(5, 'Petar', 'Milosavljevic', 3),
(6, 'Milica', 'Ilic', 2),
(7, 'Jovan', 'Savic', 4),
(8, 'Katarina', 'Zoric', 1);
1. (ponavljanje) Izvedene kolone i ograničavanje broja rezultata
Pitanje: Šta su izvedene kolone?
Izvedene kolone su kolone koje ne postoje fizički u tabeli, već se izračunavaju iz postojećih podataka.
Koriste se u SELECT upitima kada želimo da prikažemo dodatne vrednosti (npr. cenu sa porezom, prosečnu ocenu, zbir, procenat i sl.).
Primer:
SELECT Naziv, Cena, Cena * 1.2 AS CenaSaPorezom
FROM Proizvodi;
U ovom slučaju, kolona CenaSaPorezom ne postoji u tabeli, već se računa tokom izvršavanja upita.
Ograničavanje broja prikazanih redova
U SQL Server-u koristimo ključnu reč TOP da ograničimo broj rezultata.
SELECT TOP 5 * FROM Ucenici;
U ovom slučaju se kao rezultat prikazuje samo prvih 5 redova iz tabele.
Možemo prikazati i procenat redova:
SELECT TOP 10 PERCENT * FROM Ucenici;
Vežbe
- Prikazati sve proizvode sa osnovnom i obračunatom cenom sa PDV-om od 20%.
- Prikazati samo prva 3 proizvoda.
- Prikazati 20% učenika iz tabele.
SELECT Naziv, Cena, Cena * 1.2 AS CenaSaPDV FROM Proizvodi;
SELECT TOP 3 * FROM Proizvodi;
SELECT TOP 20 PERCENT * FROM Ucenici;
2. Implicitna i eksplicitna konverzija podataka
Konverzija znači pretvaranje jednog tipa podatka u drugi (npr. broja u tekst, teksta u datum, itd.).
Konverzija se koristi da bi se osigurao ispravan rad upita kada se rade operacije s različitim tipovima podataka (npr. ako postoji potreba da se brojčane vrednosti prebace u tekst ili decimalni brojevi u celobrojne vrednosti).
Pojam implicitna i eksplicitna konverzija podataka odnosi se na automatsko ili ručno prebacivanje podataka između različitih tipova.
U osnovi:
-
Implicitna konverzija je kada sistem automatski konvertuje jedan tip podataka u drugi.
-
Eksplicitna konverzija je kada korisnik (ili programer) eksplicitno navede funkcije za konverziju podataka.
2.1. Implicitna konverzija
SQL Server automatski pretvara tipove kada je to moguće.
SELECT 5 + '3' AS Rezultat;
U ovom slučaju, '3' je tekst, ali SQL ga automatski pretvara u broj, pa je rezultat 8.
Primeri kada se koristi implicitna konverzija podataka su najčešće spajanje različitih tipova ili poređenje vrednosti. Treba da se napomene da SQL Server bira "viši tip" da bi izraz bio kompatibilan:
2.1.1. Iza dugmeta su: . . . pravila implicitne konverzije
-
SQL Server koristi prioritet tipova podataka:
-
int<decimal<float<nvarchar -
Niži tip se konvertuje u viši tip automatski.
-
-
Konverzija radi samo kada je logički moguća:
-
'123'→ INT ✅ -
'abc'→ INT ❌ → greška
-
-
Neki tipovi se ne mogu implicitno konvertovati:
-
TEXT→INT❌ -
DATETIME→BIT❌
-
2.2. Eksplicitna konverzija
Programer namerno određuje kako se tip menja, pomoću funkcije CAST
Eksplicitna (ili doslovna) konverzija je kada programer u upitu jasno navede da želi da pretvori vrednost iz jednog tipa podataka u drugi. To se razlikuje od implicitne konverzije koju SQL automatski radi “iza kulisa”, kada su tipovi kompatibilni (npr. int + decimal).
Primer:
SELECT CAST('2025-09-24' AS datetime) AS Datum;
Standardna funkcija za eksplicitnu konverziju je
CAST
Sintaksa:
CAST ( izraz AS ciljni_tip [ (duzina) ] )
-
izrazmože biti kolona, literal, rezultat izraza. -
ciljni_tipje tip u koji želimo konvertovati (npr. INT, VARCHAR(50), DECIMAL(10,2), DATETIME itd.). -
Opciono, za tipove karaktera ili binarne tipove, navodi se dužina (npr.
VARCHAR(20)).
Primeri:
-- Pretvaranje teksta u broj
SELECT CAST('123' AS INT) AS Broj;
-- Pretvaranje broja u decimal sa dve decimale
SELECT CAST(123 AS DECIMAL(10,2)) AS DecBroj;
-- Pretvaranje datuma (tekst) u DATETIME
SELECT CAST('2025-10-08 14:30:00' AS DATETIME) AS DatumVreme;
Ako konverzija nije moguća (npr. tekst "ABC" → INT), dobiće se greška.
Koje kombinacije konverzije su moguće?
-
Tekst (VARCHAR / CHAR / NVARCHAR) ↔ Brojevi (INT, DECIMAL)
-
Tekst ↔ Datum / DATETIME
-
Brojevi međusobno (INT ↔ DECIMAL, FLOAT ↔ DECIMAL)
-
Datum / DATETIME ↔ tekst
-
Binarni tipovi (VARBINARY / BINARY) ↔ drugi binarni tipovi
-
Među numeričkim tipovima, moguće je konvertovanje, ali može doći do gubitka preciznosti ili zaokruživanja
Ako konverzija nije moguća ili se podaci ne uklapaju (npr. tekst “bla” u INT), dobiće se greška.
Primeri:
- String → DECIMAL → INT:
SELECT CAST(CAST('1234.78' AS DECIMAL(10,2)) AS INT) AS CelaVrednost; - Kombinovanje u izrazu:
SELECT
Naziv + ' ima cenu: ' +
CAST(Cena * 1.2 AS VARCHAR(10))
AS Opis
FROM Proizvodi;
Vežbe
1️⃣ Izvršiti sledeći upit:
SELECT 10 + '5';
Objasniti zašto rezultat nije greška.
2️⃣ Pretvoriti broj 1234 u tekst pomoću CAST.
3️⃣ Iz tabele Ucenici napraviti kolonu u kojoj će pisati poruka:
„[Ime] [Prezime] – učenik razreda [Razred]“.
-- Zadatak 1
Rezultat je 15 jer SQL automatski pretvara tekst '5' u broj.
-- Zadatak 2
SELECT CAST(1234 AS varchar) AS Tekst;
-- Zadatak 3
SELECT Ime, Prezime,
' ' + Ime + ' ' + Prezime + ' - učenik razreda ' +
CONVERT(varchar, Razred) AS Opis
FROM Ucenici;
Vežbe za samostalni rad
-
Napisati upit koji računa 10% popusta na cenu proizvoda.
-
Izvesti konverziju iz teksta u DATETIME proizvoljnog datuma:
SELECT CAST('2025-01-01' AS datetime); -
Napravi upit koji prikazuje proizvode i kolonu „Cena bez PDV-a“ (pretpostavi da je PDV 20%).
-
Pretvoriti
Razredu tekst i prikazat poruku „Učenik je u [razred].“