从存储过程varcharmysql中提取字符串
目前,我正在寻找一个解决方案来“剪切一个字符串”的varchar 我有一个游标,它运行在从SQL语句获得的所有行中。 在每一行中都包含一个“#”,这一行我想剪切并插入到另一个表中 但是我怎样才能删掉“#”和后面的字符呢?从存储过程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),
我曾考虑过拆分,但在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来做这件事:)