使用 MySql 8.0.17 上的存储过程在数据库中查找 table 名称
Find table name on the database using stored procedure on MySql 8.0.17
这是 tables 存储的数据库 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
的所有 table 而没有 Random_number
这个 return
+-----------------+
| 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
更新
return 的建议
+------------+
| 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)
嗯。 . .我认为这实际上可以满足您的需求:
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 是一个 db<>fiddle.
这是 tables 存储的数据库 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
的所有 table 而没有 Random_number
这个 return
+-----------------+
| 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
更新
return 的建议
+------------+
| 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)
嗯。 . .我认为这实际上可以满足您的需求:
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 是一个 db<>fiddle.