2016-07-22 53 views
1

目前我正在尋找一種解決方法來「切出一個varchar的字符串」。從varchar中挑選一個字符串MySQL,存儲過程

我有一個遊標,它貫穿我從SQL語句中獲得的所有行。 在每一行中都包含一個'#',這個我想切出並插入到另一個表中。

但是我怎樣才能把'#'和後面的字符切掉?
我想過分裂,但沒有找到解決方案如何在MySQL中做到這一點。

我希望你能幫助我

+0

你可以使用字符串函數,但邏輯會有點複雜。 –

回答

1

假設你有一個字符串像first #second third,你可以使用MySQL的字符串函數提取second

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

這是假設只有一個井號(# ),並且要提取的字符串結尾的分隔符是空格。

+0

感謝您的回覆,但是當一行中有更多標籤時?我該如何處理? –

+0

你甚至可以描述你將如何確定_which_ hashtag是你想要的邏輯嗎?我會說,如果它看起來太複雜,你可能會更好地將數據讀入你的應用層並在那裏提取它。 –

+0

不,我不想要「一個」,當有更多的hashtags在這個varchar我想全部切出。在此之後,我會將它們添加到新表格中。 –

0

這裏是和示例功能來在B做

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; 

結果

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被移除後的位後留下的內容。希望函數中的字符串操作是不言自明的。

+0

哈哈謝謝,但我決定在php中做這個東西:) –