Vinnaren i pepparkakshustävlingen!
2013-01-31, 14:16
  #1
Medlem
atitaranta-s avatar
Kan någon förklara varför
Kod:
SELECT x FROM y WHERE a 'z' AND 'z' 
ger samma resultat som
Kod:
SELECT x FROM y WHERE (OR b) = 'z' 
?

Och
Kod:
SELECT x FROM y WHERE a 'z' OR 'z' 
samma som
Kod:
SELECT x FROM y WHERE (AND b) = 'z' 
?
Citera
2013-01-31, 15:18
  #2
Medlem
atitaranta-s avatar
Annars skulle jag helt enkelt kunna formulera det så här:

Hur formulerar jag

SELECT x FROM y WHERE a = ? OR b = ? OR c = ?

i mer komprimerad form så att jag slipper binda samma värde flera gånger (? representerar samma värde i samtliga fall)?
Citera
2013-01-31, 15:36
  #3
Moderator
Protons avatar
De Morgan kan förklara det:

http://sv.wikipedia.org/wiki/De_Morgans_lagar
Citera
2013-01-31, 22:02
  #4
Medlem
John-Pauls avatar
Är det detta du frågar efter?
and: where a=b and a='z'
or: where 'z' in (a,b)
__________________
Senast redigerad av John-Paul 2013-01-31 kl. 22:05.
Citera
2013-01-31, 23:08
  #5
Medlem
atitaranta-s avatar
Citat:
Ursprungligen postat av John-Paul
or: where 'z' in (a,b)

Tack, jag trodde att IN bara funkade tvärtom (KOLUMN IN ('värde1','värde2')). Men detta var ju inte så dumt.

Finns det något liknande sätt att komprimera SELECT x FROM y WHERE a LIKE 'z%' OR b LIKE 'z%'?
Citera
2013-01-31, 23:21
  #6
Medlem
atitaranta-s avatar
Citat:
Ursprungligen postat av atitaranta-
Citat:
Ursprungligen postat av John-Paul
or: where 'z' in (a,b)
Tack, jag trodde att IN bara funkade tvärtom (KOLUMN IN ('värde1','värde2')). Men detta var ju inte så dumt.

Finns det något liknande sätt att komprimera SELECT x FROM y WHERE a LIKE 'z%' OR b LIKE 'z%'?

Jag noterar en skillnad vid negativa sökningar.

where a != 'z' OR b != 'z' ger träffar både på tomma fält och NULL-fält, medan

where 'z' not in (a,b)

inte returnerar rader där a och/eller b är NULL. Det går visserligen att lätt att lösa genom att lägga till "or a is null or b is null", men det leder mig ändå till frågan om jag kommer att stöta mycket sådant här där det är en väsentlig skillnad mellan NULL och tomma fält vartefter jag lär mig och vilket som i så fall är bäst att använda generellt för fält som saknar värde.
Citera
2013-02-01, 10:44
  #7
Medlem
atitaranta-s avatar
Citat:
Ursprungligen postat av atitaranta-
Jag noterar en skillnad vid negativa sökningar.

where a != 'z' OR b != 'z' ger träffar både på tomma fält och NULL-fält, medan

where 'z' not in (a,b)

inte returnerar rader där a och/eller b är NULL. Det går visserligen att lätt att lösa genom att lägga till "or a is null or b is null", men det leder mig ändå till frågan om jag kommer att stöta mycket sådant här där det är en väsentlig skillnad mellan NULL och tomma fält vartefter jag lär mig och vilket som i så fall är bäst att använda generellt för fält som saknar värde.

http://stackoverflow.com/questions/1...r-empty-string är kanske svar nog.
Citera
2013-02-01, 12:01
  #8
Medlem
atitaranta-s avatar
Å tredje sidan känns

"WHERE (land NOT LIKE :plats OR land IS NULL) AND (landskap NOT LIKE :plats OR landskap IS NULL) AND (laen NOT LIKE :plats OR laen IS NULL) AND (fastighet NOT LIKE :plats OR fastighet IS NULL) AND (kvarter NOT LIKE :plats OR kvarter IS NULL) AND (gata NOT LIKE :plats OR gata IS NULL)"

lite onödigare än

"WHERE NOT (land LIKE :plats OR landskap LIKE :plats OR laen LIKE :plats OR fastighet LIKE :plats OR kvarter LIKE :plats OR gata LIKE :plats)"

Synpunkter på det? T.ex. någon märkbar skillnad i snabbhet?
Citera
2013-02-01, 13:14
  #9
Medlem
Använd Coalesce för att lösa dina problem med Null.
Citera
2013-02-01, 16:12
  #10
Medlem
John-Pauls avatar
Citat:
Ursprungligen postat av atitaranta-
Tack, jag trodde att IN bara funkade tvärtom (KOLUMN IN ('värde1','värde2')). Men detta var ju inte så dumt.

Finns det något liknande sätt att komprimera SELECT x FROM y WHERE a LIKE 'z%' OR b LIKE 'z%'?

IN (expression)

Återkommer ev. ang. LIKE

NULL är ett kapitel för sig, kortfattat och generellt gäller:
Okänt och därmed aldrig likt något annat, inte ett annat okänt heller givetvis utan endast likt "special" NULL.
Motivera alltid kolumner/variabler som deklareras nullable, och, ofta kan och ska man ha en default/ett substitut för nulls, ex: okända numeriska och monetära värden substitueras med 0 osv (som default i C# ungefär), SQL=isnull(kolumn/variabel etc.,substitut), coalesce(...) m.fl.
Som princip: Använd inte en kolumn/variabel som kan vara null utan att ta hänsyn till det samma.
__________________
Senast redigerad av John-Paul 2013-02-01 kl. 16:30.
Citera
2013-02-01, 16:45
  #11
Medlem
John-Pauls avatar
Citat:
Ursprungligen postat av atitaranta-
Jag noterar en skillnad vid negativa sökningar.

where a != 'z' OR b != 'z' ger träffar både på tomma fält och NULL-fält, medan

where 'z' not in (a,b)

inte returnerar rader där a och/eller b är NULL. Det går visserligen att lätt att lösa genom att lägga till "or a is null or b is null", men det leder mig ändå till frågan om jag kommer att stöta mycket sådant här där det är en väsentlig skillnad mellan NULL och tomma fält vartefter jag lär mig och vilket som i så fall är bäst att använda generellt för fält som saknar värde.

Ja, du kommer givetvis stöta på nulls i samma utsträckning som det förekommer.
Det är ingen "skillnad på tomma fält och alla andra värden", det är nullables som du måste hantera. Det uppenbara och enklaste är givetvis att det inte förekommer och när det förekommer så måste du alltså ta hänsyn till det.

OR och negation är en klassiker, undvik helst det, speciellt i flera led.
Ofta kan du vända på hela steken och köra utan negering och sedan köra negering på hela uttrycket vilket ofta är tydligare och enklare att förstå.
Ex.
Är (Bananen inte grön eller bananen inte brun eller bananen inte svart)
Inte (Bananen är grön eller bananen är brun eller bananen är svart)
Hellre/oftare/lättare med/tydligare/... "selektering" än "exkludering"
__________________
Senast redigerad av John-Paul 2013-02-01 kl. 16:57.
Citera
2013-02-04, 12:51
  #12
Medlem
atitaranta-s avatar
Ok, tack för alla svar. Det går framåt ... men ytterligare frågor kommer, varav en nu genast, fast i en egen tråd där den kanske bättre hör hemma, även om "Syntaxfråga" är allmänt nog att rymma det mesta.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback