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

时间:2010-03-02 19:15:42

标签: mysql

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

id,name,age,surname,lastname,catgory,active

而不是:SELECT name,age,surname,lastname,catgory FROM table

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

10 个答案:

答案 0 :(得分: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

创建并执行select语句:

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

<强> 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;

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

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

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

** **您可以调整函数中varchars的长度以满足您的需求

答案 1 :(得分:7)

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

select name, age, surname, lastname, category from table

答案 2 :(得分:2)

你不能那样做,对不起。实际上,如果可以的话,你还没有做到 - 明确指定这些事情总是更好,假设其他开发人员添加新字段并且您的应用程序将失败

答案 3 :(得分:2)

你太先进了。

我见过的唯一支持语法的数据语言是D语言及其“...... ALL BUT ...”结构:

Wikipedia - D Language Specification

有一些参考实现可用,但主要用于教学目的。

答案 4 :(得分:1)

除非在MySql中有一些特殊的扩展名,否则你无法做到这一点。你要么得到所有,要么必须明确说出你想要的。最好始终为列命名,因为即使基础表发生更改,这也不会改变查询行为。

答案 5 :(得分:1)

不支持SQL语法:

select * from table but not select id,active

如果您想要除一个或多个列以外的所有列,则必须明确定义所需的列列表。

答案 6 :(得分:1)

你不应该使用select *。枚举所需的列,只列出所需的列,这是最佳实践。

答案 7 :(得分:1)

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

PREPARE stmt1 FROM @sql; 执行stmt1;

答案 8 :(得分:0)

我很确定你做不到。可能我认为最好的方法是创建SELECT name, age, surname, lastname, category FROM table作为视图,然后只创建SELECT * FROM view。无论如何,我更喜欢从视图中选择。

但是,正如其他人指出的那样,如果另一列添加到视图中,您的应用程序可能会失败。在某些系统上(PostgreSQL是一个候选系统),你不能在没有先删除视图的情况下改变表格,因此它会变得有点麻烦。

答案 9 :(得分:0)

如果原因是为了避免列重复错误而不必指定一长列列:

  1. 临时更改重复列的名称以启用视图。

  2. 从选择和保存视图中删除重复的列

  3. 重命名更改后的列名

如果只是为了省略一列或多列:

  1. 创建视图并从选择中删除列