Функция case
Функция case создает SQL-выражение
CASE для условной логики внутри
запроса. Первым параметром передается
список кортежей вида (условие, значение).
Параметр value задает выражение,
с которым сравниваются условия. Параметр
else_ определяет значение по умолчанию,
если ни одно условие не выполнено.
Синтаксис
case(*whens, value=None, else_=None)
Пример
Давайте создадим условное выражение с одним условием:
from sqlalchemy import case
res = case((1 == 1, 'yes'), else_='no')
print(res)
Результат выполнения кода:
"CASE WHEN (1 = 1) THEN :param_1 ELSE :param_2 END"
Пример
Давайте применим функцию case к таблице
articles, чтобы вывести статус статьи
текстом:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, case, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'title': 'article 1', 'status': 'published'},
{'title': 'article 2', 'status': 'draft'},
])
status_label = case(
(articles.c.status == 'published', 'Опубликовано'),
(articles.c.status == 'draft', 'Черновик'),
else_='Неизвестно',
).label('status_text')
stmt = select(articles.c.title, status_label)
with engine.connect() as conn:
for row in conn.execute(stmt):
print(row)
Результат выполнения кода:
('article 1', 'Опубликовано')
('article 2', 'Черновик')
Пример
Давайте используем параметр value для
сравнения с конкретным значением:
from sqlalchemy import case
status = 'published'
res = case(
{'published': 'Опубликовано', 'draft': 'Черновик'},
value=status,
else_='Неизвестно',
)
print(res)
Итоговый SQL запрос:
CASE :param_1 WHEN :param_2 THEN :param_3 WHEN :param_4 THEN :param_5 ELSE :param_6 END