Выбрать все столбцы, кроме одного в MySQL? - PullRequest
333 голосов
/ 12 августа 2008

Я пытаюсь использовать оператор выбора, чтобы получить все столбцы из определенной таблицы MySQL, кроме одного. Есть ли простой способ сделать это?

РЕДАКТИРОВАТЬ: в этой таблице 53 столбца (НЕ МОЙ ДИЗАЙН)

Ответы [ 29 ]

204 голосов
/ 30 сентября 2009

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

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

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

Замена <table>, <database> and <columns_to_omit>

46 голосов
/ 16 декабря 2010

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

mysql> CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
mysql> ALTER TABLE temp_tb DROP col_x;
mysql> SELECT * FROM temp_tb;
42 голосов
/ 12 августа 2008

Будет ли лучше работать View в этом случае?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table
33 голосов
/ 12 августа 2008

Вы можете сделать:

SELECT column1, column2, column4 FROM table WHERE whatever

без получения column3, хотя, возможно, вы искали более общее решение?

31 голосов
/ 13 июня 2013

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

, например

SELECT *, NULL AS salary FROM users
22 голосов
/ 12 августа 2008

Насколько я знаю, нет. Вы можете сделать что-то вроде:

SELECT col1, col2, col3, col4 FROM tbl

и вручную выберите нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто сделать:

SELECT * FROM tbl 

и просто игнорируй то, что не хочешь.

В вашем конкретном случае я бы предложил:

SELECT * FROM tbl

если только вам не нужны только несколько столбцов. Если вам нужно только четыре столбца, то:

SELECT col3, col6, col45, col 52 FROM tbl

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

13 голосов
/ 18 июля 2013

При поиске решений @Mahomedalid и @Junaid я обнаружил проблему. Так что думал поделиться этим. Если в имени столбца есть пробелы или дефисы, такие как регистрация, запрос не будет выполнен. Простой обходной путь - использовать обратную галочку вокруг имен столбцов. Модифицированный запрос ниже

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
10 голосов
/ 12 августа 2008

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

9 голосов
/ 12 августа 2008

Вы можете использовать DESCRIBE my_table и использовать результаты этого для динамической генерации оператора SELECT.

7 голосов
/ 08 июля 2011

Моя главная проблема - много столбцов, которые я получаю при объединении таблиц. Хотя это не ответ на ваш вопрос (как выбрать все, кроме определенных столбцов из таблицы одна ), я думаю, стоит упомянуть, что вы можете указать table.<em>, чтобы получить все столбцы из определенной таблицы вместо того, чтобы просто указать </em>.

Вот пример того, как это может быть очень полезно:

select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode

from users

left join user_meta as phone
on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') )

left join user_meta as zipcode
on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') )

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

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