2011-04-07 84 views
2

有什么方法可以选择带有通配符的列。选择MySQL通配符

能够选择具有名称类型可以是“SELECT %type% from table_name”列?

回答

3

不是。您可以使用* column wildcard来选择所有列。

SELECT a.id, a.title, b.* 
    FROM articles AS a 
    JOIN blurbs AS b ON a.id = b.article 

但是,除非你正在写一个数据库管理程序,你不应该使用*:如果你要加入多个表,您可以通过表名或别名前缀*选择特定的表中的所有列。

或者,您可以通过获取表元数据来获取列名称,从而在SQL或其他语言中构建语句。仅使用MySQL,您可以查询INFORMATION_SCHEMA数据库中的COLUMNS表以获取列名,并使用GROUP_CONCAT为该语句构建列列表。

SELECT CONCAT(
     'SELECT ', 
     GROUP_CONCAT(COLUMN_NAME SEPARATOR ', '), 
     ' FROM ', :db, '.', :table, 
     ' WHERE ...' 
    ) 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA=:db AND TABLE_NAME=:table 

用适当的值替换“:db”,“:table”和“...”。你甚至可以把它变成一个准备好的声明,以便你可以将它用于任何表格。从那里,PREPAREEXECUTE构建的声明。

如果你不局限于SQL进行编程,它应该不那么混乱。您选择的语言的数据库驱动程序可能会提供获取元数据的方法。实际的实现类似于纯粹的SQL方法(获取列名,汇编语句,准备,执行),但不应该如此丑陋,因为你会使用算法而不是声明式语言。

我会在看到,这是实际需要的情况很感兴趣..

+0

如果你实现了一个类层次结构作为规范化的一组表,你将有几个表连接到基类表。如果知道要检索的实例的类型,则知道要从中读取的表。因此,需要参数表名称。如果我没有弄错,hibernate会对这些情况下涉及的所有表进行联合查询并相应地处理结果。 – Dan 2011-04-07 13:57:11

+0

SHOW COLUMNS FROM table_name where'like'%type%' - 如果在子查询中使用,但它显示额外的列类型,空,键,默认,额外等,这可能会有所帮助......我只希望列名更好逗号分隔.. 。搜索解决方案... – Mark 2011-04-07 14:03:39

+0

1.使用查询 获取所需的列名2.使用点1的结果并在选择查询中使用... – Mark 2011-04-07 14:05:26

0

当然是可能的,如果你使用的是前端的语言。如果php只是使用

$fieldlist= "cola, colb "; 
$tablename="tabl"; 
"select $fieldlist from $table" 

我的直觉告诉你正在做一些简单的使用php-mysql,但我可能是错的。

1

您可以使用information_schema然后使用准备好的语句在名称内找到所有包含类型的字段。

set @str = (concat('select ',(select concat(group_concat(column_name),' from ',table_name) 
from information_schema.columns 
where table_schema = 'your_db_name' and table_name = 'your_table_name' and column_name like '%type%'))); 
prepare stmt from @str; 
execute stmt; 
deallocate prepare stmt;