У меня есть таблица со следующими столбцами:
id,name,age,surname,lastname,catgory,active
Вместо SELECT name,age,surname,lastname,catgory FROM table
Как я могу сделать что-то вроде этого: SELECT * FROM table [but not select id,active]
У меня есть таблица со следующими столбцами:
id,name,age,surname,lastname,catgory,active
Вместо SELECT name,age,surname,lastname,catgory FROM table
Как я могу сделать что-то вроде этого: SELECT * FROM table [but not select id,active]
В то время как многие говорят, что лучше всего явно перечислять каждый столбец, который вы хотите вернуть, бывают ситуации, когда вы можете сэкономить время и опустить определенные столбцы из результатов (например, тестирование). Ниже я дал два варианта решения этой проблемы.
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 в функции для удовлетворения ваших потребностей.
Единственный способ сделать это, который я знаю, это перечислить каждый столбец, который вам нужен... никаких отрицательных фильтров, о которых я знаю.
select name, age, surname, lastname, category from table
вы не можете этого сделать, извините. На самом деле вы не сделали этого, если бы могли, - явно указывать эти вещи, всегда лучше, предположить, что другой разработчик добавляет новое поле, и ваше приложение не будет выполнено
Вы слишком продвинуты.
Единственный язык данных, который я видел, который поддерживает ваш синтаксис, - это язык D с конструкцией "... ALL BUT...":
Википедия - Спецификация языка D
Доступны некоторые ссылочные версии, но в основном для целей обучения.
Если в MySql нет специального расширения, вы не можете этого сделать. Вы либо получаете все, либо должны четко указывать, что хотите. Лучше всего всегда указывать столбцы, так как это не изменит поведение запроса, даже если базовая таблица изменится.
Синтаксис SQL не поддерживается:
select * from table but not select id,active
Если вам нужны все, кроме одного или нескольких столбцов, вам необходимо явно указать список нужных столбцов.
В любом случае вы не должны использовать select *. Перечислите нужные столбцы и только нужные столбцы, это лучшая практика.
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;
Я уверен, что вы не можете. Вероятно, лучшим способом, который я могу придумать, является создание SELECT name, age, surname, lastname, category FROM table
как вида, затем просто SELECT * FROM view
. Я предпочитаю всегда выбирать из представления.
Однако, как указывали другие, если к представлению вашего приложения может быть отказано, добавится другой столбец. В некоторых системах (PostgreSQL - кандидат) вы не можете изменить таблицу, не отбросив сначала представление, чтобы оно стало немного громоздким.