SQL исключает столбец, используя SELECT * [except columnA] FROM tableA?

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

SELECT * FROM tableA

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

SELECT * [except columnA] FROM tableA

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

Ответ 1

Я согласен со всеми... но если бы я собирался сделать что-то подобное, я мог бы сделать это следующим образом:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

Ответ 2

Нет.

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

Как минимум 2 причины:

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

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

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

Ответ 3

Автоматический способ сделать это в 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);

Ответ 4

Если вы не хотите писать каждое имя столбца вручную, вы можете использовать Script Table As, щелкнув правой кнопкой мыши по таблице или представлению в SSMS следующим образом:

enter image description here

Затем вы получите полный запрос выбора в окне "Новый редактор запросов", затем удалите ненужный столбец следующим образом:

enter image description here

Готово

Ответ 5

Вы можете создать представление, в котором есть столбцы, которые вы хотите выбрать, затем вы можете просто select * из представления...

Ответ 6

Да, возможно (но не рекомендуется).

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

Объяснение кода:

  • Объявить переменную для хранения списка имен столбцов, разделенных запятыми. По умолчанию это значение равно NULL.
  • Используйте системный вид для определения имен столбцов в нашей таблице.
  • Используйте SELECT @variable = @variable + ... FROM, чтобы объединить имена столбцов. Этот тип SELECT не возвращает результат. Это, возможно, недокументированное поведение, но работает в каждой версии SQL Server. В качестве альтернативы вы можете использовать SET @variable = (SELECT ... FOR XML PATH('')) для конкатенации строк.
  • Используйте функцию ISNULL для добавления запятой только в том случае, если это не имя первого столбца. Используйте функцию QUOTENAME для поддержки пробелов и знаков препинания в именах столбцов.
  • Используйте предложение WHERE, чтобы скрыть столбцы, которые мы не хотим видеть.
  • Используйте EXEC (@variable), также известный как динамический SQL, для разрешения имена столбцов во время выполнения. Это необходимо, потому что мы не знаем имена столбцов во время компиляции.

Ответ 7

Как и другие, вы не можете сделать это, но если вы используете Sql Server, я использую трюк, чтобы изменить вывод на запятую, а затем

select top 1 * from table

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

Ответ 8

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

Если вы посмотрите на Red-Gate SQL Prompt, вы можете набрать "SELECT * FROM MyTable", а затем переместить курсор назад после "*", и нажмите <TAB> для расширения списка полей и удаления тех нескольких полей, которые вам не нужны.

Это не идеальное решение - но чертовски хорошо!:-) Слишком плохо MS SQL Server Management Studio Intellisense все еще недостаточно интеллектуальна, чтобы предлагать эту функцию.......

Марк

Ответ 9

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

EDIT Может быть, если ваша БД поддерживает выполнение динамического SQL, вы можете написать SP и передать столбцы, которые вы не хотите видеть, и позволить ему динамически создавать запрос и возвращать результат тебе. Я думаю, что это возможно в SQL Server atleast

Ответ 10

Если вы используете SQL Server Management Studio, выполните следующие действия:

  • Введите нужное имя таблицы и выберите
  • Нажмите Alt + F1
  • o/p показывает столбцы в таблице.
  • Выберите нужные столбцы
  • Скопируйте и вставьте их в свой запрос
  • Прогоните запрос.

Enjoy.

Ответ 11

В заключение вы не можете этого сделать, но я не согласен со всем комментарием выше, там есть сценарии, где вы можете законно использовать * Когда вы создаете вложенный запрос, чтобы выбрать конкретный диапазон из целого списка (например, подкачки), почему в мире захотелось бы указать каждый столбец во внешнем выражении выбора, когда вы сделали это во внутренней?

Ответ 12

В SQL Management Studio вы можете развернуть столбцы в Обозревателе объектов, а затем перетащить элемент дерева Columns в окно запроса, чтобы получить список столбцов, разделенных запятыми.

Ответ 13

DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'

SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID(@TableName)
AND name NOT IN ('Not This', 'Or that');

SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName

EXEC (@SQL)

ОБНОВИТЬ:

Вы также можете создать хранимую процедуру для решения этой задачи, если будете использовать ее чаще. В этом примере я использовал встроенную функцию STRING_SPLIT(), которая доступна на SQL Server 2016+, но, если вам нужно, есть множество примеров того, как создать его вручную на SO.

CREATE PROCEDURE [usp_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, N'u')
 AND ss.[value] IS NULL;

 SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
 EXEC(@SQL)
END

А потом просто:

EXEC [usp_select_without] 
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';

Ответ 14

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

Использование декларативного SQL обычным способом, нет.

Я думаю, что ваш предложенный синтаксис достоин и хорош. Фактически, язык реляционных баз данных "Учебник D" имеет очень похожий синтаксис, в котором ключевые слова ALL BUT сопровождаются набором атрибутов (столбцов).

Однако SQL SELECT * уже получает большой флак (ответ @Guffa здесь является типичным возражением), поэтому я не думаю, что SELECT ALL BUT в ближайшее время попадет в SQL Standard.

Я думаю, что лучшая "работа вокруг" - создать VIEW только с теми столбцами, которые вы хотите, а затем SELECT * FROM ThatView.

Ответ 15

Если мы говорим о процедурах, он работает с этим трюком для генерации нового запроса и EXECUTE IMMEDIATE:

SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');

Ответ 16

Postgres sql имеет способ сделать это

pls ссылаются: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

Способ взлома информационной схемы

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

Вышеприведенное для моей таблицы примеров - генерирует оператор sql, который выглядит так:

SELECT o.officepark, o.owner, o.squarefootage   FROM officepark Как o

Ответ 17

Я не знаю ни одной базы данных, которая поддерживает это (SQL Server, MySQL, Oracle, PostgreSQL). Это определенно не является частью стандартов SQL, поэтому я думаю, что вам нужно указать только те столбцы, которые вы хотите.

Разумеется, вы могли бы построить свой SQL-запрос динамически и выполнить его сервер. Но это открывает возможность для SQL-инъекций.

Ответ 18

Я знаю, что это немного старо, но я просто столкнулся с той же проблемой и искал ответа. Тогда у меня был старший разработчик, который показал мне очень простой трюк.

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

В вашем операторе select просто выделите указанную выше папку столбцов и перетащите ее в окно запроса. Он вставляет все столбцы таблицы, а затем просто удаляет столбцы идентификаторов из списка столбцов...

Ответ 19

Лучший способ решить эту проблему - использовать представление, которое вы можете создать с помощью требуемых столбцов и получить форму данных

example

mysql> SELECT * FROM calls;
+----+------------+---------+
| id | date       | user_id |
+----+------------+---------+
|  1 | 2016-06-22 |       1 |
|  2 | 2016-06-22 |    NULL |
|  3 | 2016-06-22 |    NULL |
|  4 | 2016-06-23 |       2 |
|  5 | 2016-06-23 |       1 |
|  6 | 2016-06-23 |       1 |
|  7 | 2016-06-23 |    NULL |
+----+------------+---------+
7 rows in set (0.06 sec)

mysql> CREATE VIEW C_VIEW AS
    ->     SELECT id,date from calls;
Query OK, 0 rows affected (0.20 sec)

mysql> select * from C_VIEW;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2016-06-22 |
|  2 | 2016-06-22 |
|  3 | 2016-06-22 |
|  4 | 2016-06-23 |
|  5 | 2016-06-23 |
|  6 | 2016-06-23 |
|  7 | 2016-06-23 |
+----+------------+
7 rows in set (0.00 sec)

Ответ 20

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

Ответ 21

Сотрудник посоветовал хорошую альтернативу:

  • Сделайте SELECT INTO в предыдущем запросе (где вы создаете или получаете данные из) в таблицу (которую вы удалите, когда закончите). Это будет создайте структуру для вас.
  • Сделайте script как CREATE для нового запроса окно.
  • Удалите ненужные столбцы. Отформатируйте остальные столбцы в 1 лайнер и вставить в качестве списка столбцов.
  • Удалите таблицу, которую вы создан.

Готово...

Это очень помогло нам.

Ответ 22

Правая таблица кликов в обозревателе объектов, выберите верхние 1000 строк

В нем будут перечислены все столбцы, а не *. Затем удалите ненужные столбцы. Должно быть намного быстрее, чем печатать его самостоятельно.

Затем, когда вы чувствуете, что это слишком много работы, получите Red SQL SQL Prompt и введите ssf из tbl, перейдите на вкладку * и нажмите еще раз.

Ответ 23

То, что я часто использую для этого случая:

declare @colnames varchar(max)=''

select @[email protected]+','+name from syscolumns where object_id(tablename)=id and name not in (column3,column4)

SET @colnames=RIGHT(@colnames,LEN(@colnames)-1)

@colnames выглядит как column1,column2,column5

Ответ 24

Иногда одна и та же программа должна обрабатывать разные структуры базы данных. Поэтому я не мог использовать список столбцов в программе, чтобы избежать ошибок в операторах select.

* дает мне все необязательные поля. Я проверяю, существуют ли поля в таблице данных перед использованием. Это моя причина использовать * в select.

Вот как я обрабатываю исключенные поля:

Dim da As New SqlDataAdapter("select * from table", cn)
da.FillSchema(dt, SchemaType.Source)
Dim fieldlist As String = ""
For Each DC As DataColumn In DT.Columns
   If DC.ColumnName.ToLower <> excludefield Then
    fieldlist = fieldlist &  DC.Columnname & ","
   End If
  Next

Ответ 25

Я знаю, что этот вопрос старый, но я надеюсь, что он все еще может быть полезным. Ответ вдохновлен обсуждением на форумах по SQL Server. Вы можете сделать это хранимой процедурой. Его также можно изменить, добавив более одного, кроме полей.

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name not in ('colName1','colName2') and object_id = (Select id from sysobjects where name = 'tblName')
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
EXEC sp_executesql  @SQL

Ответ 26

Не проще ли это сделать:

sp_help <table_name>

-Нажмите столбец "Столбец_имя" > Копировать > Вставить (создает вертикальный список) в окно "Новый запрос" и просто введите запятые перед каждым значением столбца... закомментируйте столбцы, которые вам не нужны. гораздо меньше текста, чем любой предлагаемый здесь код и все еще управляемый.

Ответ 27

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

Ответ 28

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

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

Ответ 29

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

$i=0;
$row_array = array();

while($row = mysqli_fetch_assoc($result)){

  $row_array[$i]=$row;
  unset($row_array[$i]['col_name']);
  $i++;
}

Ответ 30

Я сделал это так, и он отлично работает (версия 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;