BEGIN TRANSACTION …

(by: Jasmin Azemović)

Demistificirani SQL (2)

with one comment

Nastavljamo sa serijom postova ispitnih zadataka koji se ubrajaju u Hall of Fame :). Sljedeći primjer je klasik u toj kategoriji, gdje se se igramo sa funkcijama za rad sa stringovima koje mogu biti jako korisne. Upit koji slijedi postoji u nekoliko verzija (različite baze podataka), ali poenta je svaki put ista. Primjer glasi nekako ovako:

Vaša kompanija je odlučila da svojim zaposlenicima dodjeli nove email adrese. Za tu svrhu će se iskoristiti postojeći podaci iz korporativne baze podataka. Izlaz treba biti u formatu tri nove kolone: Email, Lozinka i Starost. Pred vas su postavljeni sljedeći uslovi:

  • Email se formira od podataka u kolonama: LastName, FirstName, City i to sljedećem formatu: LastName.Firstname@City.Com (sve malim slovima);
  • Lozinka se formira od podataka iz kolona: Notes, Title i Addeess na sljedeći način. Spajanjam kolona (Notes, Title i Addeess). Sljedeći korak jeste da se sadržaj spajanja okrene obrnuto (reverzno). Nakon toga, iz dobivenog stringa, preskačemo prvih 17 karaketra i uzimamo sljedećih 8. Na pojedinim mjestma će se nalazi znak – (crtica) isti je potrebno zamjeniti sa znakom @
  • Starost se formira na osnovu kolone BirthDate i trenutnog datuma

Uslov je da se mail, lozinka i godina starosti generiše samo za one klijente koji imaju unesenu adresu.

Baza podataka Northwind. (9 zapisa)

Rješenje je:

USE Northwind
SELECT LOWER (LastName + '.' + FirstName + '@' + City + '.com') AS Email,
REPLACE (SUBSTRING ( REVERSE ((CONVERT (nvarchar,Notes)+Title+Address)),17,8), '-', '@') AS Lozinka,
DATEDIFF (year, BirthDate, GETDATE()) AS Godine
FROM dbo.Employees
WHERE Address IS NOT NULL
ORDER BY Godine DESC

Toliko za ovaj put.

END TRANSACTION
Advertisements

Written by Jasmin Azemović

15/09/2011 at 16:03

Posted in Uncategorized

One Response

Subscribe to comments with RSS.

  1. USE Northwind
    SELECT
    LOWER(e.LastName+’.’+e.FirstName+’@’+e.City+’.com’) AS eMail
    , REPLACE(SUBSTRING( REVERSE(CONVERT(nvarchar, e.Notes)+e.Title+e.Address),18,8),’-‘,’@’) AS Lozinka
    , DATEDIFF(year, e.BirthDate, GETDATE()) AS Godine
    FROM
    dbo.Employees e
    WHERE
    e.Address IS NOT NULL

    Moje rjesenje navedenog zadatka se razlikuje od gornjeg u par finesa;
    – ” preskačemo prvih 17 karaketra i uzimamo sljedećih 8″ – SUBSTRING treba ici od 18 (jer preskacemo prvih 17)
    – nigdje nije trazeno sortiranje (tako da nisam stavio ORDER BY) – mozda zvuci glupo ali mozda klijentska aplikacija ocekuje nesortirane podatke

    Benjo

    18/09/2011 at 17:49


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: