SQL исключает столбец, используя SELECT * [кроме columnA] FROM tableA? - PullRequest
626 голосов
/ 08 апреля 2009

Мы все знаем, что для выбора всех столбцов из таблицы мы можем использовать

SELECT * FROM tableA

Есть ли способ исключить столбцы из таблицы без указания всех столбцов?

SELECT * [except columnA] FROM tableA

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

спасибо!

Ответы [ 36 ]

0 голосов
/ 19 марта 2014

В SSMS есть более простой способ с IntelliSense и Aliasing . Попробуйте это

  1. Щелкните правой кнопкой мыши в текстовом редакторе и убедитесь, что IntelliSense включен.
  2. Введите запрос с псевдонимом [SELECT t. * FROM tablename t].
  3. Перейдите по тексту t. & Ast; и удалите & ast; , и SSMS автоматически выведет список столбцов таблицы с псевдонимами f .
Затем вы можете быстро указать только те столбцы, которые вам нужны без необходимости использовать SSMS для записи выбора в другой сценарий, а затем выполнять дополнительные операции копирования / вставки. Я использую это все время.
0 голосов
/ 01 мая 2013

Если вы используете mysql-workbench, вы можете щелкнуть правой кнопкой мыши на проводнике таблиц и нажать «Отправить в редактор SQL-> Выбрать все операторы».

Он отправляет оператор типа «Выберите col1, col2, ... из имени таблицы».

Затем удалите те, которые вам не нужны.

0 голосов
/ 08 апреля 2009

Нет, нет никакого способа сделать это, и нет веских оснований для этого.

При выборе данных вы никогда не должны использовать *, вы всегда должны указывать нужные поля. Причина в том, что вы хотите, чтобы запрос работал так же, даже если позже вы добавите еще одно поле в таблицу. Также вы указываете порядок полей в результате, чтобы перестановка полей в таблице не изменила результат.

То же самое, конечно, применимо к * except, если бы это было возможно сделать.

0 голосов
/ 02 мая 2015

Я сделал это так, и все работает отлично (версия 5.5.41):

# prepare column list using info from a table of choice
SET @dyn_colums = (SELECT REPLACE(
GROUP_CONCAT(`COLUMN_NAME`), ',column_name_to_remove','') 
FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE 
`TABLE_SCHEMA`='database_name' AND `TABLE_NAME`='table_name');

# set sql command using prepared columns
SET @sql = CONCAT("SELECT ", @dyn_colums, " FROM table_name");

# prepare and execute
PREPARE statement FROM @sql;
EXECUTE statement;
0 голосов
/ 10 октября 2018

Предложенный ответ (хранимая процедура) от BartoszX не работал для меня при использовании представления вместо реальной таблицы.

Благодарность за идею и приведенный ниже код (за исключением моего исправления) принадлежит BartoszX.

Чтобы это работало как для таблиц, так и для представлений, используйте следующий код:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[select_without]
@schema_name sysname = N'dbo',
@table_name sysname,
@list_of_columns_excluded nvarchar(max),
@separator nchar(1) = N','
AS
BEGIN
 DECLARE 
 @SQL nvarchar(max),
 @full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);

 SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
 FROM sys.columns sc
 LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
 WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name)
 AND ss.[value] IS NULL;

 SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
 EXEC(@SQL)
END
GO
0 голосов
/ 27 марта 2012

Вы можете получить SQL Complete с devart.com, который не только расширяет подстановочный знак *, как это делает SQL Prompt от Red Gate (как описано в ответе cairnz), но также предоставляет раскрывающийся список выбора столбцов с флажками, в которых вы можете отметьте все столбцы, которые вы хотите в списке выбора, и они будут автоматически вставлены для вас (и если вы затем снимите флажок, он будет автоматически удален из списка выбора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...