ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

SELECT * EXCEPT в SQL: Исключение поля из выборки

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы корректно выполнить запрос SELECT * EXCEPT, необходимо использовать динамический SQL:

SQL
Скопировать код
DECLARE @cols NVARCHAR(MAX) = (
  SELECT STRING_AGG(QUOTENAME(column_name), ', ') 
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = N'YourTable' 
    AND COLUMN_NAME NOT IN (N'ExcludedColumn1', N'ExcludedColumn2')
  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
);

EXEC('SELECT ' + @cols + ' FROM YourTable'); -- И ожидаемое чудо произошло!

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

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Глубже в динамический SQL

Динамический SQL станет надежным помощником в задачах программного формирования запросов, давая возможность динамически исключать столбцы из выражения SELECT. Но помните о мудрости — необдуманное использование силы может привести к неприятным последствиям.

Волшебство системных таблиц и схем

Для того чтобы отфильтровать ненужные столбцы, нам помогут системные таблицы или INFORMATION_SCHEMA:

SQL
Скопировать код
-- Небольшой трюк от SQL Server
DECLARE @cols NVARCHAR(MAX) = '';
SELECT @cols = @cols + QUOTENAME(c.name) + ','
FROM sys.tables AS t
JOIN sys.columns AS c ON t.object_id = c.object_id
WHERE t.name = N'YourTable'
  AND c.name NOT IN (N'ExcludedColumn1', N'ExcludedColumn2');
SET @cols = LEFT(@cols, LEN(@cols) – 1);
EXEC('SELECT ' + @cols + ' FROM YourTable'); -- С помощью этого заклинания, результаты появляются!

Будьте бдительны!

С динамическим SQL необходимо обращаться с особым осторожно! Плохо подготовленные запросы могут стать потенциальной угрозой: открыть дверь для уязвимостей, таких как SQL инъекция, если не соблюдать безопасные практики составления запросов, включая параметризацию. К тому же, динамический SQL может оказаться трудным для поддержки и отладки.

Гибкость и ограничения

Динамический SQL открывает большие возможности для настройки запросов. Однако стоит иметь в виду, что не все СУБД так же гибки, как вам бы этого хотелось. Впрочем, системы, такие как Google BigQuery и DuckDB, могут приятно удивить своей встроенной поддержкой SELECT * EXCEPT.

Трансформация кода и утонченные приемы

Создание функции или хранимой процедуры

Трансформация динамического SQL в функцию или хранимую процедуру облегчит его использование:

SQL
Скопировать код
-- Пример создания хранимой процедуры в SQL Server
CREATE PROCEDURE SelectWithoutColumns 
  @TableName NVARCHAR(128),
  @ExcludedColumns NVARCHAR(MAX)
AS
BEGIN
  DECLARE @DynamicQuery NVARCHAR(MAX);
  -- (Здесь магия построения запроса) Собираем SQL, как детали ЛЕГО.
  EXEC sp_executesql @DynamicQuery; -- И вот, наш запрос внезапно появился!
END

Сценарии отладки

Отладка таких запросов может быть запутанной, но можно создать представление, исключив BLOB:

SQL
Скопировать код
CREATE VIEW ViewWithoutBlobs AS
SELECT non_blob_column1, non_blob_column2
FROM YourTable; -- Кто кого вызывает? Отладочную команду!

Решения для других СУБД

Пользователи других СУБД могут использовать свои интригующие методы:

  • В Oracle есть полиморфные табличные функции.
  • Для DB2 найдется декларация IMPLICITLY HIDDEN.

Эти приемы требуют приличного разбора и знаний по работе с конкретными системами.

Визуализация

Давайте соберем пиццу:

Markdown
Скопировать код
Ингредиенты: [🍅, 🧀, 🍄, 🍖, 🌶, 🍍]

Не заботите ананасы (🍍)?

SQL
Скопировать код
SELECT * EXCEPT 'Pineapple'; -- Пожалуйста, без ананасов!

В итоге получаем великолепную пиццу:

Markdown
Скопировать код
Идеальная пицца (🍕): [🍅, 🧀, 🍄, 🍖, 🌶]

Акцент на современных аспектах SQL

Продвинутые функции СУБД

Современные системы, такие как Snowflake и Databricks SQL, предлагают синтаксис * EXCEPT, а DuckDB offering возможность использовать EXCLUDE и REPLACE для более удобной работы со столбцами.

Особенности Oracle и DB2

В Oracle 18c можно использовать полиморфные табличные функции для динамического исключения столбцов. В DB2 столбцы могут оставаться ненаблюдаемыми для запросов SELECT *, благодаря атрибуту HIDDEN.

Командная строка и советы по отладке

Мощь командной строки

Любители командной строки, порадуйтесь! Вы можете использовать инструменты SQL командной строки, минуя графические интерфейсы.

Остерегайтесь подводных камней

Не забывайте, SELECT * может привести к неожиданным проблемам при отладке. Поэтому обдумывайте стратегии динамического SQL и подходите к выбору столбцов с осмысленной точностью.

Полезные материалы

  1. Newest 'sql' Questions – Stack Overflow — Дискуссии сообщества по вопросам работы с SQL.
  2. PostgreSQL: Documentation: 16: SELECT — Официальная документация PostgreSQL.
  3. SQL SELECT Statement — Сжатый курс об операторе SELECT.
  4. SQL Server Data Tools – SQL Server Data Tools (SSDT) — Руководство Microsoft по использованию в Visual Studio.
  5. SQL: EXCEPT Operator — Объяснение работы оператора EXCEPT.
  6. SQL Indexing and Tuning e-Book for developers: Use The Index, Luke — Руководство по оптимизации SQL-запросов.