我正在查询第一个非空用户名:
query = session.query(
Account.id.label('acc_id'),
Account.username.label('acc_username'),
User.username.label('us_username'),
User.another_username.label('also_username'),
User.email.label('email')
).join(Account.user)
之后我在acc_username
,us_username
,also_username
和email
中搜索第一个非空值。为了做到这一点,我准备了一个函数,用于从找到的KeyedTuple
和第一个非空字符串值创建id
:
for q in query.all():
account_tuple = KeyedTuple(
[q.acc_id, q.acc_username or q.us_username or q.also_username or q.email or ''],
labels=_LABELS)
但我宁愿使用某种形式的coalesce
,除了返回第一个非空值(在Python的第一个not False
值)而不是not NULL
。是否有正确的方法来执行此操作?我非常希望在查询中保留所有这些逻辑,而不是在单独的函数中创建另一个KeyedTuple
。
答案 0 :(得分:1)
我在SQLAlchemy中使用MySQL case
方法处理了这个问题:
query = session.query(
Account.id.label('acc_id'),
case(
[
(Account.username != '', Account.username),
(User.username != '', User.username),
(User.another_username != '', User.another_username),
(User.email != '', User.email)
],
else_='')
.label('username')
.join(Account.user)
虽然这可能不是正确的方式来实现第一个非空字符串(与空字符串的比较也拒绝NULL
个条目)但在这种情况下它运行良好并且省略了第二个KeyedTuple
。