Как я могу "выбрать *" из таблицы в MySQL, но опустить некоторые столбцы?

У меня есть таблица со следующими столбцами:

id,name,age,surname,lastname,catgory,active

Вместо SELECT name,age,surname,lastname,catgory FROM table

Как я могу сделать что-то вроде этого: SELECT * FROM table [but not select id,active]

Ответ 1

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

1. Создайте функцию, которая извлекает все требуемые имена столбцов: (я создал схему, называемую функциями для хранения этой функции)

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(_schemaName varchar(100), _tableName varchar(100), _omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1
BEGIN
    SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
    WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,_omitColumns) = 0 ORDER BY ORDINAL_POSITION;
END

Создайте и выполните инструкцию select:

SET @sql = concat('SELECT ', (SELECT 
functions.getTableColumns('test', 'employees', 'age,dateOfHire')), ' FROM test.employees'); 
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

2. ИЛИ без написания функции, которую вы могли:

SET @sql = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'test' AND table_name = 
'employees' AND column_name NOT IN ('age', 'dateOfHire')), 
' from test.eployees');  
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

* Замените тест своим собственным именем схемы

** Замените сотрудников своим собственным именем таблицы

*** Замените age, dateOfHire на столбцы, которые вы хотите пропустить (вы можете оставить его пустым, чтобы вернуть все столбцы или просто ввести одно имя столбца, чтобы опустить)

** ** Вы можете отрегулировать длину varchars в функции для удовлетворения ваших потребностей.

Ответ 2

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

select name, age, surname, lastname, category from table

Ответ 3

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

Ответ 4

Вы слишком продвинуты.

Единственный язык данных, который я видел, который поддерживает ваш синтаксис, - это язык D с конструкцией "... ALL BUT...":

Википедия - Спецификация языка D

Доступны некоторые ссылочные версии, но в основном для целей обучения.

Ответ 5

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

Ответ 6

Синтаксис SQL не поддерживается:

select * from table but not select id,active

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

Ответ 7

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

Ответ 8

SET @sql = CONCAT ('SELECT', (SELECT REPLACE (GROUP_CONCAT (COLUMN_NAME), ',', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '' AND TABLE_SCHEMA = ''), 'FROM');

PREPARE stmt1 FROM @sql; EXECUTE stmt1;

Ответ 9

Я уверен, что вы не можете. Вероятно, лучшим способом, который я могу придумать, является создание SELECT name, age, surname, lastname, category FROM table как вида, затем просто SELECT * FROM view. Я предпочитаю всегда выбирать из представления.

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