2017-11-14 2 views
0

は、これまでのところ私は、次の基本的に持っている:SQLAlchemyの出力にCASE列を追加するには?

MyTable.query 
    .join(…) 
    .filter(…) 

filterは複雑な大文字小文字を区別しないプレフィックスチェックがあります

or_(*[MyTable.name.ilike("{}%".format(prefix)) for prefix in prefixes]) 

は今、私は結果で一致する接頭辞を取得する必要があります。擬似SQLでは:

SELECT CASE 
      WHEN strpos(lower(my_table.foo), 'prefix1') = 0 THEN 'prefix1' 
      WHEN … 
     END AS prefix 
WHERE prefix IS NOT NULL; 

SQLAlchemy documentationは、既存のいずれかに基づいて新しい列を取得するためにそれを使用する方法奇妙なエッジケースのように思われ、WHERECASEを使用する方法を示し、そしてません。

目的は、ロジックとプレフィックスの名前をどこにでも複製することを避けることです。

+0

'session.query(Model)'の 'Model.query'の短縮形を使用しているため、クエリにエンティティ/カラムを追加する方法が混乱していますか? –

答えて

0

あなたはその式が式であることを知っています。 SQLが許可する場所であればどこでも使用できます。また、提供しているドキュメントにリンクすることで、case式の構築方法を示します。

from sqlalchemy import case, literal 
from sqlalchemy.orm import Query 

q = Query(case([ 
    (literal(1) == literal(1), True), 
], else_ = False)) 

print(q) 

SELECT CASE WHEN (:param_1 = :param_2) THEN :param_3 ELSE :param_4 END AS anon_1 
関連する問題