メインコンテンツへスキップ
メインコンテンツへスキップ

文字列検索用の関数

このセクションのすべての関数は、デフォルトでは大文字・小文字を区別して検索します。大文字・小文字を区別しない検索は、通常は別の関数バリアントとして提供されています。

注記

大文字・小文字を区別しない検索は、英語の小文字・大文字の規則に従います。例えば、英語における小文字 i の大文字は I ですが、トルコ語では İ になります。そのため、英語以外の言語では予期しない結果になる可能性があります。

このセクションの関数は、検索対象の文字列(このセクションでは haystack と呼びます)と検索文字列(このセクションでは needle と呼びます)が、単一バイト文字エンコーディングされたテキストであることを前提としています。この前提が満たされない場合でも、例外はスローされず、結果は未定義です。UTF-8 エンコードされた文字列に対する検索は、通常は別の関数バリアントとして提供されています。同様に、UTF-8 対応の関数バリアントを使用していても、入力文字列が UTF-8 エンコードされたテキストでない場合、例外はスローされず、結果は未定義です。自動的な Unicode 正規化は行われない点に注意してください。ただし、そのためには normalizeUTF8*() 関数を使用できます。

一般的な文字列関数および文字列置換用の関数については別途説明しています。

注記

以下のドキュメントは、system.functions システムテーブルから生成されています。

countMatches

導入バージョン: v21.1

文字列内で正規表現にマッチした回数を返します。

バージョン依存の挙動

この関数の挙動は ClickHouse のバージョンに依存します。

  • v25.6 未満のバージョンでは、パターンが空文字列にもマッチしうる場合でも、最初の空マッチでカウントを停止します。
  • v25.6 以上のバージョンでは、空マッチが発生しても処理を継続します。従来の挙動は、設定 count_matches_stop_at_empty_match = true を使用して復元できます。

構文

countMatches(haystack, pattern)

引数

  • haystack — 検索対象の文字列。String
  • pattern — 正規表現パターン。String

返り値

見つかった一致の数を返します。UInt64

数字列のカウント

SELECT countMatches('hello 123 world 456 test', '[0-9]+')
┌─countMatches('hello 123 world 456 test', '[0-9]+')─┐
│                                                   2 │
└─────────────────────────────────────────────────────┘

countMatchesCaseInsensitive

導入バージョン: v21.1

countMatches と同様ですが、大文字と小文字を区別せずにマッチングを行います。

構文

countMatchesCaseInsensitive(haystack, pattern)

引数

  • haystack — 検索対象の文字列。String
  • pattern — 正規表現パターン。const String

戻り値

マッチした件数を返します。UInt64

大文字・小文字を区別しないカウント

SELECT countMatchesCaseInsensitive('Hello HELLO world', 'hello')
┌─countMatchesCaseInsensitive('Hello HELLO world', 'hello')─┐
│                                                         2 │
└───────────────────────────────────────────────────────────┘

countSubstrings

導入バージョン: v21.1

部分文字列 needle が文字列 haystack 内に出現する回数を返します。

構文

countSubstrings(haystack, needle[, start_pos])

引数

  • haystack — 検索を行う対象の文字列。String または Enum。 - needle — 検索する部分文字列。String。 - start_pos — 検索を開始する haystack 内の位置 (1 始まり)。UInt。省略可能。

返される値

出現回数。UInt64

使用例

SELECT countSubstrings('aaaa', 'aa');
┌─countSubstrings('aaaa', 'aa')─┐
│                             2 │
└───────────────────────────────┘

start_pos 引数あり

SELECT countSubstrings('abc___abc', 'abc', 4);
┌─countSubstrings('abc___abc', 'abc', 4)─┐
│                                      1 │
└────────────────────────────────────────┘

countSubstringsCaseInsensitive

導入バージョン: v21.1

countSubstrings と同様ですが、大文字と小文字を区別せずにカウントします。

構文

countSubstringsCaseInsensitive(haystack, needle[, start_pos])

引数

  • haystack — 検索を実行する文字列。String または Enum
  • needle — 検索する部分文字列。String
  • start_pos — 省略可能。検索を開始する haystack 内の位置(1始まり)。UInt*

戻り値

haystack 内に出現する needle の回数を返します。UInt64

使用例

SELECT countSubstringsCaseInsensitive('AAAA', 'aa');
┌─countSubstri⋯AAA', 'aa')─┐
│                        2 │
└──────────────────────────┘

start_pos 引数を指定した場合

SELECT countSubstringsCaseInsensitive('abc___ABC___abc', 'abc', 4);
┌─countSubstri⋯, 'abc', 4)─┐
│                        2 │
└──────────────────────────┘

countSubstringsCaseInsensitiveUTF8

導入バージョン: v21.1

countSubstrings と同様ですが、大文字小文字を区別せずにカウントし、haystack が UTF-8 文字列であることを前提とします。

構文

countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos])

引数

  • haystack — 検索対象の UTF-8 文字列。String または Enum
  • needle — 検索する部分文字列。String
  • start_pos — 省略可能。検索を開始する haystack 内の位置(1 始まり)。UInt*

戻り値

haystack 内に出現する needle の回数を返します。UInt64

使用例

SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА');
┌─countSubstri⋯шка', 'КА')─┐
│                        4 │
└──────────────────────────┘

start_pos 引数を指定した場合

SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА', 13);
┌─countSubstri⋯, 'КА', 13)─┐
│                        2 │
└──────────────────────────┘

extract

導入バージョン: v1.1

文字列内で、正規表現に最初にマッチした部分を抽出します。 haystackpattern にマッチしない場合、空文字列が返されます。

この関数は RE2 正規表現ライブラリを使用します。サポートされている構文については re2 を参照してください。

正規表現にキャプチャグループ(サブパターン)が含まれている場合、この関数は入力文字列から、最初のキャプチャグループに対応する部分文字列を抽出します。

構文

extract(haystack, pattern)

引数

  • haystack — 抽出対象の文字列。String
  • pattern — 正規表現。通常はキャプチャグループを含みます。const String

戻り値

抽出された部分を文字列として返します。型は String です。

使用例

メールアドレスからドメインを抽出する

SELECT extract('[email protected]', '.*@(.*)$')
┌─extract('[email protected]', '.*@(.*)$')─┐
│ clickhouse.com                            │
└───────────────────────────────────────────┘

一致しない場合は空文字列を返します

SELECT extract('[email protected]', 'no_match')
┌─extract('[email protected]', 'no_match')─┐
│                                            │
└────────────────────────────────────────────┘

extractAll

導入: v1.1

extract と同様ですが、文字列内で正規表現に一致したすべての結果を配列として返します。 'haystack' が 'pattern' の正規表現に一致しない場合、空の配列が返されます。

正規表現にキャプチャグループ(サブパターン)が含まれている場合、この関数は最初のキャプチャグループに対して入力文字列を照合します。

構文

extractAll(haystack, pattern)

引数

  • haystack — フラグメント(部分文字列)を抽出する対象の文字列。String
  • pattern — 任意でキャプチャグループを含む正規表現。const String

戻り値

抽出されたフラグメントの配列を返します。Array(String)

すべての数値を抽出

SELECT extractAll('hello 123 world 456', '[0-9]+')
┌─extractAll('hello 123 world 456', '[0-9]+')─┐
│ ['123','456']                               │
└─────────────────────────────────────────────┘

