我遇到了这个问题,我有一个product
这样的表,有两列target
和actual
,我如何构建查询并告诉它: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
列单元格中查找。
这可能吗?
答案 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是一个新专栏