Python: SQL-оператор OR - PullRequest
       5

Python: SQL-оператор OR

2 голосов
/ 19 ноября 2010

Есть ли оператор OR sqlite?Я пытался Google, но, похоже, Google отфильтровывает ИЛИ .

Например, если я хочу найти кого-то в этой таблице (люди)

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

с именем Элвиса или Ричарда, каким будет мой запрос?

Я пробовал что-то вроде select * from people where fname=('Elvis' or 'Richard'), но это всегда возвращает Эрик Шмидт (точно противоположные строки того, что я хочу)!

Я также пробовал select * from people where fname='Elvis' or 'Richard', но это возвращает все строк в таблице!

Я использую модуль Python 2.6 sqlite3 в Ubuntu 10.10.Может кто-нибудь дать мне быстрое объяснение SQL-оператора ИЛИ или сказать, если он не существует?Я пытался RTFM и ничего не смог найти (поиск ИЛИ на сайте sqlite выдает кучу ошибок!).

Спасибо!

Ответы [ 5 ]

20 голосов
/ 19 ноября 2010

Это будет один из них:

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

Я удивлен, что ваш первый запрос даже работает, а во втором, or 'Richard' в основном означает or 1=1, что всегда верно для каждогострока в вашей таблице.

Ваш компьютер думает не так, как вы.Даже если fname = 'Elvis' or 'Richard' кажется вам очевидным, СУБД не знает, что вы имеете в виду, и читает «если fname равно« Elvis »или ... true».Он переводит строку в логическое значение, и я предполагаю, что поскольку она не пустая, она оценивается как true.И продолжает выбирать каждую строку в вашей таблице, как я уже говорил ранее.

3 голосов
/ 19 ноября 2010

«Логические операторы SQLite» были моим запросом, и я нашел вам следующее: http://zetcode.com/databases/sqlitetutorial/expressions/

Что касается ваших фактических результатов, вы сравниваете коров с ослами: D.Когда вы говорите:

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

Вы говорите:

Дайте мне все строки от людей, которые удовлетворяют следующему: верно, что fname равно Элвису, или это правда, чтоРичард.

Вы получаете все строки, потому что Ричард считается истинным, будучи непустой строкой.

Что вы должны сделать:

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

Ура!

0 голосов
/ 19 ноября 2010

ИЛИ - логическое утверждение, которое возвращает истину или ложь.

Итак («Элвис» или «Ричард») возвращает, вероятно, ложь. И ваш настоящий SQL действительно "fname = False". большинство баз данных выдают ошибку, но поскольку sqlite внутренне следует философии TCL «все является строкой», это правильное утверждение.

Вам просто нужно:

select * from people where fname='Elvis' or fname =  'Richard'
0 голосов
/ 19 ноября 2010

Попробуйте это:

select * from people where fname = 'Elvis' or  fname = 'Richard'
0 голосов
/ 19 ноября 2010

просто быстро, вы пробовали select * from people where fname='Elvis' or fname='Richard'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...