SQLAlchemy过滤器,substr,case

mar*_*ddy 3 python sqlalchemy

我可以使用CASE内声明substrfilter

这是我的要求:

>> value = '00021050430' #here value is a database column
>> query.filter((func.substr(value,case([(func.length(value) > 7,func.length(varying_value)-7+1))],else_=1),7)=='1050430')
Run Code Online (Sandbox Code Playgroud)

我期待的输出是:

>> query.filter(func.substr(value,6,7))
Run Code Online (Sandbox Code Playgroud)

以上引发了错误.

Mar*_*ers 5

您不需要CASE()在此处使用声明.只需使用Python:

query.filter(func.substr(value, 1 if len(value) > 7 else 1, 7) == '1050430')
Run Code Online (Sandbox Code Playgroud)

这称为条件表达式; 它被构造为true_expr if test_expr else false_expr,true_expr如果test_expr求值为True 则使用where ,否则使用该false_expr部分.

如果value不是一个常数,而是一列引用,那么你需要使用一个CASE()声明.使用sqlalchemy.sql.expression.case()为:

from sqlalchemy.sql.expression import case

query.filter(func.substr(value, case([(func.length(column) > 7, func.length(column) - 7 + 1)], else_=1), 7) == '1050430')
Run Code Online (Sandbox Code Playgroud)

但你需要确保你的()括号是平衡的(你有一个太多).