メインコンテンツまでスキップ
に最終更新

COUNT_SUBSTRINGS

説明​

COUNT_SUBSTRINGS 関数は、文字列内に指定した部分文字列が現れる回数を数えます。注意: 現在の実装では、一致が見つかると部分文字列の長さだけ位置を進めてから検索を続けます。たとえば、str='ccc' かつ pattern='cc' の場合、返される結果は 1 です。

構文​

COUNT_SUBSTRINGS(<str>, <pattern>[, <start_pos>])

パラメータ​

パラメータ説明
<str>検索対象の文字列。型: STRING
<pattern>一致を調べる部分文字列。型: STRING
<start_pos>検索を開始する位置(1 始まり)。型: INT。省略可能

戻り値​

文字列内に部分文字列が現れる回数を表す INT 型の値を返します。

特殊なケース:

  • str が NULL の場合、NULL を返します
  • pattern が空文字列の場合、0 を返します
  • str が空文字列の場合、0 を返します
  • start_pos が 0 以下、または文字列の長さを超える場合、0 を返します
  • pattern が str より長い場合(または start_pos から始まる str の残りの部分より長い場合)、0 を返します
動作の変更(4.1.4)

4.1.4 では、文字列の末尾で範囲外まで一致と判定される問題が修正されました。残りの文字数が完全な pattern を含むには足りない場合でも、以前のバージョンでは出現回数を一回分多く数えることがありました。たとえば、count_substrings('ab', 'abc') は以前のバージョンでは 1 を返すことがありましたが、修正後は正しく 0 を返します。count_substrings('ccc', 'cc', 3) も修正後は 0 を返します。

使用例​

  1. 基本的な使い方
SELECT count_substrings('a1b1c1d', '1');
+----------------------------------+
| count_substrings('a1b1c1d', '1') |
+----------------------------------+
| 3 |
+----------------------------------+
  1. カンマが連続する場合
SELECT count_substrings(',,a,b,c,', ',');
+-----------------------------------+
| count_substrings(',,a,b,c,', ',') |
+-----------------------------------+
| 5 |
+-----------------------------------+
  1. 部分文字列が重なり合う場合
SELECT count_substrings('ccc', 'cc');
+--------------------------------+
| count_substrings('ccc', 'cc') |
+--------------------------------+
| 1 |
+--------------------------------+
  1. NULL 値の扱い
SELECT count_substrings(NULL, ',');
+-----------------------------+
| count_substrings(NULL, ',') |
+-----------------------------+
| NULL |
+-----------------------------+
  1. 空文字列の扱い
SELECT count_substrings('a,b,c,abcde', '');
+-------------------------------------+
| count_substrings('a,b,c,abcde', '') |
+-------------------------------------+
| 0 |
+-------------------------------------+
  1. 開始位置パラメータを使用する場合
SELECT count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 1), 
count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 6);
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 1) | count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 6) |
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| 2 | 1 |
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
  1. 開始位置が範囲外の場合
SELECT count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 0), 
count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 30);
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 0) | count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 30) |
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| 0 | 0 |
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
  1. マルチバイトの中国語部分文字列と開始位置を使用する場合
SELECT count_substrings('你好,世界!你好,世界!', '世界', 0), 
count_substrings('你好,世界!你好,世界!', '世界', 30);
+-----------------------------------------------------------------------+------------------------------------------------------------------------+
| count_substrings('你好,世界!你好,世界!', '世界', 0) | count_substrings('你好,世界!你好,世界!', '世界', 30) |
+-----------------------------------------------------------------------+------------------------------------------------------------------------+
| 0 | 0 |
+-----------------------------------------------------------------------+------------------------------------------------------------------------+