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

Метод 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-выражения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить