2017-01-16 21 views
0

さてさて、私はこのように設定した文字列を持つ列を持っている...Mysqlは文字列の最初と最後の部分を削除します。

string/1984-Michael-Jackson-133298 
string/1984-Steve-Van-Bure-392289 

私は、この文字列から名前を取得しようとしています。この問題は、「Steve Van Bure」のような3つのセクションの名前があることが示されています。私はSUBSTRING_INDEXを使用して真ん中の2つの単語を取得する方法を知っていますが、3つの単語を含める方法を確認する方法がわかりません。したがって、最初のオプションと最後のオプションを取り出すことが最善の選択肢です真ん中には名前があります。

Mysql関数でこれを行う方法についての手掛かりはありますか?ありがとう

+0

これは役立つかもしれない:http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql –

+0

後に第一のダッシュとすべてにすべてを削除します最後のダッシュ..ダッシュの数に関係なく残っているものは何ですか? (これは最初のセットを仮定し、最後のセットは複数のダッシュを持つことはできません) – xQbert

+0

それは問題です。どのように最初のダッシュまでのすべてを取り除きますか、最後のダッシュの後のすべてを取り除きますか? –

答えて

0

strが列の名前で、tablenameがテーブルの名前である場合、次のコードを使用できます。

MySQLは非常に限られてい

SELECT SUBSTRING(str,LOCATE("/",str)+1,LOCATE("-",str)-LOCATE("/",str)-1) AS year, 
SUBSTRING(str,LOCATE("-",str)+1, LENGTH(str) - LOCATE("-",REVERSE(str)) - LOCATE("-",str)) AS name, 
SUBSTRING(str,LENGTH(str) - LOCATE("-",REVERSE(str)) + 2) as number 
FROM tablename; 

説明:あなたが唯一の文字列の名前部分を引き出すために探している場合は、単にSELECT句ラベル(便利)名前の一部を使用あなたの標準的な汎用プログラミング言語と比較して組み込みの文字列操作関数のセットですが、それはたいていの場合、良いテーブル構造がそのような関数の必要性を否定するためです。

とにかく、あなたが探しているものを達成するためのさまざまな方法があります。 1つの方法は、SUBSTRING関数をLOCATE関数、REVERSE、およびLENGTH関数と組み合わせて使用​​することです。最後の " - "の位置を取得するには、REVERSELENGTHを使用します。

文字列の最初の部分(年)を取得するのは比較的簡単です。SUBSTRING関数を使用します。この関数は、列名、開始位置、および長さをパラメータとして使用します。開始位置は、実際には "/"(LOCATE("-",str)+1)を必要としないので、最初の "/"の位置に1を加えたものです。長さは、最初の "/"から最初の " - "までの距離またはSQL LOCATE("-",str)-LOCATE("/",str)-1の距離です。

ここで、後で文字列(名前)の2番目の部分に戻ってみましょう。文字列(数字)の3番目の部分については、と共に使用されるREVERSE関数に魔法があります。最終的に最後の " - "の位置を見つけて、最後の " - "から部分文字列を文字列の最後まで取得したいとします。残念ながら、MySQLには文字の最後の出現を返す関数はありません。最後の " - "の位置を取得するためのトリックは、逆の文字列内の " - "の位置を取得し、文字列の長さからその位置を引くことです。 SQLでは、それはLENGTH(str) - LOCATE("-",REVERSE(str)) + 2です。

ここでは、その中間部分(名前)を取得するために必要な情報があります。 SUBSTRING関数を再び使用して、列名、最初の " - "の位置と最後の " - "までの長さを渡します。以上です!

1

は、文字列の末尾に-最初の(非包括的)と最後-(非包括的)からのすべての文字までのすべての文字を削除するにはSUBSTRING_INDEXREPLACETRIM の組み合わせを使用してください。そこから残りの文字列の先頭と末尾に残りの-の両方を削除してください。

SELECT TRIM(BOTH '-' FROM REPLACE(REPLACE([YOUR FIELD], SUBSTRING_INDEX([YOUR FIELD], '-', 1), ''), SUBSTRING_INDEX([YOUR FIELD], '-', -1), '')) FROM [your table] 
+0

ニースワン - http://rextester.com/BLDRT53161 –

関連する問題