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

Функция nulls_first

Функция nulls_first применяется в конструкциях сортировки для указания того, что значения NULL должны располагаться в начале результата. Она принимает один параметр - выражение сортировки, обычно результат функции asc или desc, и возвращает модифицированное выражение, которое при генерации SQL-запроса добавляет инструкцию NULLS FIRST.

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

Синтаксис

nulls_first(expr)

Пример

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

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, nulls_first, asc 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': 5}, {'id': 2, 'title': 'article 2', 'num': None}, {'id': 3, 'title': 'article 3', 'num': 2}, {'id': 4, 'title': 'article 4', 'num': None}, ]) stmt = select(articles.c.id, articles.c.num).order_by( nulls_first(asc(articles.c.num)) ) res = conn.execute(stmt).fetchall() print(res)

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

[(2, None), (4, None), (3, 2), (1, 5)]

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

SELECT articles.id, articles.num FROM articles ORDER BY articles.num ASC NULLS FIRST

Пример

Давайте применим nulls_first совместно с сортировкой по убыванию:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, nulls_first, desc 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': 5}, {'id': 2, 'title': 'article 2', 'num': None}, {'id': 3, 'title': 'article 3', 'num': 2}, ]) stmt = select(articles.c.id, articles.c.num).order_by( nulls_first(desc(articles.c.num)) ) res = conn.execute(stmt).fetchall() print(res)

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

[(2, None), (1, 5), (3, 2)]

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

SELECT articles.id, articles.num FROM articles ORDER BY articles.num DESC NULLS FIRST

Пример

Давайте используем nulls_first внутри множественной сортировки, комбинируя с другим полем:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, nulls_first, asc 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', 'num': 1}, {'id': 2, 'title': 'article', 'num': None}, {'id': 3, 'title': 'article', 'num': 2}, ]) stmt = select(articles.c.id, articles.c.title, articles.c.num).order_by( articles.c.title, nulls_first(asc(articles.c.num)) ) res = conn.execute(stmt).fetchall() print(res)

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

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

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

SELECT articles.id, articles.title, articles.num FROM articles ORDER BY articles.title, articles.num ASC NULLS FIRST

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

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