SQLAlchemy:coalesce()首先返回NULL而非空结果

时间:2014-12-17 11:44:04

标签: python sqlalchemy coalesce

我正在查询第一个非空用户名:

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_usernameus_usernamealso_usernameemail中搜索第一个非空值。为了做到这一点,我准备了一个函数,用于从找到的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

1 个答案:

答案 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