我有一个包含以下列的表:
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长度以满足您的需求
我知道的唯一方法是枚举你想要的每一列......没有我知道的负面过滤器.
select name, age, surname, lastname, category from table
Run Code Online (Sandbox Code Playgroud)