ugrás a tartalomhoz

Hogy lehet SQLben feltételt szabni?

TIV · 2009. Júl. 22. (Sze), 16.25
Sziasztok!

A következőkhöz kérnék egy kis segítséget...

ELSŐ PROBLÉMA

van egy oszlopom 1 darab karakter LEHET benne... pl... r, a, c.. ha nincs benne semmi, akkor NULL. amikor csinálok egy feltételt WHERE mezo != 'r' akkor csak az 'a' és 'c' mezőket hozza le. a NULLás termékeket nem. Ezért mindig WHERE mezo != 'r' OR mezo IS NULL feltételeket kell adnom. nincs ennél egyszerűbb megoldás?

MÁSODIK PROBLÉMA

termekek tábla
-------------
nev       db  a   b  
termek1   5   0   m
termek2   0   1   m
termek3   3   0   m


szeretném lekérdezni azokat a termékeket, amelyeknél b=m, de hogyha az a=1, akkor db legyen nagyobb 0-nál. (tehát mivel a-nál 1 van és a db 0, ezért a második terméket ne listázza ki) hogy kell ezt megoldani sqlben?

egy nagyon béna megoldásként azt csináltam, hogy WHERE (b=m AND a != 1) OR (b=m AND a=1 AND db>0 ) de hátha van ennél egyszerűbb. ráadásul ha elolvassa valaki az első problémámat, akkor rájön h az a!=1 feltétel két részből áll.

Előre is köszönöm a segítséget!
 
1

WHERE

Poetro · 2009. Júl. 22. (Sze), 18.02
WHERE mezo != 'r' OR mezo IS NULL feltételeket kell adnom. nincs ennél egyszerűbb megoldás?

Nekem eléggé egyszerűnek tűnik a megoldás. Mondjuk sokkal szebb lenne, ha nem tárolnál NULL értéket, csak mondjuk üres stringet vagy egy space-t (' '), és akkor nem kellene az OR.
WHERE b = 'm' AND (a <> 1 OR db > 0)
Persze ez lehet kevésbé tűnik egyértelműnek mint a te megoldásod.
3

Nem jó

TIV · 2009. Júl. 23. (Cs), 08.17
Köszönöm válaszod, de ez sajnos nem jó. Az általad írt feltétel arra alapszik, hogy csak olyan termékeket listázzon ki, amiből legalább 1 darab van. Pontosítom mit szeretnék:

Listázzon ki minden terméket, ahol b='m', AKKOR IS HA NULLA DARAB VAN BELŐLE! DE HA a sorban a='1' van, akkor ellenőrizze, hogy db nagyobb-e nullánál és ha igen, hozza!

Tehát minden termék kell (b='m'), kivétel ez alól az a=1 termékek, mert náluk legalább 1 darabnak kell lenni.

Előre is köszönöm a segítséget!
5

Pont ezt csinálja

vbence · 2009. Júl. 23. (Cs), 10.01
Poerto megoldása ezt csinálja: Veszi a b='m' rekordokat, azobelül pedig azokat ahol VAGY a != 1 VAGY ahol a=1 ÉS a darabszám nagyobb nullánál.
6

nem éppen

gex · 2009. Júl. 23. (Cs), 11.11
VAGY ahol a=1
mondjuk ez pont nincs benne. ha jól látom még nem volt róla szó hogy "a" milyen értékeket vehet fel. ha 0-n és 1-en kívül más is lehet akkor:

    WHERE b = 'm' AND (a != 1 OR a = 1 AND db > 0)
7

a = 1 AND

vbence · 2009. Júl. 23. (Cs), 11.27
WHERE b = 'm' AND (a != 1 OR a = 1 AND db > 0)

A kijelölt rész fölösleges, hiszen, az OR utáni rész csak a = 1 esetén értékelődik ki.
8

MEGOLDÁS

TIV · 2009. Júl. 23. (Cs), 17.40
valóban ;)

MEGOLDÁS:
WHERE b = 'm' AND (a != 1 OR db > 0)
10

lol

gex · 2009. Júl. 24. (P), 16.49
most mégegyszer végigolvsva nem tudom minek írtam ilyen másnaposan egyáltalán. :D

szerk: most akartam megírni hogy közben végiggondoltam tiszta fejjel és rájöttem hogy "a" null értéke esetén igenis kell az a = 1 feltétel, mert null != 1 eredménye null lesz, ami hamisként értékelődik ki, de látom Poetro megelőzött.
viszont a kérdezőnek ez egy nagyon jó példa volt a null értékek használatának hátulütőiről.
9

NULL

Poetro · 2009. Júl. 23. (Cs), 18.47
Már ha feltételezzük, hogy az a nem lehet NULL, ahogyan én is feltételeztem. Ha NULL is lehet, akkor további feltételt lehet tenni, bár nem volt kitétel, hogy mi történjen akkor, ha a IS NULL
2

ifnull

gex · 2009. Júl. 22. (Sze), 21.36
WHERE mezo != 'r' OR mezo IS NULL feltételeket kell adnom. nincs ennél egyszerűbb megoldás?
lehet hogy van olyan ami kevesebb karakterből áll, de lehet hogy lassabb lesz, pl:

    WHERE IFNULL(mezo, '') != 'r'
+1 a "sokkal szebb lenne, ha nem tárolnál NULL értéket"-nek.
4

végülis akkor megvan a megoldás

TIV · 2009. Júl. 23. (Cs), 08.28
akkor szerintem ez a legegyszerűbb mód:

b='m' AND (IFNULL(a, '') != '1' OR (a='1' AND db>0))

tud ennél valaki jobbat?