web-dev-qa-db-ja.com

MySQLの指定された部分文字列の最後のインデックス

次のようにINSTR()関数を使用して、MySQLで特定の部分文字列が最初に現れるインデックスを見つけることができます。

_SELECT instr('Have_a_good_day', '_') AS index_position
_

指定された部分文字列の最初の出現である_5_、この場合はアンダースコア___が表示されます。

StringクラスのJava lastIndexOf(String str) メソッドのように、特定の文字(またはサブストリング)の最後の出現を取得する必要がありますが、 MySQLに組み込み関数が見つかりません。

MySQLでこれを実現するための組み込み機能はありますか?

58
Tiny

@Marc Bは近かった。 MySQLでは、次のステートメントは12を返します。

SELECT CHAR_LENGTH("Have_a_good_day") - LOCATE('_', REVERSE("Have_a_good_day"))+1;

値の使用の可能性を予測して、次のステートメントは、最後のアンダースコア(つまり、_)の前の文字列の左部分を抽出します。

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last")));

結果は「first_middle」です。区切り文字を含める場合は、次を使用します。

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last"))+1);

LOCATEを拡張して、右から検索を開始するオプションがあればいいと思います。

最後のスペースの後に文字列の正しい部分が必要な場合、より良い解決策は次のとおりです。

SELECT SUBSTRING_INDEX("first_middle_last", '_', -1);

これは「last」を返します。

121
curt

REVERSEのオーバーヘッドが必要ない場合は、次を使用します。

LEFT
(
   'Have_a_good_day', 
   LENGTH('Have_a_good_day') - LENGTH(SUBSTRING_INDEX('Have_a_good_day','_',-1))-1
)
19
N D

この方法でsubstring_indexを使用できると思います:

select substring_index(string, delimiter,-1)

-1は、文字列の最後から始まります。

7
rizalp1

私はこれを行うための素晴らしいトリックとしてこれを見つけました:

SELECT LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1 AS indexpos;

これは、最後に出現したインデックス(= 12)を返します。基本的に、最後の区切り文字の後の文字列の右部分を検索し、文字列全体でこの部分文字列の位置を検索します。これにより、位置が取得されます:)

この左側のサブストリングを取得したい場合は、次を使用できます。

SELECT
  SUBSTRING('Have_a_good_day', 1, 
     LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1) 
  AS sub;
3
Asped

Reverse/indexofのコンボ?

SELECT LENGTH(string) - SUBSTRING_INDEX(REVERSE(string), delimiter) + 1

Have_a_good_day

REVERSE('Have_a_good_day') -> yad_doog_a_evaH
SUBSTRING_INDEX('yad_doog_a_evah', '_') -> 4
LENGTH('Have_a_good_day') -> 15
15 - 4 + 1 -> 12

Have_a_good_day
123456789012345
           ^
2
Marc B

上記のコードは単一の文字に対しては正常に機能しますが、サブコードの最後の出現を見つけるためにそれらを使用したときに失敗しました。したがって、このタスクには以下のコードをお勧めします。

SELECT LENGTH("my father is my father")
        - LOCATE('father', REVERSE("my father is my father"))-(LENGTH('father')-1)

これは17を返すはずです

0
Adewole Kayode