Функция 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 для сортировки по убыванию:
Результат выполнения кода:
[('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