使用通配符选择所有以 XXX 开头的列?

Posted

技术标签:

【中文标题】使用通配符选择所有以 XXX 开头的列?【英文标题】:Selecting all columns that start with XXX using a wildcard? 【发布时间】:2011-06-15 10:10:06 【问题描述】:

我的数据库中有几列名称相似。 我如何根据它们开头的单词来选择它们? 这是一个示例表格布局:

我尝试使用

选择特定事物(本例中为食物种类)的所有信息
$Food = "Vegetable"; 
mysql_query("SELECT `" . $Food . " %` FROM `Foods`");

但它似乎没有用。

任何帮助将不胜感激:-)

编辑:显然这在我的示例中并不清楚,但我已经知道所有列的第一个单词。列始终相同,并且从未添加或删除任何“食物种类”。 PHP 变量仅用于确定我需要几种设置类型中的哪一种。

【问题讨论】:

除了我想不出任何理智的方法来做到这一点之外,这不是一个好主意,原因与 SELECT * 不是一个好主意一样;如果您添加/删除与蔬菜相关的列,您的查询将返回意外结果。 我想这里的每个人都明白这个问题。我们所说的是,您将无法在一次调用中创建这样的查询。如果您知道每个列的名称,然后循环进入它们以查找以您的前缀开头的列,然后动态生成 SQL Select 语句。 好吧,在根据列名选择数据时不允许使用通配符这一事实让我有点困惑。 【参考方案1】:

您必须动态构建 SQL。作为起点,这将为您提供您正在寻找的列名。

SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'Foods'
        AND table_schema = 'YourDB'
        AND column_name LIKE 'Vegetable%'

【讨论】:

对不起,也许我的例子不够清楚,但我已经知道所有列名,它们将保持不变。我只是在寻找正确的通配符和使用它的方法。 @Chris:您不能在 select 语句的列列表中使用通配符。 SQL 必须动态构建,以便在选择中显式引用每个列名。 好的,然后我将单独定义我的列,在我定义的每个名称中使用 php 变量 :-) 谢谢【参考方案2】:

没有办法完全按照您的意愿去做。您可以先执行另一个查询以获取所有列名,然后在 PHP 中处理它们并构建第二个查询,但这可能比写出您想要的名称更复杂。

或者这个查询需要动态的原因是什么?表的结构会经常变化吗?

【讨论】:

不,它永远不会改变,所以我认为这不是很复杂,我只需要正确的通配符来匹配某种类型的所有列(= 以特定单词开头,定义为一个 PHP 变量)。 @Chris:这就是我要说的,没有这样的通配符。 MySQL 不支持。您要么必须为所有列添加*,要么单独定义它们。 如何单独定义它们?一个例子的链接就足够了:] 如果列始终保持不变,您可以在某处定义一个变量,例如 $VegetableColumns = 'VegetableName, VegetableColor';,然后在查询中使用它。 单独定义列只需SELECT VegetableName, VegetableColor FROM table。如果你有像我上一条评论这样的变量,你可以做类似$query = "SELECT $VegetableColumns FROM table";【参考方案3】:

这是我纯粹使用 MySQL 的一种方式:

SET SESSION group_concat_max_len = 2048;
SELECT GROUP_CONCAT(CONCAT(" ",CAST(column_name as CHAR(50)))) FROM information_schema.columns WHERE table_name='real_big_table' AND column_name LIKE 'prefix%' INTO @sub;
SET @x = CONCAT("SELECT ",@sub," FROM my_db.real_big_table WHERE my_db.real_big_table.country_id='US'");
PREPARE stmt FROM @x;
EXECUTE stmt;

我的回答灵感来自this answer。

注意:我的“内部 DBA”(以我肩膀上的小天使的形式)告诉我需要这样做可能是数据库结构不良的标志,但我的“内部黑客”(以我另一肩上的小恶魔的形式)说“完成它!”

【讨论】:

【参考方案4】:

将您的数据库转换为一个包含三列的数据库:

Product_type (vegetable, fruit, etc) 

Name (apple, carrot, etc) 

color (orange, yellow, etc)

现在你可以使用你的通配符来获取特定的类型,因为它现在是在列中,而不是在标题中。

【讨论】:

【参考方案5】:

如何分两步创建查询?

1- 从 db 架构(或其他地方)获取列的名称

2- 使用与您的过滤条件匹配的列名称生成一个 sql 查询。

【讨论】:

我已经知道列的名称,我正在寻求帮助来创建将匹配相似列的查询,其中我已经知道第一个单词。

以上是关于使用通配符选择所有以 XXX 开头的列?的主要内容,如果未能解决你的问题,请参考以下文章

linux命令行大全第四章[通配符的使用]

jquery选择器通配符

带你认识Linux中的通配符

jQuery 属性名称选择器中的通配符?

*4 通配符及管道与反引号“`”与花括号“{}”的使用

jQuery属性的名称选择器中的通配符?