如何从MySQL中的表中"选择*"但省略某些列?

Mos*_*ady 12 mysql

我有一个包含以下列的表:

id,name,age,surname,lastname,catgory,active
Run Code Online (Sandbox Code Playgroud)

代替: SELECT name,age,surname,lastname,catgory FROM table

我怎么能做这样的事情: SELECT * FROM table [but not select id,active]

don*_*onL 18

虽然许多人说明确列出您想要返回的每一列是最佳做法,但在某些情况下您可能希望节省时间并省略结果中的某些列(例如测试).下面我给出了两个解决这个问题的方法.

1.创建一个检索所有所需列名的函数:(我创建了一个名为functions的模式来保存这个函数)

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
Run Code Online (Sandbox Code Playgroud)

创建并执行select语句:

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

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;
Run Code Online (Sandbox Code Playgroud)

*用您自己的架构名称替换测试

**用您自己的表名替换员工

***将age,dateOfHire替换为要省略的列(可以将其留空以返回所有列或只输入一个列名以省略)

****您可以调整功能中的varchars长度以满足您的需求

  • 不要忘记增加 group_concat_max_len,您的列可能会被切断。设置会话 group_concat_max_len = 20480 (2认同)

aw *_*rud 7

我知道的唯一方法是枚举你想要的每一列......没有我知道的负面过滤器.

select name, age, surname, lastname, category from table
Run Code Online (Sandbox Code Playgroud)