Izračunavanje dužine stringa korišćenjem funkcija LEN() i DATALENGTH()
Objavljeno: 14-01-2014 | Autor: Žana (Jovana) Baćović | Kategorija: Funkcije, T-SQL
0
SQL funkcije LEN() i DATALENGTH() služe za izračunavanje dužine stringa.
Potrebno je biti oprezan prilikom njihovog korišćenja, imati u vidu da se različito ponašaju sa različitim tipovima podataka, kao i da različito tretiraju blanko znakove na kraju stringa.
Funkcija LEN()
Za izračuvanje dužine stringa, SQL Server koristi nekoliko ugrađenih funkcija. Funkcija koja se najčešće koristi je LEN().
Primjer: Definišimo promjenljivu tipa nvarchar i izračunajmo njenu dužinu.
DECLARE @DuzinaNVARCHAR NVARCHAR(20) = 'SQL Kefalo' SELECT LEN(@DuzinaNVARCHAR)
Rezultat je 10, kao što je očekivano.
LEN ignoriše blanko znakove na kraju stringa
Ukoliko na kraju promjenljive dodamo blanko znakove, rezultat će ostati nepromijenjen jer funkcija LEN ignoriše blanko znakove na kraju stringa.
Primjer:
DECLARE @DuzinaNVARCHAR NVARCHAR(20) = 'SQL Kefalo ' SELECT LEN(@DuzinaNVARCHAR)
Rezultat je 10.
Ukoliko se blanko znakovi nalaze na početku ili unutar stringa, LEN će ih izbrojati.
Programeri nekada previde ovakvo ponašanje, pa koriste LEN i za poređenje stringova kod kojih pojavljivanje ili nepojavljivanje blanko znakova na kraju stringa jeste od značaja.
Zašto LEN ignoriše blanko znakove na kraju?
SQL Server se ponaša u skladu sa ANSI/ISO SQL-92 specifikacijom. ANSI standard zahtijeva automatsko punjenje stringova koji se upoređuju, tako da se njihove dužine uparuju prije poređenja.
Konkretnije, osim što i mi često želimo da vršimo poređenje stvarno popunjenih podataka, ovakvo ponašanje ignoriše automatsko popunjavanje praznih mjesta kod tipova fiksne dužine, kao što je CHAR.
Primjer: Ako imamo 2 promjenljive tipa CHAR(10), od kojih je prva popunjenja sa 6 karaktera, a druga sa 7, LEN će prikazati dužinu 6 za prvu, a 7 za drugu, a ne 10 za obje, iako CHAR vrši popunjavanje sa blanko znakovima do fiksne dužine.
DECLARE @PrvaDuzinaCHAR CHAR(10) = 'Kefalo' ,@DrugaDuzinaCHAR CHAR(10) = 'Kefalo2' SELECT LEN(@PrvaDuzinaCHAR), LEN(@DrugaDuzinaCHAR)
Popunjavanje sa blanko znakovima za tipove fiksne dužine može jasno da se vidi ako pokušamo da izračunamo dužinu ovih promjenljivih kada im se doda jedan karakter.
DECLARE @PrvaDuzinaCHAR CHAR(10) = 'Kefalo' ,@DrugaDuzinaCHAR CHAR(10) = 'Kefalo2' SELECT LEN(@PrvaDuzinaCHAR + 'a'), LEN(@DrugaDuzinaCHAR + 'a')
Rezultat je 11 za obje promjenljive, odnosno fiksna dužina 10 plus 1.
Ukoliko bi promljenljive iz prethodnog primjera bile tipa NVARCHAR(10) ili VARCHAR(10), onda ne bi bilo automatskog popunjavanja sa blanko znakovima pa bi sledeći upit:
DECLARE @PrvaDuzinaCHAR NVARCHAR(10) = 'Kefalo' ,@DrugaDuzinaCHAR NVARCHAR(10) = 'Kefalo2' SELECT LEN(@PrvaDuzinaCHAR), LEN(@DrugaDuzinaCHAR) ,LEN(@PrvaDuzinaCHAR + 'a'), LEN(@DrugaDuzinaCHAR + 'a')
dao rezultat 6, 7, 7, 8 tj.
Moguće je zaobići ignorisanje blanko znakova na kraju stringa, tako što se uradi njihova zamjena sa nekim karakterom, pa se onda primijeni funkcija LEN.
Primjer: Definišimo promjenljivu koja ima 9 karaktera i 3 blanko znaka na kraju, a potom primijenimo funkciju LEN nakon zamjene blanko znaka sa karakterom ‘x’.
DECLARE @Duzina NVARCHAR(20) = 'SQLKefalo ' SELECT LEN(REPLACE(@Duzina,' ','x'))
Rezultat će biti 12.
Ovdje treba da vodite računa kada radite sa tipom CHAR, da će dužina nakon zamjene blanko znakova nekim karakterom biti koliko i definisana dužina tipa. U sledećem primjeru je to 20.
Primjer:
DECLARE @Duzina CHAR(20) = 'SQLKefalo ' SELECT LEN(REPLACE(@Duzina,' ','x'))
LEN od NULL je NULL tj. sledeći upit daje rezultat NULL:
SELECT LEN(NULL)
Funkcija DATALENGTH()
Za izračunavanje dužine stringa postoji i funkcija DATALENGTH, koja za razliku od LEN ne radi ignorisanje blanko znakova ni na kraju stringa.
Još jedna bitna razlika između LEN i DATALENGTH je u tome što LEN računa broj karaktera, dok DATALENGTH izračunava broj bajtova.
Ovo se najbolje može vidjeti na primjeru 3 promjenljive različitog tipa tj. NVARCHAR, VARCHAR i CHAR.
Primjer:
DECLARE @DuzinaNVARCHAR NVARCHAR(20) = 'SQL Kefalo', @DuzinaVARCHAR VARCHAR(20) = 'SQL Kefalo', @DuzinaCHAR CHAR(20) = 'SQL Kefalo' SELECT DATALENGTH(@DuzinaNVARCHAR), DATALENGTH(@DuzinaVARCHAR) ,DATALENGTH(@DuzinaCHAR)
Rezultat će biti 20, 10 i 20 respektivno, odnosno broj bajtova koji zauzimaju promjenljive.
Ukoliko promjenljivim iz prethodnog primjera dodamo i blanko znak na kraju, rezultat će biti promijenjen kod promjenljivih tipa NVARCHAR(20) i VARCHAR(20) jer su one varijabilne dužine.
Primjer:
DECLARE @DuzinaNVARCHAR NVARCHAR(20) = 'SQL Kefalo ', @DuzinaVARCHAR VARCHAR(20) = 'SQL Kefalo ', @DuzinaCHAR CHAR(20) = 'SQL Kefalo ' SELECT DATALENGTH(@DuzinaNVARCHAR), DATALENGTH(@DuzinaVARCHAR) ,DATALENGTH(@DuzinaCHAR)
Rezultat je 22, 11 i 20.
DATALENGTH od NULL daje, kao i kod funkcije LEN, rezultat NULL.