キャプチャグループを使って抽出する

SELECT extractAll('[email protected], [email protected]', '([a-zA-Z0-9]+)@')
┌─extractAll('[email protected], [email protected]', '([a-zA-Z0-9]+)@')─┐
│ ['test','user']                                                    │
└────────────────────────────────────────────────────────────────────┘

extractAllGroupsHorizontal

導入バージョン: v20.5

指定された正規表現を使用して文字列中のすべてのグループに対してマッチングを行い、配列の配列を返します。各配列には、同じキャプチャグループからのすべてのキャプチャがグループ番号ごとにまとめて格納されます。

構文

extractAllGroupsHorizontal(s, regexp)

引数

返り値

配列の配列を返します。各内側の配列には、すべての一致にわたって 1 つのキャプチャグループから得られたすべてのキャプチャが含まれます。最初の内側の配列にはグループ 1 からのすべてのキャプチャ、2 番目にはグループ 2 からのすべてのキャプチャ、というように続きます。一致が見つからない場合は空配列を返します。Array(Array(String))

使用例

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroupsHorizontal(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','Date','Content-Type','Connection'],['nginx','Tue, 22 Jan 2019 00:26:14 GMT','text/html; charset=UTF-8','keep-alive']]

extractGroups

導入: v20.5

正規表現にマッチする、非重複の部分文字列からすべてのグループを抽出します。

構文

extractAllGroups(s, regexp)

引数

返される値

関数が 1 つ以上の一致するグループを見つけた場合、グループ ID(1 から N、ここで N は regexp 内のキャプチャグループ数)ごとにまとめられた Array(Array(String)) 列を返します。一致するグループがない場合は空配列を返します。Array(Array(String))

使用例

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroups(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','nginx'],['Date','Tue, 22 Jan 2019 00:26:14 GMT'],['Content-Type','text/html; charset=UTF-8'],['Connection','keep-alive']]

hasAllTokens

導入バージョン: v25.10

hasAnyTokens と同様ですが、needle 文字列または配列内のすべてのトークンが input 文字列にマッチする場合は 1 を返し、それ以外の場合は 0 を返します。input がカラムの場合、この条件を満たすすべての行を返します。

注記

最適なパフォーマンスのため、カラム input には text index が定義されている必要があります。 text index が定義されていない場合、この関数はカラム全体の総当たりスキャンを実行し、インデックス検索と比較して桁違いに遅くなります。

検索を行う前に、この関数は次をトークン化します。

  • input 引数(常に)
  • needle 引数(String として指定された場合)。この場合、text index に対して指定された tokenizer を使用します。 カラムに text index が定義されていない場合は、代わりに splitByNonAlpha tokenizer が使用されます。 needle 引数が Array(String) 型の場合、配列の各要素はトークンとして扱われ、追加のトークン化は行われません。

重複するトークンは無視されます。 たとえば、needles = ['ClickHouse', 'ClickHouse'] は ['ClickHouse'] と同じように扱われます。

構文

hasAllTokens(input, needles)

エイリアス: hasAllToken

引数

返される値

すべてのトークンが一致した場合は 1 を返し、それ以外の場合は 0 を返します。UInt8

文字列カラムに対する使用例

CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAllTokens(msg, 'a\\d()');
┌─count()─┐
│       1 │
└─────────┘

配列内で、トークナイズせずにそのまま (AS-IS) 検索するニードルを指定します

SELECT count() FROM table WHERE hasAllTokens(msg, ['a', 'd']);
┌─count()─┐
│       1 │
└─────────┘

tokens 関数を使用してニードルを生成する

SELECT count() FROM table WHERE hasAllTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
┌─count()─┐
│       1 │
└─────────┘

Array 列および Map 列の使用例

CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});

配列列の例

SELECT count() FROM log WHERE hasAllTokens(tags, 'clickhouse');
┌─count()─┐
│       1 │
└─────────┘

mapKeys の使用例

SELECT count() FROM log WHERE hasAllTokens(mapKeys(attributes), ['address', 'log_level']);
┌─count()─┐
│       1 │
└─────────┘

mapValues の例

SELECT count() FROM log WHERE hasAllTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
┌─count()─┐
│       0 │
└─────────┘

hasAnyTokens

導入バージョン: v25.10

needle 文字列または配列内のトークンのうち少なくとも 1 つが input 文字列に一致する場合は 1 を返し、それ以外の場合は 0 を返します。input がカラムの場合、この条件を満たすすべての行を返します。

注記

最適なパフォーマンスを得るためには、カラム inputtext index が定義されている必要があります。 text index が定義されていない場合、この関数はインデックス検索よりも桁違いに遅い総当たりのカラムスキャンを実行します。

検索を行う前に、この関数は次の対象をトークン化します。

  • input 引数(常に)
  • needle 引数(String として与えられた場合)

これらは text index に指定された tokenizer を使用してトークン化されます。 カラムに text index が定義されていない場合は、代わりに splitByNonAlpha tokenizer が使用されます。 needle 引数が Array(String) 型である場合、配列要素それぞれがトークンとして扱われ、追加のトークン化は行われません。

重複するトークンは無視されます。 例えば、['ClickHouse', 'ClickHouse'] は ['ClickHouse'] と同じものとして扱われます。

構文

hasAnyTokens(input, needles)

エイリアス: hasAnyToken

引数

戻り値

少なくとも 1 件一致があれば 1 を返し、それ以外の場合は 0 を返します。UInt8

文字列列での使用例

CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAnyTokens(msg, 'a\\d()');
┌─count()─┐
│       3 │
└─────────┘

トークン化せず AS-IS で検索する文字列を配列として指定します

SELECT count() FROM table WHERE hasAnyTokens(msg, ['a', 'd']);
┌─count()─┐
│       3 │
└─────────┘

tokens 関数を使って needle を生成する

SELECT count() FROM table WHERE hasAnyTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
┌─count()─┐
│       3 │
└─────────┘

Array 型および Map 型列の使用例

CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});

配列カラムの例

SELECT count() FROM log WHERE hasAnyTokens(tags, 'clickhouse');
┌─count()─┐
│       1 │
└─────────┘

mapKeys の例

SELECT count() FROM log WHERE hasAnyTokens(mapKeys(attributes), ['address', 'log_level']);
┌─count()─┐
│       2 │
└─────────┘

mapValues の例

SELECT count() FROM log WHERE hasAnyTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
┌─count()─┐
│       2 │
└─────────┘

hasSubsequence

導入バージョン: v23.7

文字列 haystack の中に、文字列 needle が部分列として含まれているかどうかを判定します。 文字列の部分列とは、残りの文字の順序を変えずに、ある文字列からいくつか、または 1 つも文字を削除せずに得られる文字列のことです。

構文

hasSubsequence(haystack, needle)

引数

  • haystack — 部分列を検索する対象となる文字列。String
  • needle — 検索する部分列。String

戻り値

needlehaystack の部分列であれば 1、それ以外の場合は 0 を返します。UInt8

使用例

基本的な部分列チェック

SELECT hasSubsequence('Hello World', 'HlWrd')
┌─hasSubsequence('Hello World', 'HlWrd')─┐
│                                      1 │
└────────────────────────────────────────┘

該当する部分列は見つかりません

