ИИ составил SQL-запрос. Куда пропали записи без статуса?⁠⁠

Задача звучит понятно: показать все заявки, кроме закрытых. Помощник предлагает условие `status != 'closed'`. В тестовой таблице есть открытая заявка, закрытая и одна без известного статуса. Запрос возвращает только открытую. Третья тоже не попала в результат.

Это учебный разбор с помощью ИИ, без данных настоящих клиентов. Пример выполнен в локальной базе SQLite в памяти.

Проверка на трёх строках

import sqlite3

with sqlite3.connect(":memory:") as db:

db.execute("CREATE TABLE tickets(id INTEGER, status TEXT)")

db.executemany("INSERT INTO tickets VALUES (?, ?)",

[(1, "open"), (2, "closed"), (3, None)])

simple = db.execute(

"SELECT id FROM tickets WHERE status != 'closed' ORDER BY id"

).fetchall()

explicit = db.execute(

"SELECT id FROM tickets "

"WHERE status != 'closed' OR status IS NULL ORDER BY id"

).fetchall()

print(simple)

print(explicit)

Результат:

[(1,)]

[(1,), (3,)]

`NULL` обозначает отсутствие значения. Сравнение `NULL != 'closed'` не становится истиной. Поэтому первая выборка не включает третью запись. Для явной проверки отсутствия значения служит `IS NULL`; это описано в документации SQLite (https://www.sqlite.org/lang_expr.html).

Какой запрос правильный

Это зависит от смысла задачи. Если нужны только заявки с известным незакрытым статусом, первый запрос подходит. Если требуется также проверить заявки без статуса, нужно явно включить их либо вывести отдельным списком.

Второй вариант в примере включает неизвестные статусы в результат, но не объявляет их открытыми. Этот смысл нельзя незаметно менять. Например, отчёт «в работе» и очередь «проверить всё, что ещё не подтверждено закрытым» могут требовать разных выборок.

Не стоит заменять все NULL пустой строкой только ради красивой таблицы. После такой замены можно потерять различие между неизвестным значением и реально присланной пустой строкой. Здесь решение о хранении данных важнее краткости запроса.

Что передать ИИ до генерации SQL

Вместе со схемой таблицы полезно дать небольшой набор строк и точный ожидаемый список идентификаторов. Добавить хотя бы три случая: нужный статус, исключаемый статус, отсутствующий статус. Если поле допускает пустую строку или опечатку, для них тоже нужны отдельные ожидания.

Проверку сначала выполняют как SELECT на безопасной копии или синтетических данных. Успешная выборка ещё не является разрешением обновлять или удалять записи в рабочей базе. В показанном примере нет команды изменения настоящих заявок.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества