我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?
编辑:在这个表格中有53列(不是我的设计)
我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?
编辑:在这个表格中有53列(不是我的设计)
当前回答
Mahomedalid发布的答案有一个小问题:
在替换函数代码中替换“<columns_to_delete>,”用“”,如果要替换的字段是concat字符串中的最后一个字段,那么这个替换会有一个问题,因为最后一个字段没有字符逗号“,”并且没有从字符串中删除。
我的建议:
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
'<columns_to_delete>', '\'FIELD_REMOVED\'')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table>'
AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
替换<表>,<数据库>和'
在我的情况下,被删除的列被字符串“FIELD_REMOVED”所取代,这是因为我试图安全内存。(我正在删除的字段是一个大约1MB的BLOB)
其他回答
在尝试@Mahomedalid和@Junaid的解决方案时,我发现了一个问题。所以我想分享一下。如果列名中有空格或连字符(如check-in),则查询将失败。简单的解决方法是在列名周围使用反标记。修改后的查询如下
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
实际上有一种方法,当然你需要有权限才能这样做…
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
替换<表>,<数据库>和< columns_to_省略>
公认的答案有几个缺点。
当表或列名需要反引号时,该方法失败 如果要省略的列位于列表的最后,则会失败 它需要列出两次表名(一次用于选择文本,另一次用于查询文本),这是多余和不必要的 它可能以错误的顺序返回列名
所有这些问题都可以通过在GROUP_CONCAT的分隔符中包含反勾号并使用WHERE条件而不是REPLACE()来克服。出于我的目的(我想很多人也是如此),我希望列名按照它们在表中出现的顺序返回。为了实现这一点,我们在GROUP_CONCAT()函数中使用了显式的ORDER BY子句:
SELECT CONCAT(
'SELECT `',
GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
'` FROM `',
`TABLE_SCHEMA`,
'`.`',
TABLE_NAME,
'`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
AND `TABLE_NAME` = 'my_table'
AND `COLUMN_NAME` != 'column_to_omit';
即使要查询所有列,也最好指定要查询的列。
因此,我建议您在语句中写下每一列的名称(不包括您不想要的列)。
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
我同意列出所有列的“简单”解决方案,但这可能会造成负担,而且打字错误可能会浪费大量时间。我使用“getTableColumns”函数检索适合粘贴到查询中的列的名称。然后我要做的就是删除我不想要的。
CREATE FUNCTION `getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
您的结果返回一个以逗号分隔的字符串,例如…
col1, col2 col3 col4, ... col53