繁体   English   中英

SQLAlchemy(sql)条件查询

[英]SQLAlchemy (sql) conditional query

我有这个问题,我有一个像这样的表product有两列targetactual ,我如何建立一个查询并告诉它: if target == '' then select from actual 更清楚的是,这是我的表product ,有两列:

actual | target
---------------
  p12  | <null>
  p14  | h20
  p16  | <null>
  p16  | <null>
  p16  | <null>
  p16  | <null>
  p16  | <null>

所以我想选择一个值'xx',如何在SQLAlchemy(或sql)中建立这个条件,告诉它在列target查找它但是如果单元格为空(为空)则在里面寻找它actual列单元格。

这可能吗?

听起来你想要COALESCE() ,它接受多个参数并返回第一个非null(如果所有args为null则返回null)

假设合理的设置:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Product(Base):
    __tablename__ = "product"
    id = sa.Column(sa.Integer, primary_key=True)
    actual = sa.Column(sa.String)
    target = sa.Column(sa.String)

使用sqlalchemy.func.coalesce()

>>> print session.query(sa.func.coalesce(Product.target, Product.actual).label('x'))
SELECT coalesce(product.target, product.actual) AS x 
FROM product
>>> session.query(sa.func.coalesce(Product.target, Product.actual).label('x')).all()
[(u'p12'), (u'h20'), (u'p16'), (u'p16'), (u'p16'), (u'p16'), (u'p16')]

编辑:如果您的缺失值不为null,而是其他一些值,则应使用CASE表达式。

>>> print session.query(sa.case([(Product.target == '', Product.actual)], else_=Product.target))
SELECT CASE WHEN (product.target = :target_1) THEN product.actual ELSE product.target END AS anon_1 
FROM product

使用IFNULL(Target,Actual)代替Target

ISnull是SQL,ifnull是mysql,对不起。

SQL有一个case语句。 在这种情况下,它将是这样的:

如果目标不是真的那么情况下,目标是实际的

我不是数据库专家,但我使用过这个结构。 Mytarget是一个新专栏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM