MySQL从表名匹配字符串中选择

时间:2016-05-25 20:58:07

标签: mysql

我对SQL比较陌生,而且我一直在努力弄清楚如何从匹配字符串的表中选择行。 表的名称使用当前月份和年份。 它看起来像这样:

XXXX.xxx_YY_MM

其中XXXX是数据库,YY是年份,MM是月份。 所以通常查询看起来像这样:

select * from XXXX.xxx_16_05;

但是,我希望它能够根据日期进行更改。 所以我认为这会奏效:

select * from (select concat('XXXX.xxx_',date_format(now(), '%y_%m'))));

concat位给了我一些看起来与表名完全相同的东西。但它不起作用,我不知道为什么。它说每个表必须拥有它自己的别名。我不知道该怎么做。

或者,我想也许这样的事情可以。

 select * from  (select * from information_schema.tables where table_name like concat('%logsms_',date_format(now(), '%y_%m'),'%'));

但它也不起作用。我该怎么办?只有一个表的名称与字符串匹配。

2 个答案:

答案 0 :(得分:3)

您不能在SQL中为表名使用表达式。您需要使用创建动态SQL的存储过程并使用PREPAREEXECUTE执行它。

SET @sql = CONCAT('SELECT * FROM XXXX.xxx_', DATE_FORMAT(NOW(), '%y_%m'));
PREPARE stmt FROM @sql;
EXECUTE stmt;

需要这个的数据库设计似乎是一个糟糕的决定。您应该有一个表,其中日期在列中,而不是每个月的单独表。

如果您从编程语言运行查询,则可以使用自己的日期函数来构建SQL。

答案 1 :(得分:0)

请找到以下查询,以匹配字符串检索所有表。

select table_schema as database_name,table_name from information_schema.tables
where table_name like '%your_table_name%' order by table_schema, table_name;