SQLAlchemy(sql)条件查询
我遇到了一个问题,我有一个名为 product
的表,这个表有两列,分别是 target
和 actual
。我想要写一个查询,告诉它:如果 target 为空,就从 actual 中选择
。为了更清楚,这就是我的 product
表,包含这两列:
actual | target
---------------
p12 | <null>
p14 | h20
p16 | <null>
p16 | <null>
p16 | <null>
p16 | <null>
p16 | <null>
所以我想要选择一个值,比如 'xx',我该如何在 SQLAlchemy(或者 SQL)中构建这个条件,告诉它先在 target
列中查找,但如果这个单元格是空的(也就是 null),那么就去 actual
列中查找。
这样做可以吗?
3 个回答
0
SQL里有一个叫做“case”的语句。简单来说,它的用法就像这样:
CASE MYTARGET WHEN TARGET IS NOT NULL THEN TARGET ELSE ACTUAL
我不是数据库方面的专家,但我用过这个写法。这里的Mytarget是一个新加的列。
0
用 IFNULL(Target,Actual)
来代替 Target
。
ISnull 是 SQL 里的一个函数,而 ifnull 是 MySQL 里的,抱歉搞混了。
3
听起来你想用 COALESCE()
,这个函数可以接收多个参数,并返回第一个不是空值的参数(如果所有参数都是空值,那就返回空值)。
假设你有一个合理的设置:
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')]
补充一下:如果你缺失的值不是空值,而是其他某个值,那么你应该使用 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