Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用字符串作为逗号分隔的查询_Mysql_Stored Procedures_Cursor - Fatal编程技术网

Mysql 使用字符串作为逗号分隔的查询

Mysql 使用字符串作为逗号分隔的查询,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,我试图在存储过程中使用逗号分隔的字符串作为查询的一部分,但无法使其工作。我希望字符串为: 'db1','db2','db3' 这是一个过程示例(为了便于阅读,我省略了很多代码): 我试过了: set ignore_db=concat('\'',replace(ignore_db,',','\',\''),'\''); 但它只是将结果('db1'、'db2'、'db3')看作一个字符串。我需要它将字符串视为多个数据库 有什么想法吗?您不需要在列表中添加引号。只要使用这个函数 以下是以这种方式使用

我试图在存储过程中使用逗号分隔的字符串作为查询的一部分,但无法使其工作。我希望字符串为:

'db1'
'db2'
'db3'

这是一个过程示例(为了便于阅读,我省略了很多代码):

我试过了:

set ignore_db=concat('\'',replace(ignore_db,',','\',\''),'\'');
但它只是将结果
('db1'、'db2'、'db3')
看作一个字符串。我需要它将字符串视为多个数据库


有什么想法吗?您不需要在列表中添加引号。只要使用这个函数

以下是以这种方式使用LOCATE函数的原始示例:

mysql> select LOCATE(',db1,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db1,',',db1,db2,db3,') |
+---------------------------------+
|                               1 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db2,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db2,',',db1,db2,db3,') |
+---------------------------------+
|                               5 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db3,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db3,',',db1,db2,db3,') |
+---------------------------------+
|                               9 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db4,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db4,',',db1,db2,db3,') |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql>
顺便说一句,我用额外的逗号包围ignore_db的原因与数据库名称本身有关


如果有带有公用前缀的数据库,则可能会出现您不希望出现的重复数据库。对于exmaple,如果ignore_db是db1、db2,而数据库是db1、db11、db2、db22、db111,那么所有5个数据库都将显示为结果。因此,我在WHERE子句中为ignore_db和schema_name添加了额外的逗号,很抱歉,但我想澄清一下:您打算使用一些参数来设置要查询的数据库列表,对吗?是的,这是正确的。select into ignore_db的结果将是一个类似“db1”、“db2”、“db3”等的字符串。我需要MySQL按字面意思处理该字符串。啊,当然。这真的很简单。我从盒子里看问题。非常感谢你!
CREATE PROCEDURE test(taskId int)
begin

declare done int default false;
declare ignore_db varchar(1024);

declare cur1 cursor for select schema_name from information_schema.schemata where schema_name not in (ignore_db);
declare continue handler for not found set done = true;

select value into ignore_db from dbw_parameters where upper(name)=upper('ignore db') and task_id = taskID;

select schema_name from information_schema.schemata
where LOCATE(CONCAT(',',schema_name,','),CONCAT(',',ignore_db,',')) > 0;

end;
mysql> select LOCATE(',db1,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db1,',',db1,db2,db3,') |
+---------------------------------+
|                               1 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db2,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db2,',',db1,db2,db3,') |
+---------------------------------+
|                               5 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db3,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db3,',',db1,db2,db3,') |
+---------------------------------+
|                               9 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db4,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db4,',',db1,db2,db3,') |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql>