SELECT * EXCEPT в SQL: Исключение поля из выборки
Быстрый ответ
Чтобы корректно выполнить запрос SELECT * EXCEPT
, необходимо использовать динамический 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'); -- И ожидаемое чудо произошло!
Выбирайте необходимые столбцы, исключайте нежелательные и получайте свои результаты.
Глубже в динамический SQL
Динамический SQL станет надежным помощником в задачах программного формирования запросов, давая возможность динамически исключать столбцы из выражения SELECT. Но помните о мудрости — необдуманное использование силы может привести к неприятным последствиям.
Волшебство системных таблиц и схем
Для того чтобы отфильтровать ненужные столбцы, нам помогут системные таблицы или INFORMATION_SCHEMA:
-- Небольшой трюк от 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 Server
CREATE PROCEDURE SelectWithoutColumns
@TableName NVARCHAR(128),
@ExcludedColumns NVARCHAR(MAX)
AS
BEGIN
DECLARE @DynamicQuery NVARCHAR(MAX);
-- (Здесь магия построения запроса) Собираем SQL, как детали ЛЕГО.
EXEC sp_executesql @DynamicQuery; -- И вот, наш запрос внезапно появился!
END
Сценарии отладки
Отладка таких запросов может быть запутанной, но можно создать представление, исключив BLOB:
CREATE VIEW ViewWithoutBlobs AS
SELECT non_blob_column1, non_blob_column2
FROM YourTable; -- Кто кого вызывает? Отладочную команду!
Решения для других СУБД
Пользователи других СУБД могут использовать свои интригующие методы:
- В Oracle есть полиморфные табличные функции.
- Для DB2 найдется декларация
IMPLICITLY HIDDEN
.
Эти приемы требуют приличного разбора и знаний по работе с конкретными системами.
Визуализация
Давайте соберем пиццу:
Ингредиенты: [🍅, 🧀, 🍄, 🍖, 🌶, 🍍]
Не заботите ананасы (🍍)?
SELECT * EXCEPT 'Pineapple'; -- Пожалуйста, без ананасов!
В итоге получаем великолепную пиццу:
Идеальная пицца (🍕): [🍅, 🧀, 🍄, 🍖, 🌶]
Акцент на современных аспектах SQL
Продвинутые функции СУБД
Современные системы, такие как Snowflake и Databricks SQL, предлагают синтаксис * EXCEPT
, а DuckDB offering возможность использовать EXCLUDE
и REPLACE
для более удобной работы со столбцами.
Особенности Oracle и DB2
В Oracle 18c можно использовать полиморфные табличные функции для динамического исключения столбцов. В DB2 столбцы могут оставаться ненаблюдаемыми для запросов SELECT *
, благодаря атрибуту HIDDEN.
Командная строка и советы по отладке
Мощь командной строки
Любители командной строки, порадуйтесь! Вы можете использовать инструменты SQL командной строки, минуя графические интерфейсы.
Остерегайтесь подводных камней
Не забывайте, SELECT *
может привести к неожиданным проблемам при отладке. Поэтому обдумывайте стратегии динамического SQL и подходите к выбору столбцов с осмысленной точностью.
Полезные материалы
- Newest 'sql' Questions – Stack Overflow — Дискуссии сообщества по вопросам работы с SQL.
- PostgreSQL: Documentation: 16: SELECT — Официальная документация PostgreSQL.
- SQL SELECT Statement — Сжатый курс об операторе SELECT.
- SQL Server Data Tools – SQL Server Data Tools (SSDT) — Руководство Microsoft по использованию в Visual Studio.
- SQL: EXCEPT Operator — Объяснение работы оператора EXCEPT.
- SQL Indexing and Tuning e-Book for developers: Use The Index, Luke — Руководство по оптимизации SQL-запросов.