2010-07-26 84 views
37

如何合併兩列並應用過濾器?例如,我想同時搜索「名字」和「姓氏」列。這裏是我是如何被做,如果只搜索一列:sqlalchemy過濾多列

query = meta.Session.query(User).filter(User.firstname.like(searchVar)) 
+3

我認爲這個問題符合我的問題,但答案不適用於我的特定情況。如果firstname是「joe」而lastname是「smith」,那麼我正在尋找一個過濾器語句,當提供的searchVar是「joe smith」時它將匹配。即,在進行測試之前,需要將這些字段連接起來(並添加空格)。看起來像一個非常真實的場景。 – Groovee60 2015-05-13 15:12:09

+0

@ Groovee60這正是我正在尋找的。如果你能分享你的解決方案,如果你找到了解決方案,我將不勝感激。 – Lilylakshi 2017-05-30 11:17:37

回答

42

您可以使用SQLAlchemy的or_ function在多個列搜索(下劃線是需要從Python的or區別)。

下面是一個例子:

from sqlalchemy import or_ 
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), 
              User.lastname.like(searchVar))) 
+5

您可以使用'|'運算符而不是'or_',就像這樣 - '(User.firstname.like(searchVar))| (User.lastname.like(searchVar))',但是你應該小心使用'|'優先級,沒有括號,當與比較運算符混合時,它會產生非常意想不到的結果。 – 2010-08-01 17:05:57

+1

不應該是'filter.or_(case1,case 2)'? – fedorqui 2013-05-23 09:09:10

+1

這是錯誤的,因爲問題是關於ORM,但鏈接導致表達式。 – user2846569 2015-02-19 08:52:35

38

你可以簡單地調用filter多次:

query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ 
           filter(User.lastname.like(searchVar2)) 
+20

在大型mysql表中使用多個'filter()'方法並在單個'filter'中使用多個條件(通過'or_'或'and_')之間是否存在任何性能差異? – Sangram 2014-07-28 09:12:02

+2

多個「過濾器」調用是否像邏輯「AND」而不是「OR」一樣? – danodonovan 2015-06-09 10:15:54

+5

這將是AND – 2015-06-15 19:52:35

10

有辦法做到這一點編號:

使用過濾器(和運營商)

query = meta.Session.query(User).filter(
    User.firstname.like(search_var1), 
    User.lastname.like(search_var2) 
    ) 

使用filter_by(和運營商)

query = meta.Session.query(User).filter_by(
    firstname.like(search_var1), 
    lastname.like(search_var2) 
    ) 

鏈接過濾器(和運營商)

query = meta.Session.query(User).\ 
    filter_by(firstname.like(search_var1)).\ 
    filter_by(lastname.like(search_var2)) 

使用or_()或and_(),而不是()

from sqlalchemy import and_, or_, not_ 

query = meta.Session.query(User).filter(
    and_(
     User.firstname.like(search_var1), 
     User.lastname.like(search_var2) 
    ) 
) 
+0

這些不同的方法有什麼值得注意的性能差異嗎? – Miek 2018-03-11 00:23:33