Ergebnis 1 bis 8 von 8

Thema: jdbc - PreparedStatement mit "select..where abc =/is null"

  1. #1

    jdbc - PreparedStatement mit "select..where abc =/is null"

    Folgendes Problem:
    Ich möchte ein Select auf einer MySQL Datenbank ausführen, z.B. "select * from object where abc = ? and def = ?" wobei die beiden attribute durchaus auch null sein dürfen. Angeblich kann man bei Oracle Datenbanken einfach die Werte mit setNull() auf null setzen, bei MySQL scheint das aber nicht zu funktionieren. Die Datenbank hätte in dem Fall gerne ein "is" statt ein "=".
    Lässt sich eine Abfrage mit Attributen die null oder != null sein können mit PreparedStatements machen oder muss ich auf normale Statements umsteigen?

  2. #2
    Ich gehe mal davon aus, daß die Webentwickler sich mehr mit MySQL auskennen und schiebe dehalb den Thread da rüber.

  3. #3
    Ich würde halt einfach im Programmcode prüfen, ob der Wert null ist und wenn ja, dann benutzt man halt ein anderes Statement (mit "is null") als wenn nicht (dann halt "= ?").

  4. #4
    Ich verstehe nicht genau was dein Problem ist, bei Oracle gibts auch den "IS NULL" Operator.
    Ich habe zwar vom Praktikum noch in Erinnerung, dass es eine bessere Variante gibt, aber folgendes sollte eigentlich klappen:
    Code (SQL):
     
    SELECT *
    FROM TABLE_NAME
    WHERE
    (abc = "ljkdfl" OR abc IS NULL) AND
    (def = "ccasf" OR def IS NULL)
     

  5. #5
    @Irian
    PreparedStatements sind bei der Lösung schonmal ausgeschlossen weil ich dann gleich 2^(Anzahl der Attribute) davon bräuchte um alle Fälle abdecken zu können. Momentan bastel ich mir eh mit ifs ein normales Statement zusammen aber das ist auch ne plagerei und ich will ja aus performancegründen PreparedStatements verwenden.

    @Drakes
    Mein Problem ist, dass ich mit einem jdbc PreparedStatement eine select abfrage durchführen will, bei der die attribute auch null sein können.
    Angenommen ich will jetzt alle object bei denen abc den Wert "apfel" hat und def den Wert null, dann funktioniert folgender Code nicht mit MySQL weil im select ein = statt ein is steht:
    Code:
    // Ist jetzt mal aus den Händen gesaugter Code, keine Ahnung ob der kompilliert.
    PreparedStatetement stmtSelect = conn.prepareStatement("select * from object where abc = ? and def = ?");
    stmtSelect.setString(1, "apfel");
    stmtSelect.setNull(2, Types.VARCHAR);
    ResultSet resSelect = stmtSelect.executeQuery();
    Laut Arbeitskollege funktionierts für Oracle, habs aber nicht selber getestet. Bei deinem Vorschlag würde ich wohl mehr bekommen als mir lieb ist. Ich will ja nicht immer alle Datensätze wo die Attribute null sind, sondern nur wenn ich in meinem Java Programm das attribut im select tatsächlich auf null setze.

  6. #6
    Okay, jetzt habe ich das Problem verstanden.
    1. Ergebnis von Google:
    http://www.coderanch.com/t/306398/JD...e-WHERE-clause

    Also zuerst in einem String speichern und dann falls der Prüfwert für abc Null ist, dann IS NULL statt "= ?" hinzufügen und dann zu einem PreparedStatement machen und einfügen (natürlich nur, falls nicht null).

    Vielleicht gibts ja noch einen schöneren Weg

    ( Mal abgesehen von etwas wie "WHERE ((ISNULL(?) && abc is NULL) || abc = ?" )

    Edit: Ach ja, btw. ich glaube das geht nicht für Oracle aber für MySQL: der <=> Operator
    http://dev.mysql.com/doc/refman/5.1/...operators.html

    Geändert von Drakes (12.09.2009 um 15:10 Uhr)

  7. #7
    Zitat Zitat von Drakes Beitrag anzeigen
    Also zuerst in einem String speichern und dann falls der Prüfwert für abc Null ist, dann IS NULL statt "= ?" hinzufügen und dann zu einem PreparedStatement machen und einfügen (natürlich nur, falls nicht null).
    Wenn ichs so mache, muss ich jedesmal ein neues PreparedStatement erstellen wenn ich ein select mache. Das Prepared Statement soll aber nur einmal erstellt und dann immerwieder mit anderen Werten ausgeführt werden.

    Zitat Zitat
    Edit: Ach ja, btw. ich glaube das geht nicht für Oracle aber für MySQL: der <=> Operator
    http://dev.mysql.com/doc/refman/5.1/...operators.html
    Das sieht mal nach einer brauchbaren Lösung aus! Nachdem jdbc eh nicht so datenbankunabhängig ist wie erhofft, ist mir eine mysql spezifische abfrage auch recht. Danke!

    Geändert von nudelsalat (12.09.2009 um 15:22 Uhr)

  8. #8
    Die Aufgabe, solche Statements zu cachen und ggf. wieder zu verwerten liegt bei der Datenbank, also solltest du dir da keine allzu großen Gedanken machen, imho.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •