2010-11-19 9 views
2

Gibt es eine OR-SQL-Anweisung? Ich habe versucht, es zu googeln, aber Google scheint die OR herausfiltern.Python: sqlite OR-Anweisung

Zum Beispiel, wenn ich will, dass jemanden in dieser Tabelle finden (Menschen)

people: 
+--fname--+--lname--+--has_squirrel--+ 
|Eric  |Schmidt |0    | 
+---------+---------+----------------+ 
|Elvis |Presley |1    | 
+---------+---------+----------------+ 
|Richard |Stallman |0    | 
+---------+---------+----------------+ 

mit einem Vornamen von entweder Elvis oder Richard, was würde meine Frage sein?

Ich habe Dinge wie select * from people where fname=('Elvis' or 'Richard') versucht, aber das gibt immer Eric Schmidt (das genaue Gegenteil Zeilen, was ich will)!

Ich habe auch versucht select * from people where fname='Elvis' or 'Richard', aber das gibt alle die Zeilen in der Tabelle!

Ich benutze das Python 2.6 sqlite3-Modul auf Ubuntu 10.10. Kann jemand mir eine kurze Erklärung der SQLite ODER Anweisung geben oder mir sagen, wenn es nicht existiert? Ich habe versucht, RTFM und ich konnte nichts finden (Suche nach ODER auf der SQLite-Website spuckt eine Reihe von Fehlern!).

Danke!

+0

Sie ein Problem mit Ihrem Zustand haben! Siehe meine Antwort unten, ich erklärte ein bisschen. – slezica

+1

Wenn Sie googlen 'sql + oder' wird es Ihnen besser zuhören. –

+0

Danke nate! Ich werde mich daran erinnern! –

Antwort

19

Es wäre einer von denen sein:

SELECT * FROM people WHERE fname IN ('Elvis', 'Richard'); 
SELECT * FROM people WHERE fname = 'Elvis' OR fname = 'Richard'; 

Ich bin überrascht, Ihre erste Abfrage funktioniert sogar, und in der zweiten, or 'Richard' bedeutet im Grunde or 1=1, die immer wahr ist, für jede Zeile in der Tabelle.

Ihr Computer denkt nicht wie Sie. Auch wenn fname = 'Elvis' or 'Richard' Ihnen offensichtlich erscheint, weiß das RDBMS nicht, was Sie meinen und liest "wenn fname gleich 'Elvis' oder ... wahr ist". Es evaluiert die Zeichenfolge zu einem booleschen Wert, und ich nehme an, da es nicht leer ist, wird es als wahr ausgewertet. Und fährt fort, jede Reihe von Ihrem Tisch auszuwählen, wie ich früher sagte.

+0

Ich bin ein Fan von 'IN', weil es leicht erweiterbar ist, die Klammern unterscheiden die Liste der Alternativen, und anständige Text-Editoren lassen Sie zwischen ihnen hin und her springen. Als Bonus sieht es wie ein Listenverständnis aus: '[row for row in people wenn row.fname in ('Elvis', 'Richard')]' –

+0

Aha! 'IN' ist was ich will! Vielen Dank! –

0

nur eine kurze ein, haben Sie "select * from Menschen, wo fname = 'Elvis' oder fname = 'Richard'", versuchte

0

Try this:

select * from people where fname = 'Elvis' or fname = 'Richard' 
3

"SQLite logischen Operatoren" wurde meine Frage, und fand Sie das: http://zetcode.com/databases/sqlitetutorial/expressions/

Zu Ihren tatsächlichen Ergebnissen vergleichen Sie Kühe mit Eseln: D. Wenn Sie sagen:

select * from people where fname='Elvis' or 'Richard' 

Sie sagen,:

Gib mir alle Zeilen von Leuten, dass die folgenden Merkmale erfüllen: es ist wahr, dass fname Elvis gleich, oder es stimmt, dass Richard.

Sie erhalten alle Zeilen, weil Richard als wahr betrachtet wird und eine nicht leere Zeichenfolge ist.

Was sollten Sie tun, ist:

select * from people where fname='Elvis' or fname='Richard' 

Prost!

+0

Danke für den Link und die gute Erklärung! :) –

0

ODER ist eine logische Anweisung, die wahr oder falsch zurückgibt.

Also ("Elvis" oder "Richard") gibt wahrscheinlich falsch zurück. Und Ihre tatsächliche SQL ist wirklich "fname = False". Die meisten Datenbanken würden einen Fehler verursachen, aber da sqlite intern der TCL-Philosophie "Alles ist eine Zeichenkette" folgt, ist es eine gültige Aussage.

Was Sie brauchen, ist einfach:

select * from people where fname='Elvis' or fname = 'Richard'