РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
434 of 711 menu

Функция 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить