使用 MySql 8.0.17 上的存储过程在数据库上查找表名

Posted

技术标签:

【中文标题】使用 MySql 8.0.17 上的存储过程在数据库上查找表名【英文标题】:Find table name on the database using stored procedure on MySql 8.0.17 【发布时间】:2021-03-08 15:18:14 【问题描述】:

这是存储在数据库中的表的列表名称mysql version 8.0.17

+------------------+
| listTable        |
+------------------+
| Table_A2_11_2021 |
| Table_L7_12_2021 |
| Table_C3_1_2021  |
| Table_D8_10_2021 |
| Table_T0_11_2021 |
| Table_E9_3_2021  |
| Table_L4_2_2021  |
| Table_O1_12_2021 |
| Table_P2_5_2021  |
| Table_Q2_10_2021 |
| Table_A3_12_2021 |
| Table_S5_9_2021  |
| Table_T8_11_2021 |
| Table_Q6_1_2021  |
+------------------+

table name 存储策略是

表_ 西方字母(由识别连接用户、权限等的算法发出)_ 随机数_ 月数_ 当年

我需要在数据库 MySql 上找到第一个 Western alphabet letter 的所有表,而没有 Random_number 以获取此返回

+-----------------+
| listTable       |
+-----------------+
| Table_A_11_2021 |
| Table_L_12_2021 |
| Table_C_1_2021  |
| Table_D_10_2021 |
| Table_T_11_2021 |
| Table_E_3_2021  |
| Table_L_2_2021  |
| Table_O_12_2021 |
| Table_P_5_2021  |
| Table_Q_10_2021 |
| Table_A_12_2021 |
| Table_S_9_2021  |
| Table_T_11_2021 |
| Table_Q_1_2021  |
+-----------------+

我想在下面使用这个存储过程,但如果没有Random number,我就无法先提取Western alphabet letter

CREATE DEFINER=`root`@`%` PROCEDURE `SP_SIX_MONTHS`()
BEGIN

DECLARE tyear INT(4);
DECLARE tmonth INT(2);

SET tyear = YEAR(CURDATE());
SET tmonth = MONTH(DATE_SUB(CURDATE(),INTERVAL 6 MONTH));

SET @s = CONCAT('SELECT 
                 FROM information_schema.TABLES 
                 WHERE table_name LIKE ''table#_',???,'%#_',tmonth,'#_',tyear,''' ESCAPE ''#'';');                       
                                 
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

更新

反馈意见

+------------+
| t          |
+------------+
| Table_A_13 |
| Table_C_12 |
| Table_D_1  |
| Table_E_5  |
| Table_L_12 |
| Table_O_8  |
| Table_P_12 |
| Table_Q_6  |
| Table_S_14 |
| Table_T_4  |
+------------+
10 rows in set (0.12 sec)

【问题讨论】:

我建议你使用REGEXP 而不是LIKE。然后您可以使用更复杂的正则表达式,而不仅仅是 LIKE 的简单模式匹配。 @BillKarwin 感谢您的建议。但是如果我使用 REGEXP 而不是 LIKE 我如何在表名中找到月份和年份? “第一”是什么意思? SQL 表表示无序(多)集。 @EdwardSheriffCurtis 您想删除西方字母后的随机数,或者您想选择所有在该位置没有随机数的表格。 @KaziMohammadAliNur 我需要删除西方字母后的随机数 【参考方案1】:

嗯。 . .我认为这实际上可以满足您的要求:

select min(listtable)
from t
group by substr(listtable, 7, 1);

这将“第一个”解释为“按字母顺序排列的第一个”。

如果你不想要这个数字,你可以删除它:

select min(insert(listtable, 8, 1, ''))
from t
group by substr(listtable, 7, 1);

Here 是一个 dbfiddle。

【讨论】:

谢谢,请在问题中查看您对 UPDATE 的建议的回复 @EdwardSheriffCurtis 。 . .我添加了一个 dbfiddle。这就是我看到的结果集。

以上是关于使用 MySql 8.0.17 上的存储过程在数据库上查找表名的主要内容,如果未能解决你的问题,请参考以下文章

Keepalived+MySQL 8.0.17 实现MySQL双主的高可用

NavicatMySQL 8.0.17 数据库报2059错误

关于pycharm连接8.0.17版本mysql报错

mysql 8.0.17 安装配置方法图文教程

安装mysql 8.0.17并配置远程访问

mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法