Функция try_cast
Функция try_cast выполняет приведение
значения к указанному типу, возвращая NULL
вместо ошибки, если преобразование невозможно.
Первым параметром функция принимает выражение
или колонку для приведения. Вторым параметром
передается целевой тип данных, к которому нужно
привести значение.
В отличие от функции cast, которая
вызывает ошибку при неудачном преобразовании,
try_cast безопасно возвращает NULL.
Это особенно полезно при работе с данными,
содержащими некорректные значения.
Синтаксис
try_cast(expression, type_)
Пример
Давайте создадим таблицу с колонкой, содержащей смешанные данные, и попробуем привести их к целочисленному типу:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, try_cast
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', String)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'num': '10'},
{'id': 2, 'title': 'article 2', 'num': '20'},
{'id': 3, 'title': 'article 3', 'num': 'abc'}
])
stmt = select(
articles.c.title,
try_cast(articles.c.num, Integer).label('num_int')
)
res = conn.execute(stmt)
for row in res:
print(row)
Результат выполнения кода:
('article 1', 10)
('article 2', 20)
('article 3', None)
Пример
Давайте используем try_cast для приведения
числового значения к строковому типу:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, try_cast
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'num': 100},
{'id': 2, 'num': 200}
])
stmt = select(
articles.c.num,
try_cast(articles.c.num, String).label('num_str')
)
res = conn.execute(stmt)
for row in res:
print(row)
Результат выполнения кода:
(100, '100')
(200, '200')
Пример
Давайте применим try_cast в условии WHERE
для фильтрации строк, которые можно преобразовать
в число:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, try_cast
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', String)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'num': '15'},
{'id': 2, 'title': 'article 2', 'num': 'abc'},
{'id': 3, 'title': 'article 3', 'num': '30'}
])
casted = try_cast(articles.c.num, Integer)
stmt = select(articles.c.title).where(casted > 20)
res = conn.execute(stmt)
for row in res:
print(row)
Результат выполнения кода:
('article 3',)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE TRY_CAST(articles.num AS INTEGER) > 20
Смотрите также
-
функцию
cast,
которая выполняет строгое приведение типов -
функцию
type_coerce,
которая выполняет приведение типов на уровне Python -
функцию
func.coalesce,
которая возвращает первое не NULL значение -
функцию
func.nullif,
которая возвращает NULL при равенстве значений