Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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
从存储过程varcharmysql中提取字符串_Mysql_Sql_Split_Procedure_Cut - Fatal编程技术网

从存储过程varcharmysql中提取字符串

从存储过程varcharmysql中提取字符串,mysql,sql,split,procedure,cut,Mysql,Sql,Split,Procedure,Cut,目前,我正在寻找一个解决方案来“剪切一个字符串”的varchar 我有一个游标,它运行在从SQL语句获得的所有行中。 在每一行中都包含一个“#”,这一行我想剪切并插入到另一个表中 但是我怎样才能删掉“#”和后面的字符呢? 我曾考虑过拆分,但在MySQL中找不到解决方案 我希望你能帮助我假设你有一个像first#second-third这样的字符串,你可以使用MySQL的字符串函数来提取second: SUBSTRING(SUBSTRING(col, INSTR(col, '#') + 1),

目前,我正在寻找一个解决方案来“剪切一个字符串”的varchar

我有一个游标,它运行在从SQL语句获得的所有行中。 在每一行中都包含一个“#”,这一行我想剪切并插入到另一个表中

但是我怎样才能删掉“#”和后面的字符呢?
我曾考虑过拆分,但在MySQL中找不到解决方案


我希望你能帮助我

假设你有一个像
first#second-third
这样的字符串,你可以使用MySQL的字符串函数来提取
second

SUBSTRING(SUBSTRING(col, INSTR(col, '#') + 1),
          1,
          INSTR(SUBSTRING(col, INSTR(col, '#') + 1), ' ') - 1)

这假设只有一个散列符号(
#
),并且要提取的字符串末尾的delimeter是一个空格。

下面是一个函数示例

delimiter //
CREATE DEFINER=`root`@`localhost` FUNCTION `cut`(`instring` varchar(255))
    RETURNS varchar(255) CHARSET latin1
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
begin
declare   tempstring varchar(100);
declare   outstring  varchar(100);
declare  checkit int;
declare  firsthashpos int; 
declare  tempid int;

set tempstring = ltrim(rtrim(instring));
set checkit = 0;


if instr(tempstring,'#') then set firsthashpos = instr(tempstring,'#'); end if; 

looper: while   tempstring is not null and instr(tempstring,'#') > 0 do

        set outstring = reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#')));
        set tempstring = replace(tempstring,reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#'))),'');

        insert into b (address) values (outstring);

end while; 

return concat(tempstring);
end//
delimiter ;
鉴于此

select * from a;
+------+---------------------+
| id   | address             |
+------+---------------------+
|    1 | 13 #ont 12#45 st    |
|    2 | 13 #ont 12345 st    |
|    3 | 13 #ont 12#45 45678 |
|    4 | 56789 #ont 12#45 st |
+------+---------------------+
结果来自

select id,address,cut(address)
from    a
where instr(address,'#') > 0;
结果是b

select * from b;
+----+---------------+
| id | address       |
+----+---------------+
|  1 | #45 st        |
|  2 | #ont 12       |
|  3 | #ont 12345 st |
|  4 | #45 45678     |
|  5 | #ont 12       |
|  6 | #45 st        |
|  7 | #ont 12       |
+----+---------------+

函数(outstring)的返回值包含删除#后的位后剩下的内容。希望函数中的字符串操作是自解释的

您可以使用字符串函数,但是逻辑会有点复杂。谢谢您的回复,但是当一行中有更多的hashtag时?我该如何处理这个问题?你能描述一下逻辑吗?你会如何确定哪个标签是你想要的吗?我想说,如果它看起来太复杂,你最好把数据读入你的应用层,然后在那里提取出来。不,我不想要“那个”,因为这个varchar中有更多的hashtag,我想删掉所有内容。在这之后,我将把它们添加到一个新表中。您打算怎么做?一条记录可能有3个hashtag,另一条记录可能只有一个。每个标签都会有一个单独的记录吗?或者,每个标签有一列吗?MySQL并不是用于此IMO的最佳工具。我考虑了一个带有varchar参数的函数或过程。此函数应拆分整个varchar,然后将行(来自拆分的数组)添加到一个数组中并返回此行。希望你明白我的意思?哈哈,谢谢,但我决定用php来做这件事:)