我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?

编辑:在这个表格中有53列(不是我的设计)


当前回答

即使要查询所有列,也最好指定要查询的列。

因此,我建议您在语句中写下每一列的名称(不包括您不想要的列)。

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

其他回答

即使要查询所有列,也最好指定要查询的列。

因此,我建议您在语句中写下每一列的名称(不包括您不想要的列)。

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

如果它总是相同的一列,那么你可以创建一个不包含它的视图。

否则,不,我不这么认为。

基于@Mahomedalid的答案,我做了一些改进,以支持“选择mysql中除某些列外的所有列”

SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;

如果确实有很多cols,则使用此sql语句更改group_concat_max_len

SET @@group_concat_max_len = 2048;

这个问题是关于MySQL的,但我仍然认为值得一提的是,至少谷歌BigQuery和H2原生支持* EXCEPT语法。

SELECT * FROM actor

生产:

|actor_id|first_name|last_name   |last_update            |
|--------|----------|------------|-----------------------|
|1       |PENELOPE  |GUINESS     |2006-02-15 04:34:33.000|
|2       |NICK      |WAHLBERG    |2006-02-15 04:34:33.000|
|3       |ED        |CHASE       |2006-02-15 04:34:33.000|

SELECT * EXCEPT (last_update) FROM actor

生产:

|actor_id|first_name|last_name   |
|--------|----------|------------|
|1       |PENELOPE  |GUINESS     |
|2       |NICK      |WAHLBERG    |
|3       |ED        |CHASE       |

也许,MySQL的未来版本也会支持这种语法?

Mahomedalid发布的答案有一个小问题:

在替换函数代码中替换“<columns_to_delete>,”用“”,如果要替换的字段是concat字符串中的最后一个字段,那么这个替换会有一个问题,因为最后一个字段没有字符逗号“,”并且没有从字符串中删除。

我的建议:

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

替换<表>,<数据库>和'

在我的情况下,被删除的列被字符串“FIELD_REMOVED”所取代,这是因为我试图安全内存。(我正在删除的字段是一个大约1MB的BLOB)