DISCARD

Вычисляет SELECT, но не возвращает результат ни в клиент, ни в таблицу.

Полезно использовать в сочетании с Ensure для проверки выполнения пользовательских условий на финальный результат вычислений.

Запрос с DISCARD выполняется полностью — со всеми фильтрами, агрегациями и проверками Ensure, — но результирующий набор (result set) не возвращается клиенту. Данные при этом не пересылаются по сети: клиент получает только статус выполнения запроса. На больших выборках это заметно экономит трафик и память.

В запросе из нескольких операторов DISCARD действует на отдельный оператор:

SELECT 1;          -- вернётся
DISCARD SELECT 2;  -- выполнится, но в ответ не попадёт
SELECT 3;          -- вернётся

Клиент получит два результирующих набора — от первого и третьего оператора.

DISCARD применяется только к оператору целиком, использовать его внутри выражений нельзя. В частности, недопустимо:

  • в подзапросах — SELECT * FROM (DISCARD SELECT 1);
  • в WHERE ... IN (...)SELECT * FROM my_table WHERE Key IN (DISCARD SELECT 1);
  • в операндах UNION ALLSELECT 1 UNION ALL DISCARD SELECT 2.

Примечание

DISCARD поддерживается при выполнении запросов через сервис исполнения запросов (Query Service) начиная с версии YDB 26.2. При выполнении через устаревшие интерфейсы (Table Service, скан-запросы) DISCARD игнорируется, и результат возвращается клиенту — поведение сохранено для обратной совместимости.

Примеры

DISCARD SELECT 1;
DISCARD SELECT Ensure(
    Data,
    Data < 1000000,
    "Value too big"
) FROM `result_table`;

Если условие Ensure нарушено, запрос завершится ошибкой. Если всё в порядке — запрос отработает успешно, а клиент не получит результирующий набор, который иначе пришлось бы выкачивать целиком.

Предыдущая
Следующая