选择除MySQL中的一列以外的所有列?

时间:2020-03-05 18:39:15  来源:igfitidea点击:

我正在尝试使用select语句从某个MySQL表中获取除一个以外的所有列。有没有简单的方法可以做到这一点?

编辑:此表中有53列(不是我的设计)

解决方案

回答

据我所知,没有。我们可以执行以下操作:

SELECT col1, col2, col3, col4 FROM tbl

并手动选择所需的列。但是,如果我们需要很多列,那么我们可能只想执行以下操作:

SELECT * FROM tbl

并忽略我们不想要的东西。

对于特殊情况,我建议:

SELECT * FROM tbl

除非我们只需要几列。如果只需要四列,则:

SELECT col3, col6, col45, col 52 FROM tbl

会很好,但是如果我们想要50列,那么构成查询的任何代码都将变得(太难理解)。

回答

你可以做:

SELECT column1, column2, column4 FROM table WHERE whatever

没有获得column3,尽管我们可能正在寻找更通用的解决方案?

回答

如果我们不想选择的列中包含大量数据,并且由于速度问题而不想包含它,并且我们经常选择其他列,则建议我们创建一个新表使用我们通常不会用原始表的键选择的一个字段,然后从原始表中删除该字段。当实际需要该额外字段时,请加入表。

回答

我们可以使用DESCRIBE my_table并使用其结果动态生成SELECT语句。

回答

在这种情况下,View能更好地工作吗?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

回答

我同意单单选择*是不够的,如果我们不需要的(如其他地方提到的那样)是BLOB,则我们不希望增加这种开销。

我将使用所需的数据创建一个视图,然后可以轻松地选择" *"(如果数据库软件支持它们)。否则,将巨大的数据放在另一个表中。

回答

如果它始终是同一列,则可以创建一个不包含该视图的视图。

否则,不,我不这么认为。

回答

即使我们查询所有列,也要指定要查询的列是一个好习惯。

因此,我建议我们在语句中写出每一列的名称(不包括不需要的列)。

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

回答

起初我以为我们可以使用正则表达式,但是由于我一直在阅读MYSQL文档,所以看来我们不能使用正则表达式。如果我们是我,那么我将使用另一种语言(例如PHP)生成要获取的列的列表,将其存储为字符串,然后使用该列表生成SQL。

回答

虽然我同意Thomas的答案(+1;)),但我想补充一点,我假设我们不需要的列几乎不包含任何数据。如果它包含大量的文本,xml或者二进制blob,则请花一些时间分别选择每一列。否则,演奏会受到影响。干杯!

回答

如果愿意,可以使用SQL生成SQL并评估它生成的SQL。这是一个通用的解决方案,因为它从信息模式中提取列名。这是Unix命令行中的示例。

替代

  • 使用mysql命令进行MYSQL
  • 带有表名的TABLE
  • 排除字段名称为EXCLUDEDFIELD
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

我们实际上只需要以这种方式提取一次列名即可构造排除该列的列列表,然后仅使用我们已构建的查询。

所以像这样:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

现在,我们可以在构造的查询中重用$ column_list字符串。

回答

实际上有一种方法,我们当然需要具有执行此操作的权限...

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;

替换&lt;table>,&lt;database>和&lt;columns_to_omit>

回答

做就是了

SELECT * FROM table WHERE whatever

然后将该列放入我们喜欢的编程语言中:php

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

回答

是的,尽管它可能是高I / O(具体取决于表),但是这是我找到的解决方法。

Select *
into #temp
from table

alter table #temp drop column column_name

Select *
from #temp

回答

在mysql定义(手动)中,没有这样的东西。但是,如果列col1,...,col100的数量非常多,则以下内容可能会有用:

mysql> CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
mysql> ALTER TABLE temp_tb DROP col_x;
mysql> SELECT * FROM temp_tb;