【问题标题】:Picking out a string from varchar MySQL, Stored Procedure从 varchar MySQL,存储过程中挑选出一个字符串
【发布时间】:2016-07-22 09:43:09
【问题描述】:

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

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

但是我怎样才能把“#”和后面的字符删掉呢?
我考虑过拆分,但没有找到如何在 MySQL 中执行此操作的解决方案。

希望你能帮到我

【问题讨论】:

  • 你可以使用字符串函数,但逻辑会有些复杂。

标签: mysql sql split procedure cut


【解决方案1】:

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

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

这假定只有一个井号 (#),并且您要提取的字符串末尾的分隔符是一个空格。

【讨论】:

  • 感谢您的回复,但是当一行中有更多主题标签时?我该如何处理?
  • 您能否描述一下您将如何确定 which 主题标签是您想要的标签的逻辑?我会说,如果它看起来太复杂,您最好将数据读入您的应用层并在那里提取。
  • 不,当这个 varchar 中有更多主题标签时,我不想要“那个”,我想全部删掉。在此之后,我会将它们添加到一个新表中。
  • 你打算怎么做?一条记录可能有 3 个标签,另一条只有一个。每个主题标签会被赋予单独的记录吗?或者,您会为每个主题标签设置一列吗? MySQL 并不是这个 IMO 使用的最佳工具。
  • 我想到了一个带有 varchar 参数的函数或过程。此函数应拆分整个 varchar,然后将行(来自拆分的数组)添加到数组中并返回这一行。希望你明白我的意思?
【解决方案2】:

这是执行此操作的函数的示例

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) 的返回值包含删除#s 之后的位后剩下的内容。希望函数中的字符串操作是不言自明的。

【讨论】:

  • 哈哈谢谢,但我决定在 php 中做这些事情 :)
猜你喜欢
  • 2014-10-20
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2017-04-23
  • 2014-07-02
  • 2014-03-07
相关资源
最近更新 更多