Lehet hogy nem mindenkinek mondok újat a mostani bejegyzéssel. Tegnap már sokadjára olyan problémába ütköztem, hogy egy sql tárolt eljárás írása közben a WHERE feltételben nagyon jól jött volna egy IF-ELSE jellegű dolog.
Megpróbálom érthetően leírni mire is gondolok, egy példával szemléltetve.
Csomag listát szeretnék lekérdezni, és a WHERE-ben kell megadnom pl egy ilyen feltételt:
HA kell rá elszámolni Árushelyi jutalékot(feltétel1), akkor kell léteznie már ilyen elszámolásnak(feltétel2). (Magyarul el kellett már számolni, ha egyáltalán el kell számolni, ha nem kell elszámolni, akkor nem érdekes).
Ezt a where-ben így lehet megoldani:
WHERE (feltétel1 = false) OR (feltétel1 = true AND feltétel2 = true)
Idáig még nem is annyira bonyolult. Akkor kezd bonyolulttá válni, ha a feltétel1-et úgy tudom eldönteni, hogy másik 5 feltételt kell vizsgálnom hozzá.
így:
Feltétel1=(feltétel1.0 OR feltétel1.2) AND (feltétel1.3 AND (feltétel1.4 OR feltétel1.5))
Kezd bonyolódni, főleg azért mert mindegyik feltétel1.x vizsgálat bonyolult.
Tehát jó lenne ha csak egyszer kellene megvizsgálni, hogy el kell-e számolni, és amennyiben el kell, akkor meg kell lennie az elszámolásnak, minden más esetben nem érdekes.
Így lenne jó ha lenne:
WHERE
IF(feltétel1 = true)
BEGIN
feltétel2-nek igaznak kell lennie!
END
ELSE nem érdekel az ég világon semmi!
T-SQL-ben ilyet nem lehet (PLSQL-ben sem).
Nekem nem volt annyira egyértelmű (ezért is blogoltam, mert talán másnak sem) mire rájöttem, hogy ezt egy VIEW-val egyszerűen meg lehet oldani. Létrehozunk egy VIEW-t, aminek egy mezőjében visszaadjuk azt, hogy mi a feltétel1 (el kell-e számolni), és egy másik mezőben meg visszaadjuk, hogy az elszámolás megtörtént-e (left join-al, ha nem null akkor megtörtént).
Ezt a VIEW-ban nem annyira nehéz összehozni, és a tárolt eljárásban jelentősen leegyszerűsödik a dolog, és sokkal átláthatóbb, olvashatóbb a kód is.
És ezek után a VIEW segítségével már így le tudom kérdezni, ugyanúgy néz ki mint az elején, csak a bonyolult feltétel vizsgálat a view-ban van, egyszer, és a visszaadott (BIT) mezőt kell csak vizsgálni:
SELECT * FROM view v
WHERE v.feltétel1 = false OR (v.feltétel1 = true AND v.feltétel2 = true)
Megjegyzés: Nem a spanyolviaszt találtam fel, de lehet más is belefut ebbe, ne teljen bele majdnem egy nap fejtörésbe hogy hogyan lehetne egyszerűbben :)
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése