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

Может быть, что-то подобное сделало бы работу тоже?

class Test<T> {
    public Test(Proxy<T> proxy) { this.MyProxy = proxy; }
    public Proxy<T> MyProxy { get; private set; }
}
637
задан a_horse_with_no_name 5 April 2018 в 08:49
поделиться

16 ответов

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

2
ответ дан 22 November 2019 в 21:44
поделиться

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

РЕДАКТИРОВАТЬ Может быть, если ваша БД поддерживает выполнение динамического SQL, вы могли бы написать SP и передать столбцы, которые вы не хотите видеть, и позволить этому создать запрос динамически и вернуть результат вам. Я думаю, что это выполнимо в SQL Server по крайней мере

8
ответ дан 22 November 2019 в 21:44
поделиться

You could create a view that has the columns you wish to select, then you can just select * from the view...

38
ответ дан 22 November 2019 в 21:44
поделиться

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

select top 1 * from table

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

17
ответ дан 22 November 2019 в 21:44
поделиться

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

Если вы посмотрите на SQL-запрос Red-Gate , вы можете набрать «SELECT * FROM MyTable», а затем переместить курсор назад после «*» и нажать , чтобы разверните список полей и удалите те несколько полей, которые вам не нужны.

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

Marc

11
ответ дан 22 November 2019 в 21:44
поделиться

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

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

3
ответ дан 22 November 2019 в 21:44
поделиться

Нет.

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

Не менее 2 причины:

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

Редактировать (июль 2011 г.):

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

282
ответ дан 22 November 2019 в 21:44
поделиться

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

SELECT * , "" as password FROM tableName;

1
ответ дан 22 November 2019 в 21:44
поделиться

Современный диалект SQL как BigQuery предлагает отличное решение

ВЫБОР * КРОМЕ (ColumnNameX, [ColumnNameY...])

Это - очень мощный синтаксис SQL для предотвращения длинного списка столбцов, которые должны быть обновлены все время из-за смен имени столбца таблицы. И эта функциональность отсутствует в текущей реализации SQL Server, которая является жалостью. Хотелось бы надеяться, однажды, Microsoft Azure будет большим количеством дружелюбного специалиста по обработке и анализу данных.

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

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers

1
ответ дан 22 November 2019 в 21:44
поделиться

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

/* 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
417
ответ дан 22 November 2019 в 21:44
поделиться

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

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')

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

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

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

6
ответ дан 22 November 2019 в 21:44
поделиться

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

6
ответ дан 22 November 2019 в 21:44
поделиться

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

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

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

-2
ответ дан 22 November 2019 в 21:44
поделиться

При использовании PHP, Вы просто делаете свой запрос, и затем можно сбросить определенный элемент:

$sql = "SELECT * FROM ........ your query";
    $result = $conection->query($sql); // execute your query
    $row_cnt = $result->num_rows;   

if ($row_cnt > 0) {
        while ($row = $result->fetch_object()) {
            unset($row->your_column_name); // Exclude column from your fetch
            $data[] = $row;
}
echo json_encode($data); // or whatever
-1
ответ дан 22 November 2019 в 21:44
поделиться

В зависимости от размера вашей таблицы вы можете экспортировать ее в Excel и транспонировать, чтобы получить новую таблицу, в которой столбцы исходной таблицы будут строками в новой таблице. Затем верните его в свою базу данных SQL, выберите строки в соответствии с условием и вставьте их в другую новую таблицу. Наконец, экспортируйте эту новую таблицу в Excel и сделайте еще одно транспонирование, чтобы получить желаемую таблицу и вернуть ее в свою базу данных SQL.

Не уверен, что перенос можно выполнить в базе данных SQL, если да, то это будет еще проще.

Джефф

-1
ответ дан 22 November 2019 в 21:44
поделиться