[Java] PreparedStatement met null in where clause

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:11
Een versimpeld voorbeeld:
Ik heb een query, laten we zeggen
SQL:
1
2
SELECT * FROM tabel
WHERE col = ?

Hier mee maak ik een PreparedStatement:
Java:
1
2
3
4
5
PreparedStatement stmt = connection.prepareStatement(SQL_SELECT);
if(id != null)
    stmt.setString(1, id);
else
    stmt.setNull(1, Types.INTEGER);

Nu is mijn probleem dat ik een select wil doen op null values, maar normaal gesproken doe je dat door IS NULL in de where clause te gebruiken. Bovenstaande methode levert dan ook een lege resultset op. Is hier een nette oplossing voor of moet ik echt met 2 aparte queries gaan werken? In de J2SE sdk word ik weinig wijzer, en op google ook al niet.

Roomba E5 te koop


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 14:39
Ja, dit moet met een aparte query.

  • misfire
  • Registratie: Maart 2001
  • Laatst online: 12-10-2024
Het goede antwoord staat er al, maar nog even de uitleg:

In SQL is NULL een speciale waarde, het betekent "ongedefinieerd". NULL = NULL is daarom NULL, omdat ongedefinieerd vergeleken met ongedefinieerd een ongedefinieerd resultaat oplevert. Om expliciet op NULL te testen heb je dus de aparte operator IS NULL nodig. Met prepared statements kun je alleen een waarde aanpassen, maar geen operators, dus hier moet je een aparte query voor maken.

  • DaCoTa
  • Registratie: April 2002
  • Nu online
SQL:
1
2
SELECT * FROM tabel
WHERE (col = ? AND ? = true) OR (col IS NULL AND ? = false)


Zoeken op id: vullen met id, true, false
Zoeken op null: vullen met -1, false, true

Als het goed is kan een redelijke database dit wegoptimaliseren. Het is wel een vieze oplossing, alleen gebruiken als je _echt_ geen 2 queries kunt gebruiken.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:11
Dat wist ik wel, maar ik dacht misschien is Java of de MySQL Driver wel zo slim om het automatisch te doen ofzo. Maar goed heb het al opgelost met een semi-dynamische PreparedStatement :Y)

Roomba E5 te koop