sqlite wählen Sie, wo Sie...und gegen Fall, wenn...
Ich bin neu in sqlite und eine gefüllte Datenbank, wo ich brauche, um zu bestimmen, wenn jede der digitalen Organismen in der Datenbank haben, ein Schwellenwert von fitness (fitness - >=2) und sind am Leben (Leben=1). Ich muss auch ausschließen, das indivID (der Primary Key) des Organismus, für wen ich bin auf der Suche nach einem fit-mate (indivID INTEGER PRIMARY KEY).
Unten habe ich versucht die erste Zeile code, aber es warf ein SQL-Fehler:
[SQLITE_ERROR] SQL-Fehler oder fehlende Datenbank (in der Nähe von "FALL": syntax
Fehler).
Aber ich weiß, der Fehler ist in der SQL-Anweisung, weil die anderen Funktionen sind erfolgreich auf die Datenbank zugreifen.
SELECT indivID FROM population CASE fitness >=2 WHEN live = 1 AND indivID!=[specific individual] ELSE NULL END
Ich habe versucht, die nächste Zeile von code, der funktioniert aber nicht richtig ausschließen, die indivID der spezifischen einzelnen:
SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual]
Ich habe drei Fragen:
1) Wo sind meine Fehler in der obigen Aussagen
2) Was ist der Unterschied zwischen der Verwendung von "Fall...Wann" und "wo...und die" Aussagen
3) Es ist möglich und sogar wahrscheinlich ist auf diese Abfragen, es kann nicht ein "live=1" Person mit hoch genug fitness (2) die Qualifikation für die select-Anweisung, so wird das Ergebnis der beiden Abfragen mit keine lebensfähigen Individuum (wenn richtig geschrieben) dann null sein?
Dank im Voraus für Eure Hilfe!
Danke Jungs! @AndriyM In Fällen, In denen ich die Datenbank zurücksetzen, so dass jeder hat eine fitness von null, und ich Schub einen individuellen fitness 2, so dass das system Abfragen für die fit-mate (ein anderes Individuum mit der fitness - >=2), es meldet zurück, dass es, wenn ich weiß, alle anderen Personen sind bei null.
Wenn es nur eine Zeile matching die Bedingung aus, und geben Sie seine ID auszuschließen und trotzdem die Abfrage noch gibt, dann ja, ich kann sehen, wie man verwirrt werden könnte. Aber sind Sie sicher, dass Sie nicht einen Fehler machen? Vielleicht ist das ausgeschlossen-ID falsch war (und damit der server hat nicht alles ausschließen und kehrte die nur übereinstimmende Zeilen)? Hier ist ein einfaches Beispiel matching, ich denke, die situation, die Sie beschrieben, und ich sehe kein Problem dort (in der Abfrage keine Zeilen zurückgegeben, wie erwartet). Könnten Sie in ähnlicher Weise richten Sie eine test-Fall illustriert das problem?
InformationsquelleAutor gromiczek | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend Ihrer ersten Frage, Sie scheinen zu missverstehen die Verwendung von
case when
. Es ist wie einif
für einen einzelnen Wert. Es ist in der Regel verwendet, um den gewünschten Wert anhand einiger Werte in der Spalte, z.B.Aber es kann auch verwendet werden, für einige raffinierte tricks auf den Zustand, z.B.
Diese Anweisung ruft Spalte
col
für Zeilen, in denencol2 = 1
wenn einige input-parameter ist 1 oder für alle Zeilen, wenn input-parameter ist etwas anderes als 1.Mit
WHERE ... AND
die Bedingung überprüft, z.B.In Ihrem Fall, Sie versuchen, wählen Sie eine null, wenn keine übereinstimmenden Werte gefunden werden. Ich glaube nicht, dass es der richtige Weg, damit umzugehen. Sie sollten versuchen, wählen Sie, was Sie suchen und dann überprüfen, ob du alle Zeilen zurück. Sie würde sich im wesentlichen um etwas zu bekommen, wie diese:
Wenn Sie nur wollen, eine übereinstimmung, dann können Sie vereinfachen das zu
Beachten Sie, dass ich verwendet, index 1 für
getString
- aber kann es das sein, was Sie brauchen.EDIT: Wenn man sich mit SQLite, dann haben Sie eine single-Richtung verschiebbar resultset, daher müssen Sie ändern Sie den obigen code leicht:
Und entsprechend
Beachten Sie die änderung der
rs.first()
zu!rs.isBeforeFirst()
und die Umkehrung der Bedingung.Ich entdeckte, this Antwort auf mein problem in der Kommentar oben mit TYPE_FORWARD. Es nutzt
if (!rs.isBeforeFirst() )
(mit der bedingten Ergebnisse Umgekehrt) stattif (rs.first())
. Jetzt habe ich jedoch einen Fehler, der sagt, dass die Datenbank gesperrt ist.Behoben, dass der locked-problem---ich hatte vergessen, zu kommentieren, eine Vorherige bit-test-code.
G vielen Dank für die Klärung und Hilfe---es läuft!
InformationsquelleAutor Aleks G