[ Zidar @ 21.06.2012. 18:44 ] @
Data je tabela #Skole, koja izgleda ovako:
Code:

Skola                        TipSkole
------------------------- -----------
Brace Karic                         1
Dositej Obradovic                   4
Harvard                             1
Mika Alas                           3
Narodni heroji                      0
Oxford                              1
QL Akademija                        2
Vuk Karadzic                        4

(8 row(s) affected)


Kolona [TipSkole] kazuje nam kako je skola finansirana. Tip 1 ili 2 predstavljaju privatne skole. Svi ostali tipovi predstavljaju drzavne skole. Cesto se traze dve vrste upita, koji vracaju:
a) SVE skole iz tabele
b) samo drzavne skole

Napisati skriptu koja koristi parametar @SamoDrzavneSkole u SELECT iskazu, tako da se zavisno od vrednosti parametra dobiju na izlazu SVE skole, ili SAMO DRZAVNE skole. Skripta sme da ima samo jedan SELECT iskaz, odlucivanje o tome sta se pokazuje mora da se desi u WHERE. Parametar @SamoDrzavneSkole moze da ima vrednosti 1 ili 0. Ako je

@SamoDrzavneSkole = 1 => vratiti samo drzavne skole
@SamoDrzavneSkole = 0 => vratiti SVE skole

Pravilno napisana skripta treba da izgleda ovako:
Code:

DECLARE @SamoDrzavneSkole int
;
SET @SamoDrzavneSkole = 1
;
SELECT *
FROM #Skole WHERE @SamoDrzavneSkole = 1
;

Skripta u primeru je pravilna, ali ne daje tacan rezultat.

Vi treba da napisete skriptu koja vraca tacan rezultat, samo jedna SELECT, sve se odlucuje u WHERE.
Skripta treba da vraca tacan rezultat za obe vrednosti parametra 1 ili 0.
Za ostale vrednosti parametra, skripta treba da vrati prazan skup - 0 rows.

Evo je tabela i test podaci.
Code:

IF Object_ID('tempdb..#Skole') IS NOT NULL DROP TABLE #Skole
;
CREATE TABLE #Skole 
(
Skola varchar(25) NOT NULL PRIMARY KEY
, TipSkole int NOT NULL CHECK (TipSkole IN (0,1,2,3,4,5))
)
;

INSERT INTO #Skole (Skola, TipSkole)
SELECT 'Narodni heroji'        ,0
UNION
SELECT 'Vuk Karadzic'        ,4
UNION
SELECT 'Brace Karic'        ,1
UNION
SELECT 'QL Akademija'        ,2
UNION
SELECT 'Dositej Obradovic'    ,4
UNION
SELECT 'Mika Alas'            ,3
UNION
SELECT 'Harvard'            ,1
UNION
SELECT 'Oxford'                ,1
;
-- (8 row(s) affected)

SELECT * FROM #Skole
;




Znam da je vrucina i da se nikome ne radi, ali eto, da se igramo...
:-)
[ Zidar @ 22.06.2012. 13:48 ] @
(Jos uvek nema reseja) => (mnogo je tesko) OR (svi su na plazi) OR (svi gledaju fudbal)

Cekacemo do kraja dana kod mene (ponoc u Beogradu)...

[ djoka_l @ 22.06.2012. 14:42 ] @
Malopre sam video, pa tek sada stavljam (trivijalno) rešenje. U pitanju je Oracle, pa se bind parametri označavaju sa ":"

Code (sql):

SELECT * FROM skole
WHERE :SamoDrzavne = 0
   OR (:SamoDrzavne = 1 AND TipSkole IN (0,3,4,5))
 


[ Zidar @ 22.06.2012. 14:49 ] @
Bravo. Ko zna - zna. Da je trivijalno, vec bi se jos neko javio. Ili je ipak tacno (Svi su na plazi)

Jos uvek nema resenja za MS SQL i ostale sisteme....
[ misk0 @ 07.10.2012. 22:43 ] @
Kasnim poodavno, ali posto sam potrosio pola sata da nadjem pravilnu sintaksu, nek se nadje.

MySQL
Code (sql):

SET @SamoDrzavne = 0;
SELECT * FROM Skole WHERE IF (@SamoDrzavne = 1 , TipSkole IN (0,1) , TipSkole NOT IN (0,1));
 



ps. hvala Zidaru na trudu
[ Koce @ 11.10.2012. 12:38 ] @

MSSQL

Verzija 2:

declare @SamoDrzavne int = 0;
SELECT * FROM [#Skole]
WHERE
(
CASE
WHEN @SamoDrzavne = 1 AND [TipSkole] not in (1,2) THEN 1
WHEN @SamoDrzavne = 0 THEN 1
ELSE 0
END
) = 1


[Ovu poruku je menjao Koce dana 11.10.2012. u 19:48 GMT+1]