SQLAlchemy(sql)条件查询

0 投票
3 回答
3075 浏览
提问于 2025-04-18 00:11

我遇到了一个问题,我有一个名为 product 的表,这个表有两列,分别是 targetactual。我想要写一个查询,告诉它:如果 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

撰写回答