SELECT hasSubsequence('Hello World', 'xyz')
┌─hasSubsequence('Hello World', 'xyz')─┐
│                                    0 │
└──────────────────────────────────────┘

hasSubsequenceCaseInsensitive

導入バージョン: v23.7

hasSubsequence と同様ですが、大文字と小文字を区別せずに検索します。

構文

hasSubsequenceCaseInsensitive(haystack, needle)

引数

  • haystack — 検索が実行される文字列。String
  • needle — 検索対象となる部分列。String

返される値

needlehaystack の部分列であれば 1、そうでなければ 0 を返します。UInt8

使用例

SELECT hasSubsequenceCaseInsensitive('garbage', 'ARG');
┌─hasSubsequenceCaseInsensitive('garbage', 'ARG')─┐
│                                               1 │
└─────────────────────────────────────────────────┘

hasSubsequenceCaseInsensitiveUTF8

導入バージョン: v23.7

hasSubsequenceUTF8 と同様ですが、大文字と小文字を区別せずに検索します。

構文

hasSubsequenceCaseInsensitiveUTF8(haystack, needle)

引数

  • haystack — 検索を行う UTF-8 エンコードされた文字列。String
  • needle — 検索対象となる UTF-8 エンコードされた部分文字列。String

戻り値

needlehaystack の部分文字列であれば 1、そうでなければ 0 を返します。UInt8

使用例

SELECT hasSubsequenceCaseInsensitiveUTF8('ClickHouse - столбцовая система управления базами данных', 'СИСТЕМА');
┌─hasSubsequen⋯ 'СИСТЕМА')─┐
│                        1 │
└──────────────────────────┘

hasSubsequenceUTF8

導入バージョン: v23.7

hasSubsequence と同様ですが、haystackneedle が UTF-8 でエンコードされた文字列であると仮定します。

構文

hasSubsequenceUTF8(haystack, needle)

引数

  • haystack — 検索対象の文字列。String
  • needle — 検索する部分列。String

戻り値

needlehaystack の部分列であれば 1 を返し、それ以外は 0 を返します。UInt8

使用例

SELECT hasSubsequenceUTF8('картошка', 'кошка');
┌─hasSubsequen⋯', 'кошка')─┐
│                        1 │
└──────────────────────────┘

一致しない部分列

SELECT hasSubsequenceUTF8('картошка', 'апельсин');
┌─hasSubsequen⋯'апельсин')─┐
│                        0 │
└──────────────────────────┘

hasToken

導入バージョン: v20.1

指定されたトークンが対象文字列内に存在するかを判定します。

トークンは、連続する文字 [0-9A-Za-z_](数字、ASCII 英字、およびアンダースコア)からなる、可能な限り最長の部分列として定義されます。

構文

hasToken(haystack, token)

引数

  • haystack — 検索対象の文字列。String
  • token — 検索するトークン。const String

戻り値

トークンが見つかった場合は 1、見つからない場合は 0 を返します。UInt8

トークン検索

SELECT hasToken('clickhouse test', 'test')
┌─hasToken('clickhouse test', 'test')─┐
│                                   1 │
└─────────────────────────────────────┘

hasTokenCaseInsensitive

導入バージョン: v

tokenbf_v1 インデックスを使用して、haystack 内で needle を大文字・小文字を区別せずに検索します。

構文

引数

  • なし。

戻り値

hasTokenCaseInsensitiveOrNull

導入バージョン: v

tokenbf_v1 インデックスを使用して、haystack 内の needle を大文字小文字を区別せずに検索します。needle が不正な形式の場合は null を返します。

構文

引数

  • なし。

戻り値

hasTokenOrNull

導入バージョン: v20.1

hasToken と同様ですが、トークンが不正な形式の場合は null を返します。

構文

hasTokenOrNull(haystack, token)

引数

  • haystack — 検索対象となる文字列。定数である必要があります。String
  • token — 検索するトークン。定数文字列です。const String

戻り値

トークンが見つかった場合は 1、見つからない場合は 0 を返し、トークンが不正な形式の場合は null を返します。Nullable(UInt8)

使用例

SELECT hasTokenOrNull('apple banana cherry', 'ban ana');
┌─hasTokenOrNu⋯ 'ban ana')─┐
│                     ᴺᵁᴸᴸ │
└──────────────────────────┘

ilike

導入バージョン: v20.6

like と同様ですが、大文字と小文字を区別せずに検索します。

構文

ilike(haystack, pattern)
-- haystack ILIKE pattern

引数

  • haystack — 検索対象の文字列。String または FixedString
  • pattern — 照合に使用する LIKE パターン。String

返される値

文字列が LIKE パターンにマッチした場合は 1(大文字小文字は区別しない)、それ以外の場合は 0 を返します。UInt8

使用例

SELECT ilike('ClickHouse', '%house%');
┌─ilike('ClickHouse', '%house%')─┐
│                              1 │
└────────────────────────────────┘

like

導入バージョン: v1.1

文字列 haystackLIKEpattern にマッチするかどうかを返します。

LIKE 式には通常の文字と、次のメタ文字を含めることができます。

  • % は任意の長さの任意の文字列(長さ 0 も含む)を表します。
  • _ は任意の 1 文字を表します。
  • \ はリテラルの %_\ をエスケープするために使用します。

マッチングは UTF-8 に基づいて行われます。たとえば _ は、UTF-8 では 2 バイトで表現される Unicode コードポイント ¥ にマッチします。

haystack または LIKE 式が不正な UTF-8 の場合、その動作は未定義です。

Unicode の正規化は自動では行われません。必要に応じて normalizeUTF8* 関数を使用してください。

リテラルの %_\LIKE のメタ文字)にマッチさせるには、先頭にバックスラッシュを付けて \%\_\\ のように記述します。 バックスラッシュが %_\ 以外の文字の前に付いている場合、その特別な意味は失われ(すなわちリテラルとして解釈され)ます。

注記

ClickHouse では、文字列内のバックスラッシュもクォートする必要があるため、実際には \\%\\_\\\\ と書く必要があります。

%needle% という形式の LIKE 式に対しては、この関数は position 関数と同等の速度です。 それ以外の LIKE 式は内部的に正規表現に変換され、関数 match と同程度の性能で実行されます。

構文

like(haystack, pattern)
-- haystack LIKE pattern

引数

  • haystack — 検索対象の文字列。String または FixedString
  • pattern — 照合に使用する LIKE パターン。%(任意の長さの文字列に一致)、_(任意の1文字に一致)、およびエスケープ用の \ を含めることができます。String

戻り値

文字列が LIKE パターンに一致する場合は 1 を返し、それ以外の場合は 0 を返します。UInt8

使用例

SELECT like('ClickHouse', '%House');
┌─like('ClickHouse', '%House')─┐
│                            1 │
└──────────────────────────────┘

1文字ワイルドカード

SELECT like('ClickHouse', 'Click_ouse');
┌─like('ClickH⋯lick_ouse')─┐
│                        1 │
└──────────────────────────┘

マッチしないパターン

SELECT like('ClickHouse', '%SQL%');
┌─like('ClickHouse', '%SQL%')─┐
│                           0 │
└─────────────────────────────┘

locate

導入バージョン: v18.16

position と同様ですが、引数 haystackneedle の順序が逆になっています。

