Метод is_distinct_from
Метод is_distinct_from класса ColumnElement создает SQL-выражение
для проверки того, что два значения различаются, с учетом значений NULL.
В отличие от обычного оператора !=, который для двух NULL
возвращает NULL (а не true или false),
метод is_distinct_from всегда возвращает true или false.
Метод принимает один обязательный параметр - другое значение или колонку
для сравнения.
Синтаксис
column.is_distinct_from(other)
Пример
Давайте создадим таблицу articles и сравним колонку
status со значением NULL с помощью
метода is_distinct_from:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, 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.connect() as conn:
conn.execute(articles.insert().values([
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 2', 'status': None},
{'id': 3, 'title': 'article 3', 'status': 'draft'},
]))
stmt = select(articles.c.id, articles.c.status).where(
articles.c.status.is_distinct_from(None)
)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1, 'published'), (3, 'draft')]
Как видим, строка со значением NULL в колонке status
не попала в результат, потому что NULL не отличается от NULL
с точки зрения метода is_distinct_from.
Пример
Давайте сравним две колонки между собой с помощью
метода is_distinct_from:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert().values([
{'id': 1, 'title': 'article 1', 'status': 'published', 'num': 10},
{'id': 2, 'title': 'article 1', 'status': 'draft', 'num': 20},
{'id': 3, 'title': 'article 3', 'status': None, 'num': None},
]))
stmt = select(articles.c.id).where(
articles.c.title.is_distinct_from(articles.c.status)
)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(2,), (3,)]
Пример
Давайте посмотрим, какой SQL-запрос генерирует
метод is_distinct_from:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('status', String)
)
stmt = select(articles.c.id).where(
articles.c.status.is_distinct_from('published')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.id
FROM articles
WHERE articles.status IS DISTINCT FROM ?
Смотрите также
-
метод
is_not_distinct_from,
который проверяет, что значения не различаются с учетом NULL -
метод
is_,
который сравнивает значение с NULL или true/false -
метод
is_not,
который проверяет, что значение не равно NULL или true/false -
класс
ColumnElement,
который представляет элемент SQL-выражения