如何将CASE列添加到SQLAlchemy输出?

时间:2017-11-14 01:16:24

标签: postgresql sqlalchemy

到目前为止,我基本上得到了以下内容:

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演示如何在CASE中使用WHERE,这似乎是一个奇怪的边缘情况,而不是如何使用它来获取基于现有列的新列。

目标是避免在任何地方重复逻辑和前缀名称。

1 个答案:

答案 0 :(得分:0)

你知道这个案子是一个表达。您可以在SQL允许的任何地方使用它,并链接到您提供的文档,展示如何构造案例表达式。

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