バージョンによる動作の違い

この関数の動作は ClickHouse のバージョンに依存します:

  • v24.3 未満のバージョンでは、locate は関数 position のエイリアスであり、引数 (haystack, needle[, start_pos]) を受け取っていました。
  • v24.3 以上のバージョンでは、locate は個別の関数(MySQL との互換性向上のため)となり、引数 (needle, haystack[, start_pos]) を受け取ります。
    以前の動作は、設定 function_locate_has_mysql_compatible_argument_order = false を使用することで復元できます。

構文

locate(needle, haystack[, start_pos])

引数

  • needle — 検索する部分文字列。String
  • haystack — 検索を実行する文字列。String または Enum
  • start_pos — 省略可能。検索を開始する haystack 内の位置(1 始まり)。UInt

戻り値

部分文字列が見つかった場合は、先頭位置(バイト単位、1 起算)を返し、見つからなかった場合は 0 を返します。UInt64

基本的な使用方法

SELECT locate('ca', 'abcabc')
┌─locate('ca', 'abcabc')─┐
│                      3 │
└────────────────────────┘

match

導入バージョン: v1.1

指定された文字列が、指定された正規表現パターンにマッチするかを確認します。

この関数は RE2 正規表現ライブラリを使用します。サポートされている構文については re2 を参照してください。

マッチングは UTF-8 を前提として動作します。例えば、¥ は内部的には 2 バイトで表現されますが、マッチング時には 1 つのコードポイントとして扱われます。 正規表現には NULL バイトを含めてはいけません。 haystack またはパターンが無効な UTF-8 の場合、その動作は未定義です。

re2 のデフォルト動作と異なり、. は改行にもマッチします。これを無効にするには、パターンの先頭に (?-s) を付けてください。

パターンは両端で自動的にアンカーされます(パターンが '^' で始まり '$' で終わるかのように扱われます)。

部分文字列のみを検索したい場合は、代わりに関数 like または position を使用できます。これらはこの関数よりもはるかに高速に動作します。

演算子の別構文: haystack REGEXP pattern

構文

match(haystack, pattern)

別名: REGEXP_MATCHES

引数

  • haystack — パターンを検索する文字列。String
  • pattern — 正規表現パターン。const String

戻り値

パターンが一致した場合は 1、それ以外の場合は 0 を返します。UInt8

使用例

基本的なパターンマッチング

SELECT match('Hello World', 'Hello.*')
┌─match('Hello World', 'Hello.*')─┐
│                               1 │
└─────────────────────────────────┘

パターンが一致しません

SELECT match('Hello World', 'goodbye.*')
┌─match('Hello World', 'goodbye.*')─┐
│                                 0 │
└───────────────────────────────────┘

multiFuzzyMatchAllIndices

導入バージョン: v20.1

multiFuzzyMatchAny と似ていますが、一定の編集距離以内で haystack に一致する、すべてのインデックスを任意の順序で要素とする配列を返します。

構文

multiFuzzyMatchAllIndices(haystack, distance, [pattern1, pattern2, ..., patternN])

引数

  • haystack — 検索を実行する対象の文字列。String
  • distance — ファジーマッチにおける最大編集距離。UInt8
  • pattern — 照合対象となるパターンの配列。Array(String)

戻り値

指定した編集距離以内で haystack にマッチする、pattern 配列内のすべてのインデックス(1 から開始)を任意の順序で含む配列を返します。一致が見つからない場合は空配列を返します。Array(UInt64)

使用例

SELECT multiFuzzyMatchAllIndices('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose', 'House']);
┌─multiFuzzyMa⋯, 'House'])─┐
│ [3,1,4,2]                │
└──────────────────────────┘

multiFuzzyMatchAny

導入バージョン: v20.1

multiMatchAny と同様ですが、検索対象文字列に対して、いずれかのパターンが一定の編集距離以内でマッチした場合に 1 を返します。 この関数は hyperscan ライブラリの実験的機能に依存しており、一部の特殊なケースでは低速になる可能性があります。 パフォーマンスは編集距離の値と使用されるパターンに依存しますが、常に非ファジーなバリアントよりもコストが高くなります。

注記

multiFuzzyMatch*() 関数ファミリーは、hyperscan の制約により UTF-8 の正規表現をサポートしません(バイト列として扱います)。

構文

multiFuzzyMatchAny(haystack, distance, [pattern1, pattern2, ..., patternN])

引数

  • haystack — 検索対象の文字列。String
  • distance — あいまい一致における最大編集距離。UInt8
  • pattern — オプション。照合対象となるパターンの配列。Array(String)

返される値

指定された編集距離以内で、いずれかのパターンが haystack にマッチした場合は 1 を、それ以外の場合は 0 を返します。UInt8

使用例

SELECT multiFuzzyMatchAny('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose']);
┌─multiFuzzyMa⋯lickHose'])─┐
│                        1 │
└──────────────────────────┘

multiFuzzyMatchAnyIndex

導入バージョン: v20.1

multiFuzzyMatchAny と同様ですが、一定の編集距離以内で検索対象にマッチするインデックスのいずれかを返します。

構文

multiFuzzyMatchAnyIndex(haystack, distance, [pattern1, pattern2, ..., patternn])

引数

  • haystack — 検索対象の文字列。String
  • distance — あいまい一致における最大編集距離。UInt8
  • pattern — 照合対象となるパターンの配列。Array(String)

返り値

指定した編集距離以内で haystack に一致するパターンのいずれかについて、そのインデックス(1 から始まる)を返し、一致しない場合は 0 を返します。UInt64

使用例

SELECT multiFuzzyMatchAnyIndex('ClickHouse', 2, ['ClckHouse', 'ClickHose', 'ClickHouse']);
┌─multiFuzzyMa⋯ickHouse'])─┐
│                        2 │
└──────────────────────────┘

multiMatchAllIndices

導入バージョン: v20.1

multiMatchAny と同様ですが、順不同で haystack にマッチするすべてのインデックスを配列で返します。

構文

multiMatchAllIndices(haystack, [pattern1, pattern2, ..., patternn])

引数

  • haystack — 検索対象の文字列。String
  • pattern — マッチに使用する正規表現。String

返される値

haystack にマッチしたすべてのインデックス(1 から始まる)の配列。順不同。一致が見つからない場合は空配列を返す。Array(UInt64)

使用例

SELECT multiMatchAllIndices('ClickHouse', ['[0-9]', 'House', 'Click', 'ouse']);
┌─multiMatchAl⋯', 'ouse'])─┐
│ [3, 2, 4]                │
└──────────────────────────┘

multiMatchAny

導入バージョン: v20.1

複数の正規表現パターンのうち少なくとも1つが対象文字列にマッチするかを判定します。

文字列内で複数の部分文字列を検索したいだけであれば、代わりに関数 multiSearchAny を使用できます。本関数よりもはるかに高速に動作します。

構文

multiMatchAny(haystack, pattern1[, pattern2, ...])

引数

  • haystack — パターンを検索する対象の文字列。String
  • pattern1[, pattern2, ...] — 1 つ以上の正規表現パターンからなる配列。Array(String)

戻り値

いずれかのパターンにマッチした場合は 1、それ以外の場合は 0 を返します。UInt8

複数パターンでのマッチング

