11

Исключить колонку с помощью SELECT * [кроме columnA] FROM tableA?

15

Заголовок: Как исключить столбцы из выборки в SQL без указания всех столбцов?

Описание проблемы:

Я знаю, что для выбора всех столбцов из таблицы можно использовать следующий запрос:

SELECT * FROM tableA

Однако, есть ли способ исключить один или несколько столбцов из выборки, не указывая все остальные столбцы?

Например, я хотел бы сделать что-то похожее на:

SELECT * [except columnA] FROM tableA

На данный момент единственный способ, который я знаю — это вручную указывать все столбцы, кроме нежелательных, что занимает много времени и сил. Я ищу решение, которое могло бы упростить этот процесс и облегчить будущее сопровождение, особенно если структура таблицы изменится и количество столбцов будет больше или меньше. Есть ли у кого-то опыт или предложения по этому поводу?

5 ответ(ов)

6

Вы можете попробовать сделать это следующим образом:

/* Поместите данные во временную таблицу */
SELECT * INTO #TempTable
FROM YourTable
/* Удалите ненужные столбцы */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Получите результаты и удалите временную таблицу */
SELECT * FROM #TempTable
DROP TABLE #TempTable
3

Нет.

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

Причины как минимум две:

  • Это делает ваш контракт между клиентом и базой данных стабильным. Одни и те же данные, каждый раз.
  • Производительность, покрывающие индексы.

Изменение (Июль 2011):

Если вы перетащите узел Columns для таблицы из Обозревателя объектов, то в окне запроса появится список столбцов в формате CSV, что достигает одной из ваших целей.

1

Современные SQL-диалекты, используемые такими платформами, как BigQuery, Databricks и Snowflake, предлагают отличное решение для выбора столбцов из таблицы. Например, вы можете использовать следующий синтаксис:

SELECT * EXCEPT(ColumnNameX, [ColumnNameY, ...])
FROM TableA

Этот мощный синтаксис SQL позволяет избежать длинного списка столбцов, который необходимо постоянно обновлять из-за изменений в именах столбцов таблицы. К сожалению, такая функциональность отсутствует в текущей реализации SQL Server, что весьма огорчает. Надеюсь, что когда-нибудь это станет стандартом SQL и сделает работу с данными более удобной дляData Scientist'ов.

Для дата-сайентистов важно иметь возможность быстро упростить запрос и исключить некоторые столбцы (например, из-за дублирования или по другим причинам).

Дополнительные ссылки для ознакомления:

Также стоит отметить, что DuckDB использует синтаксис EXCLUDE вместо EXCEPT, что можно найти в документации: DuckDB: Синтаксис запроса.

0

Автоматизированный способ сделать это в SQL (SQL Server) выглядит следующим образом:

declare @cols varchar(max), @query varchar(max);
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']';

SELECT @query = 'select ' + @cols + ' from MyTable';  
EXEC (@query);

Этот код динамически создает запрос для выбора всех столбцов из таблицы MyTable, за исключением указанных столбцов (ColumnIDontWant1 и ColumnIDontWant2). Сначала он формирует список столбцов, затем строит и выполняет полный SQL-запрос.

0

Вы можете создать представление (view), в котором будут только те столбцы, которые вам нужны, а затем просто выполните SELECT * FROM имя_представления.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь