[SQL] Probleem met NULL values

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
Ik probeer een tabel te bevragen gebruikmakend van enkele keywords. Nu bevat de kolom 'achternaam' in deze tabel wat waardes(achternamen) en voor de rest een hoop NULL values. Als ik als keyword voor achternaam geen value opgeef retouneert deze query niets, terwijl ik dan toch nog alle opgevraagde usernames zou moeten krijgen. Ik heb al gekeken naar functies als ISNULL etc.. maar deze bieden geen soelaas.


code:
1
2
3
4
SELECT users.username, user.achternaam
FROM users
WHERE ( username LIKE  '%$userName%' ) 
AND ( achternaam LIKE  '%$lastName%' )

Work on time?......Yeah, I admire the concept.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 23-05 14:53
Kan je niet gewoon met je programmeertaal de AND clause weglaten als er geen achternaam is?

  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
djluc schreef op 12 september 2004 @ 16:14:
Kan je niet gewoon met je programmeertaal de AND clause weglaten als er geen achternaam is?
Niet echt elegant :)

Work on time?......Yeah, I admire the concept.


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Integendeel :) Qua performance scheelt de beperking in clausules; zeker met dit soort queries, waarbij er geen index mogelijk is :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
NULL is niet gelijk aan NULL ! Dat is heel belangrijk om te weten, nu begrijp je ook waarom dit niet werkt. Je moet toch een ISNULL functie gebruiken. Wat precies lukte er niet?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Waarom niet? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

djluc schreef op 12 september 2004 @ 16:14:
Kan je niet gewoon met je programmeertaal de AND clause weglaten als er geen achternaam is?
Afhankelijk van het gewenste effect kun je ook "AND achternaam IS NULL" uitgenereren, maar dat zal van de specs afhangen ;)

Verder is het idd wel de correcte oplossing :)

Professionele website nodig?


  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
P_de_B schreef op 12 september 2004 @ 16:19:
NULL is niet gelijk aan NULL ! Dat is heel belangrijk om te weten, nu begrijp je ook waarom dit niet werkt. Je moet toch een ISNULL functie gebruiken. Wat precies lukte er niet?
Dan krijg ik bijvoorbeeld alles users welke matchen met NULL en niet met 'Janssen'.

Work on time?......Yeah, I admire the concept.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ok, je moet dus niet de NULL van de kolom vergelijken met de NULL van de , maar met een vaste waarde.

code:
1
WHERE ISNULL(KolomNaam, 'bla') = COALESCE(Parameter, Kolomnaam, 'bla')

Oops! Google Chrome could not find www.rijks%20museum.nl


  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
Ik kan het simpelweg niet behappen dat het niet gewoon in een enkele query kan. Dit omdat ik een purist ben, en dit soort ingrepen als 'hacks' beschouw. En natuurlijk ook omdat ik wil weten of het uberhaupt wel mogelijk is. (8>

Work on time?......Yeah, I admire the concept.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
theFluke schreef op 12 september 2004 @ 16:28:
[...]


Ik kan het simpelweg niet behappen dat het niet gewoon in een enkele query kan. Dit omdat ik een purist ben, en dit soort ingrepen als 'hacks' beschouw. En natuurlijk ook omdat ik wil weten of het uberhaupt wel mogelijk is. (8>
Ik denk dat juist het in 1 query oplossen een hack is. Door de oplossing die ik geplaatst heb wordt de eventuele index op achternaam niet gebruikt, als je aan de clientkant dit oplost maak je wel gebruik van de index.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

P_de_B schreef op 12 september 2004 @ 16:29:
[...]


Ik denk dat juist het in 1 query oplossen een hack is. Door de oplossing die ik geplaatst heb wordt de eventuele index op achternaam niet gebruikt, als je aan de clientkant dit oplost maak je wel gebruik van de index.
Een index wordt sowieso niet gebruikt :) Immers, er wordt gebruikt gemaakt van '%variabele%' en niet van 'variabele%'

[ Voor 10% gewijzigd door gorgi_19 op 12-09-2004 16:31 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
gorgi_19 schreef op 12 september 2004 @ 16:30:
[...]

Een index wordt sowieso niet gebruikt :) Immers, er wordt gebruikt gemaakt van '%variabele%' en niet van 'variabele%'
heh, dat had ik niet gezien idd. Je hebt gelijk, maar het punt blijft wel staan denk ik. Geen onnodige dingen in je query proppen zodat je bepaalde dingen makkelijker in 1 query krijgt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Wat is er mis met
code:
1
2
WHERE ( username LIKE  '%$userName%' ) 
AND ((achternaam IS NULL) OR (achternaam LIKE  '%$lastName%' ))
:?


Journalism is printing what someone else does not want printed; everything else is public relations.


  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
Bedankt, ik zal eens wat gaan stoeien met COALESCE. Anders ga ik het waarschijnlijk toch maar oplossen met een 'hack' ;)

Work on time?......Yeah, I admire the concept.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Rataplan schreef op 12 september 2004 @ 16:48:
Wat is er mis met
code:
1
2
WHERE ( username LIKE  '%$userName%' ) 
AND ((achternaam IS NULL) OR (achternaam LIKE  '%$lastName%' ))
:?
Niks :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Rataplan schreef op 12 september 2004 @ 16:48:
Wat is er mis met
code:
1
2
WHERE ( username LIKE  '%$userName%' ) 
AND ((achternaam IS NULL) OR (achternaam LIKE  '%$lastName%' ))
:?
Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'WHERE'.
[/flauw]

Maar ik weet niet of dit de gewenste functionaliteit is, als ie alleen lege string wil matchen tegen NULL klopt dit dus niet en zal ie iets intelligenter z'n query moeten construeren :)

Professionele website nodig?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Rataplan schreef op 12 september 2004 @ 16:48:
Wat is er mis met
code:
1
2
WHERE ( username LIKE  '%$userName%' ) 
AND ((achternaam IS NULL) OR (achternaam LIKE  '%$lastName%' ))
:?
Dan geeft ie ook alle velden met een lege achternaam terug als er wel een achternaam is ingevuld. Lijkt me niet de bedoeling. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

curry684 schreef op 12 september 2004 @ 17:00:
Maar ik weet niet of dit de gewenste functionaliteit is, als ie alleen lege string wil matchen tegen NULL klopt dit dus niet en zal ie iets intelligenter z'n query moeten construeren :)
Als ik het goed heb gelezen levert een lege $achternaam in de LIKE geen hits op, en krijgt 'ie in dat geval alleen de records terug waarbij achternaam IS NULL; het enige probleem dat ik zo snel zie is dat je bij het wel opgeven van een achternaam ook matching usernames terugkrijgt waarbij geen achternaam in de DB zit. Maar of dat gewenst gedrag is is idd niet duidelijk.

offtopic:
En ja, nogal flauw ja :P


Journalism is printing what someone else does not want printed; everything else is public relations.


  • theFluke
  • Registratie: Juli 2002
  • Laatst online: 03-12-2023
Maar ik weet niet of dit de gewenste functionaliteit is, als ie alleen lege string wil matchen tegen NULL klopt dit dus niet en zal ie iets intelligenter z'n query moeten construeren :)
U is correct. Ik wil ook een lege string kunnen matchen en zo alle NULL resultaten kunnen weergeven.

Work on time?......Yeah, I admire the concept.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

theFluke schreef op 12 september 2004 @ 17:06:
U is correct. Ik wil ook een lege string kunnen matchen en zo alle NULL resultaten kunnen weergeven.
Overigens, als je het zo graag in één query wil doen, zonder programmeertaal, dan kun je ook wat smerigers doen. Eenmalig deze query draaien:
code:
1
UPDATE users SET achternaam = '' WHERE achternaam IS NULL

Ik zou het zelf niet doen, maar als je dit doet werkt de query in je topicstart wel denk ik. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

NMe84 schreef op 12 september 2004 @ 17:14:
Overigens, als je het zo graag in één query wil doen, zonder programmeertaal, dan kun je ook wat smerigers doen. Eenmalig deze query draaien:
code:
1
UPDATE users SET achternaam = '' WHERE achternaam IS NULL

Ik zou het zelf niet doen, maar als je dit doet werkt de query in je topicstart wel denk ik. :P
Dit is wel fout hoor :) Geen achternaam hebben en geen achternaam opgeven zijn twee verschillende zaken ;)

Dan toch liever $query.=$lastName==''?"achternaam IS NULL":"like, something else!";

/pseudo :)

Of natuurlijk de 100% SQL-oplossing
code:
1
2
3
WHERE ( username LIKE  '%$userName%' ) 
AND (((achternaam IS NULL)AND($lastName='')) 
    XOR (achternaam LIKE  '%$lastName%' ))
Maar het blijft een beetje zinloos om dit voor elk record door SQL uit te laten zoeken als je van te voren al weet wat er in $lastName staat :)

[ Voor 18% gewijzigd door Rataplan op 12-09-2004 17:31 . Reden: achternaam != lastName :| ]


Journalism is printing what someone else does not want printed; everything else is public relations.

Pagina: 1