SELECT multiMatchAny('Hello World', ['Hello.*', 'foo.*'])
┌─multiMatchAny('Hello World', ['Hello.*', 'foo.*'])─┐
│                                                  1 │
└────────────────────────────────────────────────────┘

一致するパターンがありません

SELECT multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])
┌─multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])─┐
│                                                    0 │
└──────────────────────────────────────────────────────┘

multiMatchAnyIndex

導入バージョン: v20.1

multiMatchAny と同様ですが、検索対象(haystack)内でマッチした位置のいずれかのインデックスを返します。

構文

multiMatchAnyIndex(haystack, [pattern1, pattern2, ..., patternn])

引数

  • haystack — 検索を行う対象の文字列。String
  • pattern — マッチさせる正規表現パターン。Array(String)

戻り値

最初にマッチしたパターンのインデックス(1 から始まる)を返し、マッチが見つからない場合は 0 を返します。UInt64

使用例

SELECT multiMatchAnyIndex('ClickHouse', ['[0-9]', 'House', 'Click']);
┌─multiMatchAn⋯, 'Click'])─┐
│                        3 │
└──────────────────────────┘

multiSearchAllPositions

導入バージョン: v20.1

position と似ていますが、haystack 文字列内の複数の needle 部分文字列に対する位置(バイト単位、1 起算)の配列を返します。

すべての multiSearch*() 関数は、最大 2^8 個の needle までしかサポートしません。

構文

multiSearchAllPositions(haystack, needle1[, needle2, ...])

引数

  • haystack — 検索を実行する文字列。String
  • needle1[, needle2, ...] — 検索対象となる 1 個以上の部分文字列からなる配列。Array(String)

返される値

各部分文字列について、見つかった場合は 1 から数えたバイト単位での開始位置、見つからなかった場合は 0 を要素とする配列を返します。Array(UInt64)

複数 needle の検索

SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])
┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐
│ [0,13,0]                                                          │
└───────────────────────────────────────────────────────────────────┘

multiSearchAllPositionsCaseInsensitive

導入バージョン: v20.1

multiSearchAllPositions と同様ですが、大文字小文字を区別しません。

構文

multiSearchAllPositionsCaseInsensitive(haystack, needle1[, needle2, ...])

引数

  • haystack — 検索対象の文字列。String
  • needle1[, needle2, ...] — 検索する 1 つ以上の部分文字列からなる配列。Array(String)

返り値

見つかった各部分文字列について、1 から数えたバイト単位の開始位置を要素とする配列を返します。部分文字列が見つからなかった場合、その要素として 0 を返します。Array(UInt64)

大文字小文字を区別しない複数文字列検索

SELECT multiSearchAllPositionsCaseInsensitive('ClickHouse',['c','h'])
┌─multiSearchA⋯['c', 'h'])─┐
│ [1,6]                    │
└──────────────────────────┘

multiSearchAllPositionsCaseInsensitiveUTF8

導入バージョン: v20.1

multiSearchAllPositionsUTF8 と同様ですが、大文字と小文字を区別しません。

構文

multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を実行する UTF-8 でエンコードされた文字列。String
  • needle — 検索対象となる UTF-8 でエンコードされた部分文字列の配列。Array(String)

返される値

見つかった部分文字列それぞれについて、バイト単位(1 からカウント)での開始位置を要素とする配列。部分文字列が見つからなかった場合は 0 を返します。Array

大文字小文字を区別しない UTF-8 検索

SELECT multiSearchAllPositionsCaseInsensitiveUTF8('Здравствуй, мир!', ['здравствуй', 'МИР']);
┌─multiSearchA⋯й', 'МИР'])─┐
│ [1, 13]                  │
└──────────────────────────┘

multiSearchAllPositionsUTF8

導入バージョン: v20.1

multiSearchAllPositions と同様ですが、haystack および needle の部分文字列が UTF-8 でエンコードされた文字列であることを前提とします。

構文

multiSearchAllPositionsUTF8(haystack, needle1[, needle2, ...])

引数

  • haystack — 検索を行う UTF-8 でエンコードされた文字列。String
  • needle1[, needle2, ...] — 検索対象となる UTF-8 でエンコードされた部分文字列の配列。Array(String)

返される値

部分文字列が見つかった場合は 1 から数えたバイト単位での開始位置を、見つからなかった場合は 0 を要素とする配列を返します。Array

UTF-8 マルチ検索

SELECT multiSearchAllPositionsUTF8('ClickHouse',['C','H'])
┌─multiSearchAllPositionsUTF8('ClickHouse', ['C', 'H'])─┐
│ [1,6]                                                 │
└───────────────────────────────────────────────────────┘

multiSearchAny

導入バージョン: v20.1

複数のニードル文字列のうち少なくとも 1 つが、ヘイスタック文字列にマッチするかどうかをチェックします。

関数 multiSearchAnyCaseInsensitivemultiSearchAnyUTF8multiSearchAnyCaseInsensitiveUTF8 は、この関数の大文字小文字を区別しない、または UTF-8 対応のバリエーションを提供します。

構文

multiSearchAny(haystack, needle1[, needle2, ...])

引数

  • haystack — 検索を行う文字列。String
  • needle1[, needle2, ...] — 検索対象とする部分文字列の配列。Array(String)

返り値

1 つ以上の一致があれば 1 を返し、一致が 1 つもなければ 0 を返します。UInt8

いずれかへのマッチ検索

SELECT multiSearchAny('ClickHouse',['C','H'])
┌─multiSearchAny('ClickHouse', ['C', 'H'])─┐
│                                        1 │
└──────────────────────────────────────────┘

multiSearchAnyCaseInsensitive

導入バージョン: v20.1

multiSearchAny と同様ですが、大文字と小文字は区別しません。

構文

multiSearchAnyCaseInsensitive(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を実行する文字列。String
  • needle — 検索対象の部分文字列の配列。Array(String)

戻り値

少なくとも 1 件の大文字小文字を区別しない一致があれば 1 を返し、なければ 0 を返します。UInt8

使用例

大文字小文字を区別しない検索

SELECT multiSearchAnyCaseInsensitive('ClickHouse',['c','h'])
┌─multiSearchAnyCaseInsensitive('ClickHouse', ['c', 'h'])─┐
│                                                       1 │
└─────────────────────────────────────────────────────────┘

multiSearchAnyCaseInsensitiveUTF8

導入バージョン: v20.1

multiSearchAnyUTF8 と同様ですが、大文字と小文字を区別しません。

構文

multiSearchAnyCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を実行する UTF-8 文字列。String
  • needle — 検索対象の UTF-8 部分文字列。Array(String)

戻り値

少なくとも 1 件の大文字小文字を区別しない一致があれば 1 を返し、1 件も一致がなければ 0 を返します。UInt8

UTF-8 文字列 'Здравствуйте' に小文字の文字 'з' が含まれているかを確認します

SELECT multiSearchAnyCaseInsensitiveUTF8('Здравствуйте',['з'])
┌─multiSearchA⋯те', ['з'])─┐
│                        1 │
└──────────────────────────┘

multiSearchAnyUTF8

導入バージョン: v20.1

multiSearchAny と同様ですが、haystack および needle の部分文字列が UTF-8 でエンコードされた文字列であると見なします。

構文

multiSearchAnyUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を実行する UTF-8 文字列。String
  • needle — 検索対象となる UTF-8 部分文字列。Array(String)

返される値

少なくとも 1 件の一致があれば 1 を返し、一致が 1 件もなければ 0 を返します。UInt8

UTF-8 文字列 '你好,世界'('Hello, world')が与えられたとき、その文字列内に 你 または 界 の文字が存在するかどうかを確認します

SELECT multiSearchAnyUTF8('你好,世界', ['你', '界'])
┌─multiSearchA⋯你', '界'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstIndex

導入バージョン: v20.1

大文字小文字を区別して、複数の needle 文字列を haystack 文字列内で検索し、最初に見つかった needle の 1 から始まるインデックスを返します。

構文

multiSearchFirstIndex(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索対象となる文字列。String
  • needles — 検索する文字列の配列。Array(String)

戻り値

haystack 内で最初に見つかった needle の、needles 配列における 1 起算のインデックス(位置)を返します。どの needle も見つからない場合は 0 を返します。検索は大文字・小文字を区別します。UInt64

使用例

SELECT multiSearchFirstIndex('ClickHouse Database', ['Click', 'Database', 'Server']);
┌─multiSearchF⋯ 'Server'])─┐
│                        1 │
└──────────────────────────┘

大文字と小文字を区別する挙動

SELECT multiSearchFirstIndex('ClickHouse Database', ['CLICK', 'Database', 'Server']);
┌─multiSearchF⋯ 'Server'])─┐
│                        2 │
└──────────────────────────┘

一致するものが見つかりません

SELECT multiSearchFirstIndex('Hello World', ['goodbye', 'test']);
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘

multiSearchFirstIndexCaseInsensitive

導入バージョン: v20.1

文字列 haystack 内で最も左(先頭)側で見つかった needle_i のインデックス i(1 起算)を返し、それ以外の場合は 0 を返します。 大文字と小文字を区別しません。

構文

multiSearchFirstIndexCaseInsensitive(haystack, [needle1, needle2, ..., needleN]

引数

  • haystack — 検索対象の文字列。String
  • needle — 検索する部分文字列。Array(String)

戻り値

最も左側で見つかった needle のインデックス(1 起算)を返します。一致がない場合は 0 を返します。UInt8

使用例

SELECT multiSearchFirstIndexCaseInsensitive('hElLo WoRlD', ['World', 'Hello']);
┌─multiSearchF⋯, 'Hello'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstIndexCaseInsensitiveUTF8

導入バージョン: v20.1

UTF-8 エンコーディングをサポートし、大文字・小文字を区別せずに、ある文字列(検索対象)の中から複数の検索文字列を検索し、最初に見つかった検索文字列の 1 始まりのインデックスを返します。

構文

multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索対象の文字列。String
  • needles — 検索する文字列の配列。Array(String)

返される値

haystack 内で最初に見つかった needle の 1 始まりのインデックス値(needles 配列内での位置)を返します。needle が 1 つも見つからない場合は 0 を返します。検索は大文字小文字を区別せず、UTF-8 の文字エンコーディングに対応します。UInt64

使用例

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('ClickHouse Database', ['CLICK', 'data', 'server']);
┌─multiSearchF⋯ 'server'])─┐
│                        1 │
└──────────────────────────┘

UTF-8 における大文字・小文字の扱い

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Привет Мир', ['мир', 'ПРИВЕТ']);
┌─multiSearchF⋯ 'ПРИВЕТ'])─┐
│                        1 │
└──────────────────────────┘

一致するものが見つかりません

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Hello World', ['goodbye', 'test']);
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘

multiSearchFirstIndexUTF8

導入バージョン: v20.1

文字列 haystack 内で最も左側に見つかった needle_i のインデックス i(1 から開始)を返し、該当するものがない場合は 0 を返します。 haystackneedle は UTF-8 でエンコードされた文字列であると仮定します。

構文

multiSearchFirstIndexUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を実行する UTF-8 文字列。String
  • needle — 検索対象となる UTF-8 部分文字列の配列。Array(String)

返り値

最も左側で見つかった needle のインデックス(1 起算)を返します。一致がない場合は 0 を返します。UInt8

使用例

SELECT multiSearchFirstIndexUTF8('Здравствуйте мир', ['мир', 'здравствуйте']);
┌─multiSearchF⋯вствуйте'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstPosition

導入バージョン: v20.1

position と同様ですが、複数の needle 文字列のいずれかに一致する、haystack 文字列内の最も左側の位置(オフセット)を返します。

multiSearchFirstPositionCaseInsensitivemultiSearchFirstPositionUTF8multiSearchFirstPositionCaseInsensitiveUTF8 関数は、この関数の大文字小文字を区別しない/UTF-8 対応のバリアントを提供します。

構文

multiSearchFirstPosition(haystack, needle1[, needle2, ...])

引数

  • haystack — 検索を行う対象の文字列。String
  • needle1[, needle2, ...] — 検索対象とする 1 つ以上の部分文字列を要素とする配列。Array(String)

返される値

haystack 文字列の中で、複数の needle 文字列のいずれかに一致する最も左側のオフセット(位置)を返します。一致がない場合は 0 を返します。UInt64

先頭位置の検索

SELECT multiSearchFirstPosition('Hello World',['llo', 'Wor', 'ld'])
┌─multiSearchFirstPosition('Hello World', ['llo', 'Wor', 'ld'])─┐
│                                                             3 │
└───────────────────────────────────────────────────────────────┘

multiSearchFirstPositionCaseInsensitive

導入バージョン: v20.1

multiSearchFirstPosition と同様ですが、大文字と小文字を区別しません。

構文

multiSearchFirstPositionCaseInsensitive(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を行う文字列。String
  • needle — 検索対象となる部分文字列の配列。Array(String)

戻り値

複数の needle 文字列のいずれかに一致する haystack 文字列内の最も左側の位置(オフセット)を返します。一致がない場合は 0 を返します。UInt64

大文字小文字を区別しない場合の最初の位置

SELECT multiSearchFirstPositionCaseInsensitive('HELLO WORLD',['wor', 'ld', 'ello'])
┌─multiSearchFirstPositionCaseInsensitive('HELLO WORLD', ['wor', 'ld', 'ello'])─┐
│                                                                             2 │
└───────────────────────────────────────────────────────────────────────────────┘

multiSearchFirstPositionCaseInsensitiveUTF8

導入バージョン: v20.1

multiSearchFirstPosition と同様ですが、haystackneedle を UTF-8 文字列として扱い、大文字小文字を区別しません。

構文

multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を行う UTF-8 文字列。String
  • needle — 検索対象となる UTF-8 部分文字列からなる配列。Array(String)

戻り値

haystack 文字列の中で、複数の needle 文字列のいずれかに一致する最も左側のオフセットを、大文字小文字を区別せずに返します。一致がない場合は 0 を返します。UInt64

与えられた needle のいずれかに一致する、UTF-8 文字列 'Здравствуй, мир'('Hello, world')内の最も左側のオフセットを検索

SELECT multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['МИР', 'вст', 'Здра'])
┌─multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['мир', 'вст', 'Здра'])─┐
│                                                                                      3 │
└────────────────────────────────────────────────────────────────────────────────────────┘

multiSearchFirstPositionUTF8

導入バージョン: v20.1

