2016-07-22 3 views
1

現在、私はvarcharの「文字列を切り取る」ソリューションを探しています。varcharから文字列を選ぶMySQL、ストアドプロシージャ

私はSQLステートメントから得たすべての行を実行するカーソルを持っています。 これらの行のそれぞれに '#'が含まれています。この行を切り取り、別のテーブルに挿入したいのです。

しかし、「#」とそれに続く文字はどのようにカットできますか?
私は分割について考えましたが、MySQLでこれを行う方法は解決されませんでした。

私はあなたが

+0

文字列関数を使用できますが、ロジックはやや複雑です。 –

答えて

1

あなたはfirst #second thirdのような文字列を持っていたと仮定すると、私を助けることができる、あなたはsecondを抽出するために、MySQLの文字列関数を使用することができます願っています:

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

これが唯一のハッシュ記号(#があることを前提としてい)、抽出したい文字列の最後の区切り文字がスペースであることを確認します。

+0

返信いただきありがとうございますが、ハッシュタグが1つの行にある場合は、これをどうすれば処理できますか? –

+0

あなたはあなたが望むものを_which_ hashtagとしてどのように判断するのかという論理を記述することはできますか?複雑すぎると思われる場合は、データをアプリ層に読み込んでそこに抽出する方がよいかもしれません。 –

+0

いいえ、私はこのvarcharにハッシュタグがたくさんある場合、「1つ」を望んでいません。この後、私はそれらを新しいテーブルに追加します。 –

0

はここだと機能の例は、Bに

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

結果からこの

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 | 
+------+---------------------+ 

結果与えられたこの

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 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でこのことをすることにしました:) –

関連する問題