メインコンテンツまでスキップ
メインコンテンツまでスキップ

文字列の置換に関する関数

一般的な文字列関数文字列内の検索関数は別々に説明されています。

overlay

文字列 input の一部を別の文字列 replace で置換します。置換は1から始まるインデックス offset から行います。

構文

overlay(s, replace, offset[, length])

パラメータ

  • s: 文字列型 String
  • replace: 文字列型 String
  • offset: 整数型 Int (1から始まる)。もし offset が負の場合、文字列 s の末尾から数えます。
  • length: 任意。整数型 Intlength は、入力文字列 s 内で置換されるスニペットの長さを指定します。length が指定されていない場合、s から削除されるバイト数は replace の長さに等しくなり、それ以外の場合は length バイトが削除されます。

返される値

  • String データ型の値。

SELECT overlay('My father is from Mexico.', 'mother', 4) AS res;

結果:

┌─res──────────────────────┐
│ My mother is from Mexico.│
└──────────────────────────┘
SELECT overlay('My father is from Mexico.', 'dad', 4, 6) AS res;

結果:

┌─res───────────────────┐
│ My dad is from Mexico.│
└───────────────────────┘

overlayUTF8

文字列 input の一部を別の文字列 replace で置換します。置換は1から始まるインデックス offset から行います。

文字列が有効なUTF-8エンコードされたテキストであると仮定します。この仮定が破られた場合、例外はスローされず、結果は未定義です。

構文

overlayUTF8(s, replace, offset[, length])

パラメータ

  • s: 文字列型 String
  • replace: 文字列型 String
  • offset: 整数型 Int (1から始まる)。もし offset が負の場合、入力文字列 s の末尾から数えます。
  • length: 任意。整数型 Intlength は、入力文字列 s 内で置換されるスニペットの長さを指定します。length が指定されていない場合、s から削除される文字数は replace の長さに等しくなり、それ以外の場合は length 文字が削除されます。

返される値

  • String データ型の値。

SELECT overlay('Mein Vater ist aus Österreich.', 'der Türkei', 20) AS res;

結果:

┌─res───────────────────────────┐
│ Mein Vater ist aus der Türkei.│
└───────────────────────────────┘

replaceOne

文字列 haystack の中の部分文字列 pattern の最初の出現を replacement 文字列で置き換えます。

構文

replaceOne(haystack, pattern, replacement)

replaceAll

文字列 haystack の中の部分文字列 pattern のすべての出現を replacement 文字列で置き換えます。

構文

replaceAll(haystack, pattern, replacement)

エイリアス: replace

replaceRegexpOne

正規表現 pattern に一致する部分文字列の最初の出現を replacement 文字列で置き換えます(re2構文に従う)。

replacement には \0-\9 の置換が含まれます。 置換 \1-\9 は1番目から9番目のキャプチャグループ(サブマッチ)に対応し、置換 \0 は全体の一致に対応します。

pattern または replacement 文字列内でそのままの \ 文字を使用するには、エスケープする必要があります。 また、文字列リテラルでは追加のエスケープが必要であることに注意してください。

構文

replaceRegexpOne(haystack, pattern, replacement)

ISO日付をアメリカ形式に変換:

SELECT DISTINCT
    EventDate,
    replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res
FROM test.hits
LIMIT 7
FORMAT TabSeparated

結果:

2014-03-17      03/17/2014
2014-03-18      03/18/2014
2014-03-19      03/19/2014
2014-03-20      03/20/2014
2014-03-21      03/21/2014
2014-03-22      03/22/2014
2014-03-23      03/23/2014

文字列を10回コピー:

SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res

結果:

┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

replaceRegexpAll

replaceRegexpOne と同様ですが、パターンのすべての出現を置き換えます。

エイリアス: REGEXP_REPLACE

SELECT replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res

結果:

┌─res────────────────────────┐
│ HHeelllloo,,  WWoorrlldd!! │
└────────────────────────────┘

例外として、正規表現が空の部分文字列に作用した場合、置換は一度だけ行われます。例:

SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res

結果:

┌─res─────────────────┐
│ here: Hello, World! │
└─────────────────────┘

regexpQuoteMeta

正規表現で特別な意味を持つこれらの文字の前にバックスラッシュを追加します: \0, \\, |, (, ), ^, $, ., [, ], ?, *, +, {, :, -

この実装は re2::RE2::QuoteMeta とは若干異なります。ゼロバイトを \0 としてエスケープし、必要な文字のみをエスケープします。 詳細については、RE2を参照してください。

構文

regexpQuoteMeta(s)

format

pattern 文字列を、引数にリストされている値(文字列、整数など)でフォーマットします。Pythonでのフォーマットに似ています。パターン文字列には、中括弧 {} に囲まれた置換フィールドを含めることができます。中括弧に含まれていないものはリテラルテキストと見なされ、そのまま出力にコピーされます。リテラルの中括弧文字は、二重中括弧でエスケープできます: {{ '{{' }} および {{ '}}' }}。フィールド名は数字(ゼロから始まる)または空であり(その場合、省略されると単調に増加する数字が与えられます)。

構文

format(pattern, s0, s1, ...)

SELECT format('{1} {0} {1}', 'World', 'Hello')
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello                       │
└─────────────────────────────────────────┘

暗黙の数字の場合:

SELECT format('{} {}', 'Hello', 'World')
┌─format('{} {}', 'Hello', 'World')─┐
│ Hello World                       │
└───────────────────────────────────┘

translate

文字列 s 内の文字を、文字列 fromto で定義された1対1の文字マッピングを使用して置き換えます。 fromto は定数ASCII文字列でなければなりません。 fromto のサイズが等しい場合、s 内の first の1番目の文字の各出現は to の1番目の文字に置き換えられ、s 内の first の2番目の文字は to の2番目の文字に置き換えられます。 fromto よりも多くの文字が含まれている場合、to に対応する文字がない from の末尾の文字のすべての出現が s から削除されます。 s 内の非ASCII文字はこの関数で変更されません。

構文

translate(s, from, to)

SELECT translate('Hello, World!', 'delor', 'DELOR') AS res

結果:

┌─res───────────┐
│ HELLO, WORLD! │
└───────────────┘

fromto の引数の長さが異なる場合:

SELECT translate('clickhouse', 'clickhouse', 'CLICK') AS res

結果:

┌─res───┐
│ CLICK │
└───────┘

translateUTF8

translate と同様ですが、sfrom および to はUTF-8エンコードされた文字列であると仮定します。

構文

translateUTF8(s, from, to)

パラメータ

返される値

  • String データ型の値。

クエリ:

SELECT translateUTF8('Münchener Straße', 'üß', 'us') AS res;
┌─res──────────────┐
│ Munchener Strase │
└──────────────────┘

printf

printf 関数は、C++のprintf関数に似た形で、引数にリストされている値(文字列、整数、浮動小数点数など)で指定された文字列をフォーマットします。フォーマット文字列は % 文字で始まるフォーマット指定子を含むことができます。 % とその後のフォーマット指定子に含まれないものはリテラルテキストと見なされ、そのまま出力にコピーされます。リテラルの % 文字は %% でエスケープできます。

構文

printf(format, arg1, arg2, ...)

クエリ:

SELECT printf('%%%s %s %d', 'Hello', 'World', 2024);
┌─printf('%%%s %s %d', 'Hello', 'World', 2024)─┐
│ %Hello World 2024                            │
└──────────────────────────────────────────────┘