SQLAlchemy(sql)条件查询

时间:2014-03-27 16:47:10

标签: python mysql sql sqlalchemy

我遇到了这个问题,我有一个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>

所以我想选择一个值&#39; xx&#39;,我如何在SQLAlchemy(或sql)中建立这个条件,告诉它在列target中查找它,但是如果cell为空(为空),然后在actual列单元格中查找。

这可能吗?

3 个答案:

答案 0 :(得分:2)

听起来像你想要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

答案 1 :(得分:0)

使用IFNULL(Target,Actual)代替Target

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

答案 2 :(得分:0)

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

当目标不是目标而非实际目标

时的情况

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