我有一个包含以下列的表:
id,name,age,surname,lastname,catgory,active
而不是:SELECT name,age,surname,lastname,catgory FROM table
我怎样才能做出这样的事情:SELECT * FROM table [but not select id,active]
答案 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)
如果原因是为了避免列重复错误而不必指定一长列列:
临时更改重复列的名称以启用视图。
从选择和保存视图中删除重复的列
重命名更改后的列名
如果只是为了省略一列或多列: