我对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'),'%'));
但它也不起作用。我该怎么办?只有一个表的名称与字符串匹配。
答案 0 :(得分:3)
您不能在SQL中为表名使用表达式。您需要使用创建动态SQL的存储过程并使用PREPARE
和EXECUTE
执行它。
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;