如何从 MySQL 的表中“选择 *”但省略某些列?
Posted
技术标签:
【中文标题】如何从 MySQL 的表中“选择 *”但省略某些列?【英文标题】:How can I "select *" from a table in MySQL but omit certain columns? 【发布时间】:2011-01-22 21:14:25 【问题描述】:我有一个包含以下列的表格:
id,name,age,surname,lastname,catgory,active
代替:SELECT name,age,surname,lastname,catgory FROM table
我怎样才能做出这样的事情:SELECT * FROM table [but not select id,active]
【问题讨论】:
Select all columns except one in mysql?的可能重复 @tstenner 是的,我相信这是您链接到的那个的副本。虽然这个没有答案,但我相信这个有 donl 给出的更好、更准确的answer。 【参考方案1】:虽然许多人说最好明确列出要返回的每一列,但在某些情况下,您可能希望节省时间并从结果中省略某些列(例如测试)。下面我给出了解决这个问题的两个选项。
1.创建一个检索所有所需列名的函数:(我创建了一个名为函数的架构来保存此函数)
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;
*将 test 替换为您自己的架构名称
**用你自己的表名替换员工
***将 age,dateOfHire 替换为您要省略的列(您可以将其留空以返回所有列或只输入一个列名以省略)
** **您可以在函数中调整varchars的长度以满足您的需求
【讨论】:
别忘了增加group_concat_max_len,你的列可能会被截断。设置会话 group_concat_max_len = 20480 如果您测试此 sql,您可能需要为测试添加一些LIMIT
。例如。 ' from test.employees LIMIT 100'
。例如。在 phpmyadmin 中显示 - 没有限制,这将在大表上超时,准备显示。然后删除该限制以进行最终处理。
将结果存储到表中可能很有用。例如,我这样做是为了导出一个没有 ID 的表(通过导出 temptable 代替)。 SET @sql = CONCAT('CREATE TABLE temptable SELECT '...
【参考方案2】:
我知道的唯一方法是枚举您想要的每一列...没有我知道的负面过滤器。
select name, age, surname, lastname, category from table
【讨论】:
【参考方案3】:你不能这样做,对不起。实际上,如果可以的话,您不应该这样做 - 明确指定这些东西总是更好,假设其他开发人员添加了新字段并且您的应用程序将失败
【讨论】:
【参考方案4】:你太先进了。
我见过的唯一支持您的语法的数据语言是具有“...ALL BUT ...”结构的 D 语言:
Wikipedia - D Language Specification
有一些参考实现可用,但主要用于教学目的。
【讨论】:
【参考方案5】:除非在 MySql 中有一些特殊的扩展,否则你不能这样做。你要么得到所有,要么必须明确说明你想要什么。最佳做法是始终命名列,因为即使基础表发生更改,这也不会改变查询行为。
【讨论】:
【参考方案6】:没有支持的 SQL 语法:
select * from table but not select id,active
如果您想要除一列或多列之外的所有列,则必须明确定义所需列的列表。
【讨论】:
【参考方案7】:无论如何,您都不应该使用 select *。枚举您想要的列并且只枚举您想要的列,这是最佳做法。
【讨论】:
【参考方案8】:SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), ',', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '' AND TABLE_SCHEMA = ''), ' FROM ');
从@sql 准备stmt1; 执行 stmt1;
【讨论】:
在为已有答案的旧问题添加答案时,请说明您的答案有何不同,以及在什么情况下您的答案可能更可取。谢谢。【参考方案9】:我相当肯定你不能。可能我能想到的最好方法是创建SELECT name, age, surname, lastname, category FROM table
作为视图,然后创建SELECT * FROM view
。无论如何,我更喜欢始终从视图中进行选择。
但是,正如其他人指出的那样,如果将另一列添加到视图中,您的应用程序可能会失败。在某些系统上也是如此(PostgreSQL 是候选系统),如果不先删除视图就无法更改表,因此它变得有点麻烦。
【讨论】:
【参考方案10】:如果原因是为了避免列重复错误而不必指定一长串列:
暂时更改重复列的名称以创建视图。
从选择并保存视图中删除重复的列
重命名更改的列名
如果原因只是为了省略一列或多列:
-
创建视图并从选择中删除列
【讨论】:
以上是关于如何从 MySQL 的表中“选择 *”但省略某些列?的主要内容,如果未能解决你的问题,请参考以下文章