如何为'where'子句中与数据库表列不匹配(不存在)的项返回一些默认值

anauzrmj  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(271)

我有一个数据库表 flight ```
pkid from_city to_city
1 Melbourne BuenosAires
2 Budapest Tokyo
3 Praslin Anchorage

然后我有一个列表/元组的一些随机城市 `['Paris','Tokyo','Madrid','Anchorage','im_not_on_earth']` 现在使用sqlalchemy元数据,我需要一个返回 `pkid` 为了匹配 `to_city` 在给定的列表中,如果存在,或者返回一些默认值,比如 `0` 如果不存在
所以基本上我的输出应该给每个城市一些整数,我可以把输出中的每个整数Map到给定输入中的某个城市
以下任何示例输出都适用于我-

{'Paris':0, 'Tokyo': 2, 'Madrid': 0, 'Anchorage': 3, 'im_not_on_earth': 0}

或者干脆。。。。。。 `[0,2,0,3,0]` 对如何做这件事有什么想法或建议吗?我想我可以通过使用coalesce来实现这一点。但只有当where子句中的值存在于db table中时,这种方法才有效。不确定我对凝聚的理解是否正确。
edit:**我不想对给定输入中的每个元素使用for循环和查询进行迭代**
wqnecbli

wqnecbli1#

你可以用 apply() 并定义自己的函数,例如:

def get_id(x):

    find = flight[flight['to_city']==x]['pkid'].values
    match = find[0] if list(find) else 0
    return match

dict(zip(to_cities, pd.Series(to_cities).apply(get_id).values))

产量:

{'Paris': 0, 'Tokyo': 2, 'Madrid': 0, 'Anchorage': 3, 'im_not_on_earth': 0}
rn0zuynd

rn0zuynd2#

您要做的是在您提供的城市列表和航班表中的tocity列之间进行外部连接。如果数据库不知道您所提供的城市列表,那么您将不得不使用循环来执行此加入应用程序代码。在您的示例代码中,每个tou city只出现在一个数据库行中,因此只Map到一个pkid。我假设多个不同的城市有可能有飞往同一城市的航班,因此需要将每个城市Map到pkid列表,而不是单个值。因此,没有航班前往的目的地城市将由空列表表示,而不是0。
您可以用一个数据库查询来检索匹配城市的列表,但是您需要一个循环来与您提供的tou城市列表进行外部连接。下面的代码应该可以实现您想要的。由于您没有提供sqlalchemy代码,我假设您正在使用orm和声明性系统来定义表。

from collections import defaultdict

class Flight(Base):
    __tablename__ = 'flight'

    pkid = Column(Integer, primary_key=True)
    from_city = Column(String)
    to_city = Column(String)

to_cities = ['Paris','Tokyo','Madrid','Anchorage','im_not_on_earth']
query_result = session.query(Flight.to_city, Flight.pkid).filter(Flight.to_city.in_(to_cities)).all()
matching_cities = defaultdict(list)
for city, pkid in query_result:
    matching_cities[city] += [pkid]
result = {city: matching_cities.get(city, []) for city in to_cities}

考虑到您必须在应用程序代码中进行外部连接,所以考虑数据库设计是值得的。数据库将是一个更有效的地方来实现这一点。如果您有一个包含所有城市名称的单独表,该表与航班表具有外键关系,那么您可以通过在查询中的城市表和航班表之间执行外部联接,在单个查询中实现所需的功能。

相关问题