MySQL 的列名中的通配符

Posted

技术标签:

【中文标题】MySQL 的列名中的通配符【英文标题】:Wildcards in column name for MySQL 【发布时间】:2012-07-13 02:01:44 【问题描述】:

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

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

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

或多或少。我没有找到有关如何执行此操作的任何文档-在 mysql 中是否可能?基本上,我试图在单行中存储一个带有标识符的单词列表,并且我想在提取记录时将所有单词与该标识符相关联。所有的单词都将作为一个字符串连接起来,并通过它们的标识符传递给数组/字典中的另一个函数。

我正在尝试尽可能少地调用数据库以保持快速代码。

好的,还有一个问题要问你们:

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

【问题讨论】:

使用行而不是列不是更容易吗? 嗯,问题在于,这可能是我的数据库设计(这个项目让我很头疼),然后我需要为每个单词设置一行,以及一个相关的价值,我不希望这样,因为这些词都是相关的。它们将成为对 API 的同一查询的一部分。其他具有不同标识符的将是不同的查询。 如果您有新问题,请使用新帖子。回答者不会收到您编辑此帖子的通知,更不用说您编辑它以提出另一个问题。 【参考方案1】:

不,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 从结果集中挑选列。

【讨论】:

这难道不是给了我必须使用的确切列表吗? 是的,但是您必须使用 Python 来构建最终的 SQL;没有纯 SQL 方式来实现您的伪代码查询。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您可以先使用生成列名列表

SHOW COLUMNS IN tblname LIKE "word%"

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

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

【讨论】:

【参考方案4】:

这可能会有所帮助: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;

【讨论】:

以上是关于MySQL 的列名中的通配符的主要内容,如果未能解决你的问题,请参考以下文章

SQL之toplike通配符inbetween

加入时如何不使用通配符避免列名重复

[MySQL] 用正则表达式进行搜索

MySQL中的通配符与正则表达式

MySQL中的通配符搜索,LIKE '%string%'(小提琴)[重复]

MySQL 中的 GROUP BY 使用通配符