MySQL列名的通配符

时间:2012-07-13 08:24:57

标签: python mysql sql

我正在尝试从数据库中选择多个列,但不是所有列。我想要选择的所有列都将以“word”开头。

所以在伪代码中我想这样做:

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

或多或少。我没有找到任何关于如何做到这一点的文档 - 在MySQL中是否可能?基本上,我试图将一个单词列表存储在一行中,并带有一个标识符,我想在拉取记录时将所有单词与该标识符关联起来。所有单词都将作为字符串连接,并使用其标识符传递给数组/字典中的另一个函数。

我试图尽可能地进行FEW数据库调用以保持快速代码。

好的,这是你们的另一个问题:

将会有一个可变数量的列,其中包含名称“word”。为每行执行单独的数据库调用会更快,每行生成一次Python查询,或者简单地选择SELECT *会更快,并且只使用我需要的列吗?是否可以说SELECT * NOT XYZ?

4 个答案:

答案 0 :(得分:10)

不,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来代替使用字符串连接,而不是使用字符串连接。

但是,如果您所做的只是限制列数,则根本不需要执行这样的动态查询。数据库的艰苦工作是选择行;向你发送10列中的5列或全部10列没什么区别。

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

答案 1 :(得分:1)

不,您无法动态生成要选择的列的列表。它必须在您的最终查询中进行硬编码。

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

答案 2 :(得分:1)

您可以先使用

生成列名列表
SHOW COLUMNS IN tblname LIKE "word%"

然后遍历游标并生成SQL语句使用上面查询中的所有列。

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

答案 3 :(得分: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;