multiSearchFirstPosition と同様ですが、haystackneedle を UTF-8 エンコードされた文字列であると仮定します。

構文

multiSearchFirstPositionUTF8(haystack, [needle1, needle2, ..., needleN])

引数

  • haystack — 検索を行う UTF-8 文字列。String
  • needle — 検索対象となる UTF-8 部分文字列の配列。Array(String)

戻り値

複数の needle のうちいずれかに一致する、haystack 文字列内の最も左にあるオフセット。一致するものがない場合は 0 を返す。UInt64

UTF-8 文字列 'Здравствуй, мир'('Hello, world')内で、与えられた needle のいずれかに一致する最も左にあるオフセットを求める

SELECT multiSearchFirstPositionUTF8('Здравствуй, мир',['мир', 'вст', 'авст'])
┌─multiSearchFirstPositionUTF8('Здравствуй, мир', ['мир', 'вст', 'авст'])─┐
│                                                                       3 │
└─────────────────────────────────────────────────────────────────────────┘

ngramDistance

導入バージョン: v20.1

2つの文字列間の 4-gram 距離を計算します。 このために、2つの 4-gram マルチセット間の対称差を数え、その値をそれぞれの要素数の総和で正規化します。 返される値が小さいほど、文字列同士はより類似しています。

大文字小文字を区別しない検索や UTF-8 形式での検索には、ngramDistanceCaseInsensitivengramDistanceUTF8ngramDistanceCaseInsensitiveUTF8 関数を使用します。

構文

ngramDistance(haystack, needle)

引数

  • haystack — 比較対象となる文字列。String
  • needle — 比較対象となる文字列。String

戻り値

0 から 1 の間の Float32 型の数値を返します。返される値が小さいほど、文字列同士の類似度は高くなります。Float32

4-グラム距離を計算

SELECT ngramDistance('ClickHouse', 'ClickHouses')
┌─ngramDistance('ClickHouse', 'ClickHouses')─┐
│                                        0.1 │
└────────────────────────────────────────────┘

ngramDistanceCaseInsensitive

導入バージョン: v20.1

ngramDistance の大文字小文字を区別しないバージョンを提供します。 2 つの文字列の 4-グラム距離を、大文字小文字を無視して計算します。 返される値が小さいほど、文字列同士の類似度が高くなります。

構文

ngramDistanceCaseInsensitive(haystack, needle)

引数

  • haystack — 1 番目の比較文字列。String
  • needle — 2 番目の比較文字列。String

返される値

0 以上 1 以下の Float32 型の数値を返します。Float32

大文字小文字を区別しない 4-gram 距離

SELECT ngramDistanceCaseInsensitive('ClickHouse','clickhouse')
┌─ngramDistanceCaseInsensitive('ClickHouse','clickhouse')─┐
│                                                       0 │
└─────────────────────────────────────────────────────────┘

ngramDistanceCaseInsensitiveUTF8

導入バージョン: v20.1

ngramDistance の、大文字小文字を区別しない UTF-8 版を提供します。 needlehaystack の文字列が UTF-8 でエンコードされていることを前提とし、大文字小文字を無視します。 2 つの UTF-8 文字列間の 3-gram 距離を、大文字小文字を無視して計算します。 返される値が小さいほど、文字列同士がより類似していることを意味します。

構文

ngramDistanceCaseInsensitiveUTF8(haystack, needle)

引数

  • haystack — 1 番目の UTF-8 エンコードされた比較文字列。String
  • needle — 2 番目の UTF-8 エンコードされた比較文字列。String

返される値

0 から 1 の間の Float32 型の数値を返します。Float32

大文字小文字を区別しない UTF-8 3-グラム距離

SELECT ngramDistanceCaseInsensitiveUTF8('abcde','CDE')
┌─ngramDistanceCaseInsensitiveUTF8('abcde','CDE')─┐
│                                             0.5 │
└─────────────────────────────────────────────────┘

ngramDistanceUTF8

導入バージョン: v20.1

ngramDistance の UTF-8 版を提供します。 needlehaystack の文字列が UTF-8 エンコードされた文字列であると仮定します。 2 つの UTF-8 文字列間の 3-gram 距離を計算します。 返される値が小さいほど、文字列同士はより類似しています。

構文

ngramDistanceUTF8(haystack, needle)

引数

  • haystack — 比較対象となる最初の UTF-8 エンコード済み文字列。String
  • needle — 比較対象となる2番目の UTF-8 エンコード済み文字列。String

返される値

0 から 1 の間の Float32 型の数値を返します。Float32

UTF-8 3-gram 距離

SELECT ngramDistanceUTF8('abcde','cde')
┌─ngramDistanceUTF8('abcde','cde')─┐
│                               0.5 │
└───────────────────────────────────┘

ngramSearch

導入バージョン: v20.1

2 つの文字列間の 4-gram 距離が、指定されたしきい値以下かどうかを判定します。

大文字小文字を区別しない検索や UTF-8 形式の検索には、ngramSearchCaseInsensitivengramSearchUTF8ngramSearchCaseInsensitiveUTF8 関数を使用します。

構文

ngramSearch(haystack, needle)

引数

  • haystack — 比較に用いる文字列。String
  • needle — 比較に用いる文字列。String

返される値

文字列間の 4-gram 距離がしきい値(デフォルトは 1.0)以下の場合は 1、それ以外の場合は 0 を返します。UInt8

4-gram を使用した検索

SELECT ngramSearch('ClickHouse', 'Click')
┌─ngramSearch('ClickHouse', 'Click')─┐
│                                  1 │
└────────────────────────────────────┘

ngramSearchCaseInsensitive

導入バージョン: v20.1

ngramSearch の大文字・小文字を区別しないバージョンを提供します。 ニードル文字列とヘイスタック文字列の非対称な差分を計算します。つまり、ニードルから得られる n-gram の数から共通する n-gram の数を引き、その値をニードルの n-gram 数で正規化したものです。 大文字・小文字を無視して、2 つの文字列の 4-gram 距離が指定されたしきい値以下かどうかをチェックします。

構文

ngramSearchCaseInsensitive(haystack, needle)

引数

  • haystack — 比較対象となる文字列。String
  • needle — 比較対象となる文字列。String

返り値

2つの文字列間の4-グラム距離がしきい値(デフォルトは 1.0)以下の場合は 1 を返し、それ以外の場合は 0 を返します。UInt8

4-グラムを使用した大文字・小文字を区別しない検索

SELECT ngramSearchCaseInsensitive('Hello World','hello')
┌─ngramSearchCaseInsensitive('Hello World','hello')─┐
│                                                  1 │
└────────────────────────────────────────────────────┘

ngramSearchCaseInsensitiveUTF8

導入バージョン: v20.1

ngramSearch の大文字小文字を区別しない UTF-8 版を提供します。 haystackneedle は UTF-8 文字列であると仮定し、大文字小文字を無視します。 2 つの UTF-8 文字列間の 3-グラム距離が、指定されたしきい値以下かどうかを、大文字小文字を無視して判定します。

構文

ngramSearchCaseInsensitiveUTF8(haystack, needle)

引数

  • haystack — 比較に用いる UTF-8 文字列。String
  • needle — 比較に用いる UTF-8 文字列。String

返される値

文字列間の 3-gram 距離がしきい値(デフォルトでは 1.0)以下の場合は 1 を、そうでない場合は 0 を返します。UInt8

