到目前为止,我基本上得到了以下内容:
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
,这似乎是一个奇怪的边缘情况,而不是如何使用它来获取基于现有列的新列。
目标是避免在任何地方重复逻辑和前缀名称。
答案 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