Функция funcfilter
Функция funcfilter создает объект
FunctionFilter, который представляет
SQL-конструкцию FILTER (WHERE ...) для
агрегатных функций. Первым параметром функция
принимает агрегатную функцию, например
func.count или func.sum. Вторым
параметром передается условие фильтрации -
объект ColumnElement, например результат
работы оператора == или функции
and_. Данная конструкция поддерживается
не всеми СУБД: в PostgreSQL и
SQLite начиная с версии 3.30 она
работает, а в MySQL и Oracle
может быть недоступна.
Синтаксис
from sqlalchemy import funcfilter
funcfilter(func, *criterion)
Пример
Давайте создадим простую таблицу с агрегатной функцией и отфильтруем строки до агрегации:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, func, funcfilter, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
stmt = select(
funcfilter(func.count(), articles.c.status == 'published')
)
res = engine.connect().execute(stmt).scalar()
print(res)
Результат выполнения кода:
0
Пример
Давайте вставим данные и отфильтруем агрегатную функцию по числовому условию:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, func, funcfilter, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'status': 'draft', 'num': 20},
{'title': 'article 3', 'status': 'published', 'num': 30},
])
stmt = select(
funcfilter(func.sum(articles.c.num), articles.c.status == 'published')
)
res = engine.connect().execute(stmt).scalar()
print(res)
Результат выполнения кода:
40
Пример
Давайте посмотрим на итоговый SQL-запрос,
который генерирует функция funcfilter:
from sqlalchemy import MetaData, Table, Column, Integer, String, func, funcfilter, select
from sqlalchemy.dialects import sqlite
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer),
)
stmt = select(
funcfilter(func.count(), articles.c.num > 5)
)
print(stmt.compile(dialect=sqlite.dialect()))
Итоговый SQL запрос:
SELECT count(*) FILTER (WHERE articles.num > 5) AS count_1
FROM articles
Смотрите также
-
функцию
func,
которая создает любую SQL-функцию -
функцию
func.count,
которая возвращает количество строк -
функцию
func.sum,
которая считает сумму значений -
функцию
and_,
которая объединяет условия через AND