3-gram を使用した大文字小文字を区別しない UTF-8 検索

SELECT ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')
┌─ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')─┐
│                                                        1 │
└──────────────────────────────────────────────────────────┘

ngramSearchUTF8

導入バージョン: v20.1

ngramSearch の UTF-8 版を提供します。 haystackneedle が UTF-8 文字列であることを前提とします。 2 つの UTF-8 文字列間の 3-グラム距離が、指定されたしきい値以下かどうかを確認します。

構文

ngramSearchUTF8(haystack, needle)

引数

  • haystack — 比較対象となる UTF-8 文字列。String
  • needle — 比較対象となる UTF-8 文字列。String

戻り値

文字列間の 3-gram 距離がしきい値(デフォルトは 1.0)以下であれば 1、それ以外の場合は 0 を返します。UInt8

3-gram を使用した UTF-8 検索

SELECT ngramSearchUTF8('абвгдеёжз', 'гдеёзд')
┌─ngramSearchUTF8('абвгдеёжз', 'гдеёзд')─┐
│                                      1 │
└────────────────────────────────────────┘

notILike

導入バージョン: v20.6

文字列がパターンに一致しないかどうかを、大文字小文字を区別せずに判定します。パターンには、SQL の LIKE マッチング用の特殊文字 % および _ を含めることができます。

構文

notILike(haystack, pattern)

引数

  • haystack — 検索対象となる入力文字列。String または FixedString
  • pattern — 照合に使用する SQL LIKE パターン。% は任意の長さ(0 文字を含む)の文字列に一致し、_ はちょうど 1 文字に一致する。String

戻り値

文字列がパターンに一致しない場合は 1 を返し(比較は大文字小文字を区別しない)、それ以外の場合は 0 を返す。UInt8

使用例

SELECT notILike('ClickHouse', '%house%');
┌─notILike('Cl⋯ '%house%')─┐
│                        0 │
└──────────────────────────┘

notLike

導入: v1.1

like と似ていますが、結果を否定します。

構文

notLike(haystack, pattern)
-- haystack NOT LIKE pattern

引数

  • haystack — 検索対象の文字列。String または FixedString
  • pattern — 照合する LIKE パターン。String

返り値

文字列が LIKE パターンに一致しない場合は 1、それ以外の場合は 0 を返します。UInt8

使用例

SELECT notLike('ClickHouse', '%House%');
┌─notLike('Cli⋯ '%House%')─┐
│                        0 │
└──────────────────────────┘

非マッチパターン

SELECT notLike('ClickHouse', '%SQL%');
┌─notLike('Cli⋯', '%SQL%')─┐
│                        1 │
└──────────────────────────┘

position

導入: v1.1

部分文字列 needle が文字列 haystack 内に現れる位置(バイト単位、1 始まり)を返します。

部分文字列 needle が空文字列の場合、以下の規則が適用されます:

  • start_pos が指定されていない場合: 1 を返す
  • start_pos = 0 の場合: 1 を返す
  • start_pos >= 1 かつ start_pos <= length(haystack) + 1 の場合: start_pos を返す
  • それ以外の場合: 0 を返す

同じ規則は、関数 locatepositionCaseInsensitivepositionUTF8positionCaseInsensitiveUTF8 にも適用されます。

構文

position(haystack, needle[, start_pos])

引数

  • haystack — 検索を行う文字列。String または Enum
  • needle — 検索対象の部分文字列。String
  • start_pos — 検索を開始する haystack 内の位置 (1 始まり)。省略可能。UInt

戻り値

部分文字列が見つかった場合は、バイト単位で 1 から数えた開始位置を返し、見つからなかった場合は 0 を返します。UInt64

基本的な使用例

SELECT position('Hello, world!', '!')
┌─position('Hello, world!', '!')─┐
│                             13 │
└────────────────────────────────┘

start_pos 引数を指定する場合

SELECT position('Hello, world!', 'o', 1), position('Hello, world!', 'o', 7)
┌─position('Hello, world!', 'o', 1)─┬─position('Hello, world!', 'o', 7)─┐
│                                 5 │                                 9 │
└───────────────────────────────────┴───────────────────────────────────┘

Needle IN haystack 構文

SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s)
┌─equals(6, position(s, '/'))─┐
│                           1 │
└─────────────────────────────┘

空の検索文字列

SELECT position('abc', ''), position('abc', '', 0), position('abc', '', 1), position('abc', '', 2), position('abc', '', 3), position('abc', '', 4), position('abc', '', 5)
┌─position('abc', '')─┬─position('abc', '', 0)─┬─position('abc', '', 1)─┬─position('abc', '', 2)─┬─position('abc', '', 3)─┬─position('abc', '', 4)─┬─position('abc', '', 5)─┐
│                   1 │                      1 │                      1 │                      2 │                      3 │                      4 │                      0 │
└─────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┘

positionCaseInsensitive

導入バージョン: v1.1

position と同様ですが、大文字と小文字を区別しません。

構文

positionCaseInsensitive(haystack, needle[, start_pos])

別名: instr

引数

  • haystack — 検索対象の文字列。String または Enum
  • needle — 検索する部分文字列。String
  • start_pos — 省略可。検索を開始する haystack 内の位置(1始まり)。UInt*

戻り値

部分文字列が見つかった場合は、先頭から 1 始まりでバイト単位の開始位置を返し、見つからなかった場合は 0 を返します。UInt64

大文字小文字を区別しない検索

SELECT positionCaseInsensitive('Hello, world!', 'hello')
┌─positionCaseInsensitive('Hello, world!', 'hello')─┐
│                                                 1 │
└───────────────────────────────────────────────────┘

positionCaseInsensitiveUTF8

導入バージョン: v1.1

positionUTF8 と同様ですが、大文字小文字を区別せずに検索します。

構文

positionCaseInsensitiveUTF8(haystack, needle[, start_pos])

引数

  • haystack — 検索を実行する対象の文字列。String または Enum
  • needle — 検索対象の部分文字列。String
  • start_pos — 省略可。検索を開始する haystack 内の位置(1 始まり)。UInt*

戻り値

部分文字列が見つかった場合は、その開始位置をバイト単位で 1 始まりとして返し、見つからなかった場合は 0 を返します。UInt64

大文字小文字を区別しない UTF-8 検索

SELECT positionCaseInsensitiveUTF8('Привет мир', 'МИР')
┌─positionCaseInsensitiveUTF8('Привет мир', 'МИР')─┐
│                                                8 │
└──────────────────────────────────────────────────┘

positionUTF8

導入バージョン: v1.1

position と同様ですが、haystackneedle が UTF-8 でエンコードされた文字列であると仮定します。

構文

positionUTF8(haystack, needle[, start_pos])

引数

  • haystack — 検索を行う文字列。String または Enum
  • needle — 検索対象の部分文字列。String
  • start_pos — オプション。検索を開始する haystack 内の位置(1 始まり)。UInt*

戻り値

部分文字列が見つかった場合は、その開始位置(バイト単位、1 始まり)を返し、見つからなかった場合は 0 を返します。UInt64

UTF-8 文字数のカウント

SELECT positionUTF8('Motörhead', 'r')
┌─position('Motörhead', 'r')─┐
│                          5 │
└────────────────────────────┘