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

Функция nulls_last

Функция nulls_last применяется к выражению сортировки и указывает базе данных размещать значения NULL в конце результата. Первым параметром функция принимает выражение сортировки, например, результат вызова asc или desc. Возвращает объект NullsLast, который можно передавать в методы order_by и group_by.

Поведение по умолчанию зависит от СУБД: одни базы данных размещают NULL в начале, другие - в конце. Функция nulls_last делает это поведение предсказуемым и независимым от диалекта.

Синтаксис

nulls_last(expression)

Пример

Давайте создадим таблицу articles и отсортируем записи по полю num, разместив значения NULL в конце:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, asc, nulls_last engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('num', Integer) ) metadata.create_all(engine) with engine.connect() as conn: conn.execute(articles.insert(), [ {'id': 1, 'title': 'article 1', 'num': 30}, {'id': 2, 'title': 'article 2', 'num': None}, {'id': 3, 'title': 'article 3', 'num': 10}, ]) query = select(articles.c.title).order_by(nulls_last(asc(articles.c.num))) res = conn.execute(query).fetchall() print(res)

Результат выполнения кода:

[('article 3',), ('article 1',), ('article 2',)]

Итоговый SQL запрос:

SELECT articles.title FROM articles ORDER BY articles.num ASC NULLS LAST

Пример

Давайте применим nulls_last вместе с функцией desc для сортировки по убыванию:

<+python+> from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, desc, nulls_last engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('num', Integer) ) metadata.create_all(engine) with engine.connect() as conn: conn.execute(articles.insert(), [ {'id': 1, 'title': 'article 1', 'num': 30}, {'id': 2, 'title': 'article 2', 'num': None}, {'id': 3, 'title': 'article 3', 'num': 10}, ]) query = select(articles.c.title).order_by(nulls_last(desc(articles.c.num))) res = conn.execute(query).fetchall() print(res) <-python+>

Результат выполнения кода:

[('article 1',), ('article 3',), ('article 2',)]

Итоговый SQL запрос:

SELECT articles.title FROM articles ORDER BY articles.num DESC NULLS LAST

Пример

Давайте используем nulls_last в ORM-запросе с моделями:

from sqlalchemy import create_engine, Integer, String, select, asc, nulls_last from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String) num: Mapped[int] = mapped_column(Integer, nullable=True) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(id=1, title='article 1', num=30), Article(id=2, title='article 2', num=None), Article(id=3, title='article 3', num=10), ]) session.commit() query = select(Article.title).order_by(nulls_last(asc(Article.num))) res = session.execute(query).scalars().all() print(res)

Результат выполнения кода:

['article 3', 'article 1', 'article 2']

Итоговый SQL запрос:

SELECT articles.title FROM articles ORDER BY articles.num ASC NULLS LAST

Смотрите также

  • функцию nulls_first,
    которая размещает значения NULL в начале результата
  • функцию asc,
    которая задает сортировку по возрастанию
  • функцию desc,
    которая задает сортировку по убыванию
  • функцию null,
    которая создает выражение для проверки на NULL
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить