ClickHouse/docs/ja/sql-reference/functions/splitting-merging-functions.md
2024-11-18 11:58:58 +09:00

14 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/sql-reference/functions/splitting-merging-functions 165 文字列の分割

文字列を分割するための関数

splitByChar

特定の文字で文字列を分割してサブ文字列を生成します。1文字からなる定数文字列 separator を使用します。選択されたサブ文字列の配列を返します。文字列の先頭や末尾に区切り文字がある場合や、連続して区切り文字が存在する場合は、空のサブ文字列も選択されることがあります。

構文

splitByChar(separator, s[, max_substrings]))

引数

  • separator — 1文字からなる区切り文字。String
  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返される配列には最大で max_substrings のサブ文字列が含まれます。そうでない場合、可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

空のサブ文字列が選択される状況:

  • 文字列の先頭または末尾に区切り文字がある場合;
  • 連続して複数の区切り文字がある場合;
  • 元の文字列 s が空である場合。

:::note ClickHouse v22.11 以降、パラメータ max_substrings の動作が変更されました。それ以前のバージョンでは、max_substrings > 0max_substring 回の分割が行われ、文字列の残りはリストの最後の要素として返されていました。 例えば、

  • v22.10 では: SELECT splitByChar('=', 'a=b=c=d', 2);['a','b','c=d'] を返しました
  • v22.11 では: SELECT splitByChar('=', 'a=b=c=d', 2);['a','b'] を返しました

ClickHouseのv22.11以前のような動作を得るには、splitby_max_substrings_includes_remaining_string を設定してください。 SELECT splitByChar('=', 'a=b=c=d', 2) SETTINGS splitby_max_substrings_includes_remaining_string = 1 -- ['a', 'b=c=d'] :::

SELECT splitByChar(',', '1,2,3,abcde');

結果:

┌─splitByChar(',', '1,2,3,abcde')─┐
│ ['1','2','3','abcde']           │
└─────────────────────────────────┘

splitByString

文字列を特定の文字列で分割します。複数文字からなる定数文字列 separator を区切り文字として使用します。文字列 separator が空の場合、文字列 s を単一文字の配列に分割します。

構文

splitByString(separator, s[, max_substrings]))

引数

  • separator — 区切り文字。String
  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返されるサブ文字列は最大で max_substrings になり、それ以外は可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

空のサブ文字列が選択される状況:

  • 非空の区切り文字が文字列の先頭や末尾にある場合;
  • 非空の区切り文字が連続している場合;
  • 元の文字列 s が空で区切り文字が空ではない場合。

:::note splitby_max_substrings_includes_remaining_string を設定すると、max_substrings > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0。 :::

SELECT splitByString(', ', '1, 2 3, 4,5, abcde');

結果:

┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐
│ ['1','2 3','4,5','abcde']                 │
└───────────────────────────────────────────┘
SELECT splitByString('', 'abcde');

結果:

┌─splitByString('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByRegexp

正規表現で指定したパターンを区切りとして文字列を分割します。正規表現文字列 regexp を区切り文字として使用します。regexp が空の場合、文字列 s を1文字ずつの配列に分割します。この正規表現と一致する部分が見つからない場合、文字列 s は分割されません。

構文

splitByRegexp(regexp, s[, max_substrings]))

引数

  • regexp — 正規表現。定数。String または FixedString
  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返されるサブ文字列は最大で max_substrings になります。それ以外は、可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

空のサブ文字列が選択される状況:

  • 非空の正規表現の一致が文字列の先頭または末尾にある場合;
  • 非空の正規表現の一致が連続している場合;
  • 元の文字列 s が空で正規表現が空ではない場合。

:::note splitby_max_substrings_includes_remaining_string を設定すると、max_substrings > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0。 :::

SELECT splitByRegexp('\\d+', 'a12bc23de345f');

結果:

┌─splitByRegexp('\\d+', 'a12bc23de345f')─┐
│ ['a','bc','de','f']                    │
└────────────────────────────────────────┘
SELECT splitByRegexp('', 'abcde');

結果:

┌─splitByRegexp('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByWhitespace

空白文字で文字列を分割します。選択されたサブ文字列の配列を返します。

構文

splitByWhitespace(s[, max_substrings]))

引数

  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返されるサブ文字列は最大で max_substrings になります。それ以外は、可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

:::note splitby_max_substrings_includes_remaining_string を設定すると、max_substrings > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0。 :::

SELECT splitByWhitespace('  1!  a,  b.  ');

結果:

┌─splitByWhitespace('  1!  a,  b.  ')─┐
│ ['1!','a,','b.']                    │
└─────────────────────────────────────┘

splitByNonAlpha

空白または句読点で文字列を分割します。選択されたサブ文字列の配列を返します。

構文

splitByNonAlpha(s[, max_substrings]))

引数

  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返されるサブ文字列は最大で max_substrings になります。それ以外は、可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

:::note splitby_max_substrings_includes_remaining_string を設定すると、max_substrings > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0。 :::

SELECT splitByNonAlpha('  1!  a,  b.  ');

結果:

┌─splitByNonAlpha('  1!  a,  b.  ')─┐
│ ['1','a','b']                     │
└───────────────────────────────────┘

arrayStringConcat

配列内の値を区切り文字で結合して文字列を返します。separator はオプションのパラメータであり、デフォルトでは空文字列として設定されています。

構文

arrayStringConcat(arr\[, separator\])

SELECT arrayStringConcat(['12/05/2021', '12:50:00'], ' ') AS DateString;

結果:

┌─DateString──────────┐
│ 12/05/2021 12:50:00 │
└─────────────────────┘

alphaTokens

a-z および A-Z の範囲の連続したバイト列のサブ文字列を選択します。サブ文字列の配列を返します。

構文

alphaTokens(s[, max_substrings]))

エイリアス: splitByAlpha

引数

  • s — 分割する文字列。String
  • max_substrings — 任意の Int64。デフォルトは0です。max_substrings > 0 の場合、返されるサブ文字列は最大で max_substrings になります。それ以外は、可能な限り多くのサブ文字列が返されます。

返される値

  • 選択されたサブ文字列の配列。Array(String)。

:::note splitby_max_substrings_includes_remaining_string を設定すると、max_substrings > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0。 :::

SELECT alphaTokens('abca1abc');

結果:

┌─alphaTokens('abca1abc')─┐
│ ['abca','abc']          │
└─────────────────────────┘

extractAllGroups

正規表現で一致する非重複サブ文字列からすべてのグループを抽出します。

構文

extractAllGroups(text, regexp)

引数

返される値

  • 少なくとも1つの一致するグループが見つかった場合、Array(Array(String)) をグループID1からN、regexp内のキャプチャグループの数Nでクラスタリングして返します。一致するグループがない場合、空の配列を返します。Array

SELECT extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)');

結果:

┌─extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)')─┐
│ [['abc','123'],['8','"hkl"']]                                         │
└───────────────────────────────────────────────────────────────────────┘

ngrams

UTF-8文字列を ngramsize 記号のn-gramに分割します。

構文

ngrams(string, ngramsize)

引数

返される値

SELECT ngrams('ClickHouse', 3);

結果:

┌─ngrams('ClickHouse', 3)───────────────────────────┐
│ ['Cli','lic','ick','ckH','kHo','Hou','ous','use'] │
└───────────────────────────────────────────────────┘

tokens

ASCIIの非英数字文字をセパレータとして使用して文字列をトークンに分割します。

引数

  • input_stringStringデータ型オブジェクトで表された任意のバイトセット。

返される値

  • 入力文字列からのトークン配列。Array

SELECT tokens('test1,;\\ test2,;\\ test3,;\\   test4') AS tokens;

結果:

┌─tokens────────────────────────────┐
│ ['test1','test2','test3','test4'] │
└───────────────────────────────────┘