В SQL, как исключить результат из SELECT * FROM ...? - PullRequest
2 голосов
/ 30 декабря 2010

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

Допустим, если в таблице 26 полей. например field_a ... field_z. и я только хочу, чтобы запрос на выбор вернул мне только 15 полей.

Итак, обычно я делаю SELECT field_a, field_b ... field_o FROM myTable.

Что скучно. Есть ли способ в MYSQL, что я могу сделать SELECT * и сказать ему, чтобы не возвращать определенные поля?

например. что-то вроде SELECT * exclude (field_p, field_q .. field_z) FROM myTable?


Спасибо всем за ответы. :)

Ответы [ 6 ]

4 голосов
/ 30 декабря 2010

SELECT * - это зло.

Никогда не используйте его в рабочем коде.

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

SELECT `column1`, `column2`, `someothercolumn`
FROM `myTable`

Как всегда, документация может помочь в мельчайших подробностях!

3 голосов
/ 30 декабря 2010

SQL сам по себе не поддерживает запрашиваемую вами функциональность.(Если это произойдет, у него будут те же проблемы, что и у select *. См. Комментарии других пользователей)

Вот что я делаю, когда использую MySQL:

  1. Запустите MySQLклиент командной строки
  2. Выполнить describe my_table
  3. Скопировать данные в столбец Поле (выбор мыши)
  4. Вставить данные в мой редактор (TextPad)
  5. Вручную удалите ненужные столбцы
  6. Запустите макрос, который заменяет запятую новой строкой (и вставьте псевдоним таблицы)

В целом, это занимает около 20-30 секунд, чтобы создать список выбора независимо от количества столбцов.Этот способ гарантирует, что я не опишу и не забуду ни одной колонки.

2 голосов
/ 30 декабря 2010
delimiter //
DROP PROCEDURE IF EXISTS `getColumnNames`//
CREATE PROCEDURE `getColumnNames` (db_name CHAR(255), t_name CHAR(255), ex_name CHAR(255))
BEGIN
SELECT group_concat(column_name) FROM `information_schema`.`COLUMNS` C 
WHERE
table_schema = db_name
AND
table_name = t_name
AND 
column_name not in (ex_name)
GROUP BY table_schema,table_name;
END

//
delimiter ;


call getColumnNames("Db_name", "tbl_name", "col_to_exclude");
1 голос
/ 30 декабря 2010

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

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

1 голос
/ 30 декабря 2010

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

0 голосов
/ 30 декабря 2010

Я надеюсь, что нет никакого способа сделать это. Даже если он есть, я бы посоветовал не использовать его.

Решением Kindof является создание представления, которое исключает одну строку, которую вы хотите исключить, и вы можете выбрать * из представления.

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