2012-07-13 110 views
8

我想从数据库中选择多个列,但不是所有的列。我想选择的所有列都以“单词”开头。MySQL列名中的通配符

因此,在伪代码,我想这样做:

SELECT "word%" from searchterms where onstate = 1; 

更多或更少。我没有找到任何有关如何做到这一点的文档 - 在MySQL中可能吗?基本上,我试图用一个标识符在一行中存储单词列表,并且当我拉取记录时,我想将所有单词与该标识符相关联。所有的单词都会以字符串的形式连接,并以数组/字典的形式传递给另一个函数。

我试图使尽可能少的数据库调用,以保持快速的代码。

好吧,这里为你们一个问题:

有将要在他们的名字“字”列的数目可变。对每一行执行单独的数据库调用会更快吗,每行生成一个Python查询,还是仅仅使用SELECT *,并且只使用我需要的列?有没有可能说SELECT * NOT XYZ?

+0

使用行而不是列更容易吗? – 2012-07-13 08:30:16

+0

那么,这个问题,它可能是我的数据库设计(它在这个项目上一直很头痛),是那么我需要每行一个单词和一个关联的值,而我不因为这些词都是相关的。它们将成为API相同查询的一部分。其他人,具有不同的标识符将是一个不同的查询。 – 2012-07-13 08:33:16

+2

如果您有新问题,请使用新帖子。答复者没有收到你编辑这篇文章的通知,更不用说你编辑它来问另一个问题。 – 2012-07-13 08:41:07

回答

8

不,SQL不提供任何语法来做这样的选择。

什么可以首先要求MySQL为a list of column names,然后根据该信息生成SQL查询。

SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'your_table' 
    AND column_name LIKE 'word%' 

让我们来选择列名称。然后,你可以做,在Python:

"SELECT * FROM your_table WHERE " + ' '.join(['%s = 1' % name for name in columns]) 

而不是使用字符串连接的,我会建议使用SQLAlchemy,而不是做SQL生成适合你。

但是,如果你所做的只是限制列的数量,那么根本就不需要做这样的动态查询。数据库的辛勤工作是选择行;发送10列中的5列或全部10列几乎没有区别。

在这种情况下,只需使用"SELECT * FROM ..."并使用Python从结果集中挑选出列。

+0

难道这实际上不会给我必须使用的确切列表吗? – 2012-07-13 08:30:15

+0

是的,但是您必须使用Python来构造最终的SQL;没有实现您的psuedocode查询的纯SQL方式。 – 2012-07-13 08:33:19

1

不,您不能动态生成要选择的列的列表。它将不得不在最终查询中进行硬编码。

您当前的查询将生成一列结果集,并且该列的值将为满足该条件的所有行中的字符串"word%"

+0

请参阅上面的列名称:http://stackoverflow.com/a/11466826/1091386 – icedwater 2014-04-01 05:55:25

1

你可以先使用

SHOW COLUMNS IN tblname LIKE "word%" 

然后循环通过游标生成列名的列表,并生成SQL语句使用的所有列从上面的查询。

"SELECT {0} FROM searchterms WHERE onstate = 1".format(', '.join(columns)) 
0

这可能是有益的:MySQL wildcard in select

总之它直接是不可能在MySQL。

作为一个肮脏的解决方法,你可以做的是从表中获取所有的列名和初始查询(http://dev.mysql.com/doc/refman/5.0/en/show-columns.html),然后在python中比较名称是否与你的模式匹配。之后,您可以使用找到的列名称来执行MySQL select语句,如下所示:

SELECT word1, word2, word3 from searchterms where onstate = 1;