正則関数

適用対象: WatchGuard Advanced EPDR

正則関数は、SQL クエリの各行で個別に動作します。正則関数の場合は、行に適用される関数の結果は他の行に依存しません。

高度な SQL クエリ ツールでは、正則関数には以下の特性があります。

  • 強い型付け — 標準 SQL とは異なり、WatchGuard Endpoint Security では、型間の暗黙的な変換は行われません。各関数は特定の型セットに対して機能します。つまり、場合によっては、型変換関数を使用する必要があるということです。
  • CSE (共通部分式除去) — クエリにおいて、AST (同じレコードまたは同じ構文解析結果) が同じ式はすべて、同一の値を持つものとみなされます。こうした式は連結されて、1 回実行されます。同一のサブクエリもこの方法で削除されます。
  • 結果の型 — すべての関数は、結果として (複数の値やゼロ値ではなく) 単一の値を返します 。結果の型は通常、値ではなく引数の型によってのみ定義されます。
  • 定数 — 簡素化を目的として、一部の関数は一部の引数に対して定数のみで動作します。たとえば、LIKE 演算子の右側の引数は定数でなければなりません。ほぼすべての関数は、定数引数に対して定数を返します。乱数を生成する関数は例外です。now 関数は、異なる時間に実行されるクエリで異なる値を返します。単一のクエリ内でのみ定数が重要となるため、結果は定数とみなされます。定数式も定数とみなされます (たとえば、LIKE 演算子の右半分は複数の定数で構成することができます)。
  • NULL 処理 — 関数の引数の少なくとも 1 つが NULL の場合は、関数で別途指定されている場合を除き、関数の結果も NULL になります。
  • 恒常性 — 関数は引数の値を変更することができません。変更があれば、それが結果として返されます。そのため、個別の関数を計算する場合の結果は、クエリに関数が入力されている順序に依存しません。
  • エラー処理 — 一部の関数では、データが無効な場合に例外が生成される可能性があります。この場合は、クエリはキャンセルされて、クライアントにエラー メッセージが返されます。
  • 引数の評価 — ほぼすべてのプログラミング言語では、&&||?: などの一部の演算子で一部の引数が評価されない場合があります。高度な SQL クエリ ツールでは、関数の引数 (演算子) は常に評価されます。これは、各行が個別に計算されるのではなく、列の全体部分が同時に評価されるためです。

最も重要な関数として、以下が挙げられます。

算術関数

すべての算術関数では、結果の型は、結果が収まる最小の数値型 (そのような型がある場合) として計算されます。最小値は、ビット数、符号の有無、浮動小数点数かどうかに基づいて同時に取得されます。ビットが足りない場合は、最上位ビットが採用されます。

算術関数は、UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32、Float64 の任意の型のペアに対して機能します。

関数 説明

plus(a, b)

a + b operator

2 つの数値の合計を計算します。日付 (Date) または日時 (DateTime) に整数を追加することもできます。日付の場合は、整数を追加すると、それが追加された日数に対応します。日時の場合は、整数を追加すると、それが追加された秒数に対応します。

minus(a, b)

a - b operator

2 つの数値の差を計算します。結果は常に符号付きになります。日付 (Date) または日時 (DateTime) からの整数を計算することもできます。

divide (a, b)

a / b operator

数値の商を計算します。結果の型は常に浮動小数点型になります。これは、整数除算ではありません。整数除算の場合は、intDiv 関数を使用します。ゼロで割ると、inf-infnan のいずれかとなります。

intDiv (a, b)

数値の商を計算します。整数を除算して、切り捨てます (絶対値)。ゼロで割る場合、または最小の負数をマイナス 1 で割る場合は、例外が発生します。

intDivOrZero (a, b)

ゼロで割る場合、または最小の負数をマイナス 1 で割る場合にゼロが返されるため、これは intDiv とは異なります。

module (a, b)

a % b operator

除算後の余りを計算します。引数が浮動小数点数の場合は、整数に事前変換されます。余りは C++ と同じ意味で解釈されます。負数には切り捨て除算が使用されます。ゼロで割る場合、または最小の負数をマイナス 1 で割る場合は、例外が発生します。

negate(a)

-a operator

符号を反転して、数値を計算します。結果は常に符号付きになります。

abs (a)

数値 (a) の絶対値を計算します。つまり、< 0 の場合は -a を返します。符号なし型の場合は何も実行されません。符号付き整数型の場合は、符号なしの数値を返します。

gcd (a, b)

数値の最大公約数を返します。ゼロで割る場合、または最小の負数をマイナス 1 で割る場合は、例外が発生します。

lcm(a, b)

数値の最小公倍数を返します。ゼロで割る場合、または最小の負数をマイナス 1 で割る場合は、例外が発生します。

比較関数

比較関数は常に 0 または 1 (Uint8) を返します。以下の型を比較することができます。

  • 数字
  • 文字列 (String) と固定長文字列 (FixedString(N))
  • 日付 (Date)
  • 日時 (DateTime)

たとえば、日付と文字列を比較することはできません。関数を使用して、文字列を日付に変換する必要があります (その逆も同様です)。

文字列はバイト単位で比較されます。短い文字列 (Shorter String) は、冒頭がその文字列で、かつ含まれている文字が少なくとも 1 つ多いすべての文字列よりも小さくなります。

比較演算子は、以下の通りです。

  • Equalsa = b および a == b
  • NotEqualsa != b および a <> b
  • Lessa < b
  • Greatera > b
  • LessOrEqualsa <= b
  • GreaterOrEqualsa >= b

論理関数

論理関数は任意の数値型を受け入れますが、0 または 1 に等しい UInt8 数値を返します。

引数としてのゼロは「false」、ゼロ以外の値はすべて「true」とみなされます。

  • AND論理積

  • OR論理和

  • Not否定

  • Xor排他的論理和

型変換関数

サポートされている基本的な変換は、以下の通りです。

  • 符号なしデータ型への変換 — toUInt8、toUInt16、toUInt32、toUInt64

  • 符号付きデータ型への変換 — toInt8、toInt16、toInt32、toInt64、toFloat32、toFloat64、toDate、toDateTime

  • エラーの場合はゼロに変換 — toUInt8OrZero、toUInt16OrZero、toUInt32OrZero、toUInt64OrZero、toInt8OrZero、toInt16OrZero、toInt32OrZero、toInt64OrZero、toFloat32OrZero、toFloat64OrZero、toDateOrZero、toDateTimeOrZero

  • エラーの場合は null に変換 — toUInt8OrNull、toUInt16OrNull、toUInt32OrNull、toUInt64OrNull、toInt8OrNull、toInt16OrNull、toInt32OrNull、toInt64OrNull、toFloat32OrNull、toFloat64OrNull、toDateOrNull、toDateTimeOrNull

以下はより複雑なデータ型変換です。

関数 説明

toDecimal32(value, S), toDecimal64(value, S), toDecimal128(value, S)

この関数は、 を精度 S の 10 進数に変換します。 は数値または文字列にすることができます。S パラメータは小数位の数を指定します。

toString

この関数は、数値、文字列 (固定文字列は除く)、日付 (Dates)、日時 (DateTime) を変換します。こうした関数はすべて、1 つの引数を受け入れます。

文字列に変換される場合または文字列から変換される場合は、値がタブ区切り形式 (TSV) と同じルールに従ってフォーマットまたは解析されます。文字列を解析できない場合は、例外が発生し、要求はキャンセルされます。

日付が数値に変換される場合、またはその逆が実行される場合は、日付が Unix 時間の開始 (1970 年 1 月 1 日) からの日数に対応します。

これらは、toDate/toDateTime 関数の日付および日時の形式となります。

年-月-日

年-月-日 時間:分:秒

例外として、UInt32、Int32、UInt64、Int64 のいずれかの数値型から Date に変換され、かつ数値が 65536 以上の場合は、数値は (日数としてではなく) Unix タイムスタンプとして解釈されます。toDate (unix_timestamp) の書き込みがサポートされています。サポートされていない場合は、エラーが発生し、toDate (toDateTime (unix_timestamp)) の書き込みが必要となります。

日付 (Date) と日時 (DateTime) 間の変換は自然に実行されます (つまり、null 時刻が追加されるか、時刻が削除されます)。

数値型間の変換には、C++ での異なる数値型間の割り当てと同じルールが使用されます。

また、DateTime 引数の toString 関数は、タイム ゾーンの名前が含まれている 2 番目の String 引数を取ることができます。

toFixedString(s, N)

この関数は、String 型の引数を FixedString(N) 型 (固定長 N の文字列) に変換します。N は定数でなければなりません。文字列のバイト数が N よりも少ない場合は、右側に null バイトが渡されます。文字列のバイト数が N よりも大きい場合は、例外が発生します。

toStringCutToZero(s)

この関数は、String または FixedString 引数を受け入れます。見つかった最初のゼロ バイトで切り捨てられた内容が含まれている String を返します。

reinterpretAsUInt8, reinterpretAsUInt16, reinterpretAsUInt32, reinterpretAsUInt64

reinterpretAsInt8, reinterpretAsInt16, reinterpretAsInt32, reinterpretAsInt64

reinterpretAsFloat32, reinterpretAsFloat64

reinterpretAsDate, reinterpretAsDateTime

これらの関数は、文字列を受け入れ、文字列の冒頭に配置されているバイトを数値として解釈します (リトル エンディアン)。文字列長が十分でない場合は、文字列に必要な数の null バイトが埋め込まれているかのように関数が動作します。文字列長が必要以上に長い場合は、余分なバイトが無視されます。日付 (Date) は、Unix 時間の開始 (1970 年 1 月 1 日) からの日数として解釈されます。日時 (DateTime) は、Unix 時間の開始からの秒数として解釈されます。

reinterpretAsString

この関数は、数値、日付 (Date)、または 日時 (DateTime) を受け入れ、対応する値をリトル エンディアン形式で表すバイトが含まれている String を返します。末尾の null バイトは削除されます。たとえば、UInt32 型の値 255 は、1 バイト長の String です。

reinterpretAsFixedString

この関数は、数値、日付 (Date)、または 日時 (DateTime) を受け入れ、対応する値をリトル エンディアン形式で表すバイトが含まれている FixedString を返します。末尾の null バイトは削除されます。たとえば、UInt32 型の値 255 は、1 バイト長の FixedString です。

CAST(x, t)

この関数は、xt データ型に変換します。

toIntervalYear, toIntervalQuarter, toIntervalMonth, toIntervalWeek, toIntervalDay, toIntervalHour, toIntervalMinute, toIntervalSecond

この関数は、Number 型の引数を Interval 型 (期間) に変換します。Interval 型のデータを使用して Date または DateTime で直接算術演算を実行できるため、Interval 型は非常に便利です。

parseDateTimeBestEffort

この関数は、Number 型の引数を Date 型または DateTime 型に解析します。toDate や toDateTime とは異なり、parseDateTimeBestEffort はより複雑な日付形式を返すことができます。

parseDateTimeBestEffortOrNull

この関数は、Number 型の引数を Date 型または DateTime 型に解析します。toDate や toDateTime とは異なり、parseDateTimeBestEffort はより複雑な日付形式を返すことができます。また、処理できない日付形式が存在する場合は、null を返します。

parseDateTimeBestEffortOrZero

この関数は、Number 型の引数を Date 型または DateTime 型に解析します。toDate や toDateTime とは異なり、parseDateTimeBestEffort はより複雑な日付形式を返すことができます。また、処理できない日付形式が存在する場合は、ゼロ Date または ゼロ DateTime を返します。

日付と時刻を操作する関数

日付と時刻を操作する関数で、かつタイム ゾーンを論理的に使用する関数はすべて、オプションで 2 番目のタイム ゾーン引数を受け入れることができます。整数時間分だけ UTC と異なるタイム ゾーンのみがサポートされます。

関数 説明

toTimeZone

時刻 (Date) または日時 (DateTime) を、指定されたタイム ゾーンに変換します。

toYear

日付 (Date) または日時 (DateTime) を、年数が含まれている UInt16 数値に変換します。

toQuarter

日付 (Date) または日時 (DateTime) を、四半期が含まれている UInt8 数値に変換します。

toMonth

日付 (Date) または日時 (DateTime) を、月数 (1 〜 12) が含まれている UInt8 数値に変換します。

toDayOfYear

日付 (Date) または日時 (DateTime) を、年間の日数 (1 ~ 366) が含まれている UInt8 数値に変換します。

toDayOfMonth

日付 (Date) または日時 (DateTime) を、月の日数 (1 ~ 31) が含まれている UInt8 数値に変換します。

toDayOfWeek

日付 (Date) または日時 (DateTime) を、曜日の数値 (月曜日は 1、日曜日は 7) が含まれている UInt8 数値に変換します。

toHour

日付 (Date) または日時 (DateTime) を、1 日の時間数 (0 ~ 23) が含まれている UInt8 数値に変換します。この関数は、夏時間に移行する際は午前 2 時に時計が 1 時間進むことを前提としています。標準時間に移行する際は午前 3 時に時計が 1 時間戻ります。

toMinute

日付 (Date) または日時 (DateTime) を、時間の分数 (0 ~ 59) が含まれている UInt8 数値に変換します。

toSecond

日付 (Date) または日時 (DateTime) を、分の秒数 (0 ~ 59) が含まれている UInt8 数値に変換します。うるう秒は考慮されません。

toUnixTimestamp

日付 (Date) または日時 (DateTime) を、Unix タイムスタンプに変換します。

toStartOfYear

日付 (Date) または日時 (DateTime) を、年の最初の日に切り捨てます。日付 (Date) を返します。

toStartOfISOYear

日付 (Date) または日時 (DateTime) を、ISO 年の最初の日に切り捨てます。日付 (Date) を返します。

toStartOfQuarter

日付 (Date) または日時 (DateTime) を、四半期の最初の日 (1 月 1 日、4 月 1 日、7 月 1 日、10 月 1 日 のいずれか) に切り捨てます。日付 (Date) を返します。

toStartOfMonth

日付 (Date) または日時 (DateTime) を、年の最初の日に切り捨てます。日付 (Date) を返します。

toMonday

日付 (Date) または日時 (DateTime) を、最も近い月曜日に切り捨てます。日付 (Date) を返します。

toStartOfDay

日付 (Date) または日時 (DateTime) を、1 日の開始時に切り捨てます。

toStartOfHour

日付 (Date) または日時 (DateTime) を、時間の開始時に切り捨てます。

toStartOfMinute

日付 (Date) または日時 (DateTime) を、分の開始時に切り捨てます。

toStartOfFiveMinute

日付 (Date) または日時 (DateTime) を、5 分間隔の開始時に切り捨てます。

toStartOfTenMinutes

日付 (Date) または日時 (DateTime) を、10 分間隔の開始時に切り捨てます。

toStartOfFifteenMinutes

日付 (Date) または日時 (DateTime) を、15 分間隔の開始時に切り捨てます。

toTime

日付 (Date) または日時 (DateTime) を、特定の固定日に変換し、時間を保持します。

toRelativeYearNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの年数に変換します。

toRelativeQuarterNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの四半期数に変換します。

toRelativeMonthNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの月数に変換します。

toRelativeWeekNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの週数に変換します。

toRelativeDayNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの日数に変換します。

toRelativeHourNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの時間数に変換します。

toRelativeMinuteNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの分数に変換します。

toRelativeSecondNum

日付 (Date) または日時 (DateTime) を、過去のある固定時点からの秒数に変換します。

toISOYear

日付 (Date) または日時 (DateTime) を、ISO 年番号が含まれている UInt16 数値に変換します。

toISOWeek

日付 (Date) または日時 (DateTime) を、ISO 週番号が含まれている UInt8 数値に変換します。

now

0 個の引数を受け入れます。関数実行時の現在の時刻を返します。定数を返します。

today

0 個の引数を受け入れます。関数実行時の現在の日付を返します。toDate (now ()) と同じです。

yesterday

0 個の引数を受け入れます。関数実行時の前日の日付を返します。today () - 1 と同じです。

timeSlot

時間を 30 分に丸めます。

toYYYYMM

日付 (Date) または日時 (DateTime) を、年と月の数値 (年 * 100 + 月) が含まれている UInt32 数値に変換します。

toYYYYMMDD

日付 (Date) または日時 (DateTime) を、年と月の数値 (年 * 10000 + 月 * 100 + 日) が含まれている UInt32 数値に変換します。

toYYYYMMDDhhmmss

日付 (Date) または日時 (DateTime) を、年と月の数値 (年 * 10000000000 + 月 * 100000000 + 日 * 1000000 + 時間 * 10000 + 分 * 100 + 秒) が含まれている UInt64 数値に変換します。

addYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters

この関数は、Date/DateTime 変数に Date/DateTime 間隔を加算し、Date/DateTime を返します。

subtractYears, subtractMonths, subtractWeeks, subtractDays, subtractHours, subtractMinutes, subtractSeconds, subtractQuarters

この関数は、Date/DateTime 変数から Date/DateTime 間隔を減算し、Date/DateTime を返します。

dateDiff('unit', t1, t2, [timezone])

unit (例:hours) で表された 2 つの時間の差を返します。t1t2 は、Date または DateTime になる場合があります。timezone が指定されている場合は、それが両方の引数に適用されます。指定されていない場合は、データ型 t1t2 のタイム ゾーンが使用されます。タイム ゾーンが同じでない場合は、結果は未指定になります。

サポートされている単位の値:second、minute、hour、day、week、month、quarter、year

formatDateTime(Time, Format[, Timezone])

この関数は、Format 文字列に指定されている形式に従って Time をフォーマットします。形式パラメータの詳細情報については、次を参照してください:%%

formatDateTime 関数の書式コード

下表には、formatDateTime 関数の書式コードの説明と例が含まれています。

コード 説明

%C

100 で除算して、整数 (00 ~ 99) に切り捨てた年。

20

%d

ゼロパディング (ゼロ埋め) された月の日 (01 〜 31)。

02

%D

短い 月/日/年形式の日付。%m/%d/%y に相当。

01/07/2023

%e

スペースパディング (空白埋め) された月の日 (1 〜 31)。

2

%F

短い 月-日-年形式の日付。%Y-%m-%d に相当。

01/07/2023

%H

24 時間形式の時間 (00 〜 23)。

22

%I

12 時間形式の時間 (01 〜 12)。

10

%j

年間の日数 (001 ~ 366)。

007

%m

10 進数で表した月 (01 ~ 12)。

01

%M

分 (00 〜 59)。

33

%n

改行文字。「\n」。

%p

AM または PM を指定します。

PM

%R

24 時間形式の時間:分。%H:%M に相当。

22:33

%S

秒 (00 〜 59)。

44

%t

水平タブ文字 (「\t」)。

%T

ISO 8601 時間形式 (時間:分:秒)。%H:%M:%S に相当します。

22:33:44

%u

月曜日を 1 とする ISO 8601 曜日番号 (1 ~ 7)。

2

%V

ISO 8601 週番号 (01 〜 53)。

01

%w

日曜日を 0 として 10 進数で表した曜日 (0 ~ 6)。

2

%y

年の下 2 桁 (00 ~ 99)。

23

%Y

2023

%%

% 符号。

文字列を操作する関数

下表には、String 関数に関する説明が含まれています。

関数 説明

empty

空文字列の場合は 1、空でない文字列の場合は 0 を返します。結果の型は UInt8 です。空白や null バイトであっても、文字列に少なくとも 1 バイトが含まれている場合は、その文字列は空とはみなされません。

notEmpty

空文字列の場合は 0、空でない文字列の場合は 1 を返します。結果の型は UInt8 です。関数は配列にも適用されます。

length

文字列長を (文字数やコード ポイントではなく) バイト単位で返します。結果の型は UInt64 です。

lengthUTF8

文字列に UTF-8 でエンコードされたテキストを構成するバイト セットが含まれている場合、文字列長を (文字数ではなく) Unicode コード ポイントで返します。文字列が UTF-8 要件を満たしていない場合は、例外は生成されません。結果の型は UInt64 です。

char_length, CHAR_LENGTH

文字列に UTF-8 でエンコードされたテキストを構成するバイト セットが含まれていることを前提として、文字列長を (文字数ではなく) Unicode コード ポイントで返します。この前提が満たされない場合は、例外は生成されません。結果の型は UInt64 です。

character_length, CHARACTER_LENGTH

文字列に UTF-8 でエンコードされたテキストを構成するバイト セットが含まれていることを前提として、文字列長を (文字数ではなく) Unicode コード ポイントで返します。この前提が満たされない場合は、例外は生成されません。結果の型は UInt64 です。

lower, lcase

文字列の ASCII ラテン記号を小文字に変換します。

upper, ucase

文字列の ASCII ラテン記号を大文字に変換します。

lowerUTF8

文字列に UTF-8 でエンコードされたテキストを構成するバイト セットが含まれていることを前提として、文字列を小文字に変換します。言語は検出されません。UTF-8 バイト シーケンスの長さがコード ポイントの大文字と小文字で異なる場合は、結果が不正確である可能性があります。文字列に UTF-8 以外のバイト セットが含まれている場合は、動作が未定義になります。

upperUTF8

文字列に UTF-8 でエンコードされたテキストを構成するバイト セットが含まれていることを前提として、文字列を大文字に変換します。言語は検出されません。UTF-8 バイト シーケンスの長さがコード ポイントの大文字と小文字で異なる場合は、結果が不正確である可能性があります。文字列に UTF-8 以外のバイト セットが含まれている場合は、動作が未定義になります。

isValidUTF8

バイト セットが有効な UTF-8 エンコード テキストを構成している場合は 1、それ以外の場合は 0 を返します。

reverse

文字列を (バイト シーケンスとして) 反転します。

reverseUTF8

文字列に UTF-8 テキストを表すバイト セットが含まれていることを前提として、Unicode コード ポイントのシーケンスを反転します。それ以外の場合は、例外は発生しません。

concat(s1, s2, ...)

引数にリストされている文字列を、区切り文字なしで連結します。

concatAssumeInjective(s1, s2, ...)

concat と同じです。concat (s1, s2, s3) -> s4 が単射であることを確認しなければならないところが相違点です。GROUP BY 句を最適化するために使用されます。

substring(s, offset, length), mid(s, offset, length), substr(s, offset, length)

長さが length バイトの offset インデックスのバイトが冒頭に付いている部分文字列を返します。文字のインデックスは 1 から始まります (標準 SQL と同様)。offsetlength 引数は、定数でなければなりません。

substringUTF8(s, offset, length)

substring と同じですが、Unicode コード ポイント用です。文字列に UTF-8 でエンコードされたテキストを表すバイト セットが含まれていることを前提として動作します。この前提が満たされない場合は、例外は生成されません。

appendTrailingCharIfAbsent(s, c)

s 文字列に文字が含まれていて、かつ末尾に c 文字が含まれていない場合は、末尾に c 文字が追加されます。

convertCharset(s, from, to)

from のエンコーディングから to のエンコーディングに変換された文字列 s を返します。

base64Encode(s)

s 文字列を base64 でエンコードします。

base64Decode(s)

base64 でエンコードされた文字列 s を、元の文字列にデコードします。失敗した場合は、例外が生成されます。

tryBase64Decode(s)

base64 でエンコードされた文字列 s を、元の文字列にデコードします。失敗した場合は、空文字列が返されます。

endsWith(s, suffix)

文字列の末尾が特定のサフィックスの場合は 1、それ以外の場合は 0 を返します。

startsWith(s, prefix)

文字列の冒頭が特定のプレフィックスの場合は 1、それ以外の場合は 0 を返します。

trimLeft(s)

左側の空白文字が削除された文字列を返します。

trimRight(s)

右側の空白文字が削除された文字列を返します。

trimBoth(s)

両側の空白文字が削除された文字列を返します。

文字列を検索する関数

以下すべての関数では、既定で検索において大文字と小文字が区別されます。大文字と小文字を区別しない検索には、別のバリエーションがあります。下表には、検索関数に関する説明が含まれています。

関数 説明

position(haystack, needle), locate(haystack, needle)

文字列 haystack の部分文字列 needle を検索します。見つかった部分文字列の位置 (バイト単位) を 1 から返します。部分文字列が見つからなかった場合は 0 を返します。

検索で大文字と小文字を区別しない場合は、関数 positionCaseInsensitive を使用します。

positionUTF8(haystack, needle)

position と同じですが、文字列に UTF-8 でエンコードされたテキストを表すバイト セットが含まれている場合は、位置が Unicode コード ポイントで返されます。この要件が満たされない場合は、例外は生成されません。

検索で大文字と小文字を区別しない場合は、関数 positionCaseInsensitiveUTF8 を使用します。

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

position と同じですが、needle の一部に一致する文字列 haystack の左端のオフセットが返されます。

検索で大文字と小文字を区別しない場合で、UTF-8 形式で検索する場合は、関数 multiSearchFirstPositionCaseInsensitive を使用します。

multiSearchFirstPositionUTF8

multiSearchFirstPositionCaseInsensitiveUTF8

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

文字列 haystack で見つかった needle の左端のインデックス i (1 から始まる) を返します。それ以外の場合は 0 を返します。

検索で大文字と小文字を区別しない場合で、UTF-8 形式で検索する場合は、関数 multiSearchFirstIndexCaseInsensitive multiSearchFirstIndexUTF8 multiSearchFirstIndexCaseInsensitiveUTF8 を使用します。

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

少なくとも 1 つの文字列 needle が文字列 haystack と一致する場合は 1、それ以外の場合は 0 を返します。

検索で大文字と小文字を区別しない場合、および/または UTF-8 形式で検索する場合は、関数 multiSearchAnyCaseInsensitive, multiSearchAnyUTF8, multiSearchAnyCaseInsensitiveUTF8 を使用します。

すべての multiSearch * 関数では、needle パラメータの数値は 28 未満でなければなりません。

match(haystack, pattern)

文字列がパターンの正規表現と一致するかどうかを確認します。re2 正規表現の構文は、Perl 正規表現の構文よりも制限されています。

一致しない場合は 0、一致する場合は 1 を返します。

正規表現をエスケープする場合は、バックスラッシュ記号 (\) を使用します。同じ記号が文字列リテラルのエスケープにも使用されます。正規表現で記号をエスケープする場合は、文字列リテラルに 2 つのバックスラッシュ (\\) を記述する必要があります。

正規表現は、文字列がバイト セットであるかのように機能します。正規表現に null バイトを含めることはできません。文字列の部分文字列を検索するパターンの場合は、LIKE または position のほうが処理が高速であるため、このいずれかを使用することが勧められます。

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

文字列がパターンの正規表現と一致するかどうかを確認します。正規表現のいずれも一致しない場合は 0、いずれかのパターンが一致する場合は 1 を返します。文字列の部分文字列を検索するパターンの場合は、multiSearchAny ほうが高速であるため、これを使用することが勧められます。

haystack 文字列長は、いずれも 232 バイト未満でなければなりません。これを超過すると、例外が生成されます。

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

文字列がパターンの正規表現と一致するかどうかを確認します。正規表現のいずれも一致しない場合は 0、いずれかのパターンが一致する場合は 1 を返します。haystack に一致するインデックスを返します。

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

multiMatchAny と同じですが、一定の編集距離でいずれかのパターンが haystack に一致する場合は 1 を返します。この関数は実験モードで、非常に遅い可能性があります。

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

multiFuzzyMatchAny と同じですが、一定の編集距離で haystack に一致するインデックスを返します。

multiFuzzyMatch * 関数では、UTF-8 正規表現がサポートされていません。これらはバイトとして扱われます。

extract(haystack, pattern)

正規表現を使用して、文字列のフラグメントを抽出します。haystackpattern 正規表現と一致しない場合は、空文字列が返されます。正規表現にサブパターンが含まれていない場合は、正規表現全体に一致するフラグメントを取得します。それ以外の場合は、最初のサブパターンに一致するフラグメントを取得します。

like(haystack, pattern), haystack LIKE pattern operator

文字列が単純正規表現に一致するかどうかを確認します。正規表現には、以下の記号を含めることができます。

  • ‘%’ — 任意のバイト数 (ゼロ文字を含む) を示します。

  • ‘_’ — 任意の 1 バイトを示します。

メタ記号をエスケープする場合は、バックスラッシュ (\) を使用します。

正規表現をエスケープする場合は、バックスラッシュ記号 (\) を使用します。同じ記号が文字列リテラルのエスケープにも使用されます。正規表現で記号をエスケープする場合は、文字列リテラルに 2 つのバックスラッシュ (\\) を記述する必要があります。

%needle% などの正規表現の場合は、コードがより最適化され、position 関数と同じくらい高速に動作します。その他の正規表現の場合は、コードは match 関数の場合と同じです。

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

指定されたパターンに一致しないレコードをフィルタリングします。正規表現には、以下の記号を含めることができます。

  • ‘%’ — 任意のバイト数 (ゼロ文字を含む) を示します。

  • ‘_’ — 任意の 1 バイトを示します。

メタ記号をエスケープする場合は、バックスラッシュ (\) を使用します。

文字列を置換する関数

下表には、文字列を置換する関数に関する説明が含まれています。

関数 説明

replaceOne(haystack, pattern, replacement)

haystackpattern 部分文字列の最初の出現 (存在する場合) を replacement 部分文字列に置き換えます。patternreplacement は定数でなければなりません。

replaceAll(haystack, pattern, replacement), replace(haystack, pattern, replacement)

haystackpattern 部分文字列のすべての出現を replacement 部分文字列に置き換えます。

replaceRegexpOne(haystack, pattern, replacement)

pattern 正規表現を使用した置換です。re2 正規表現。存在する場合は、最初の出現のみを置き換えます。replacement としてパターンを指定することができます。このパターンには、\0 - \9 の置換を含めることができます。置換 \0 には正規表現全体が含まれます。置換 \1 - \9 はサブパターン番号に対応します。テンプレートで \ 文字を使用する場合は、別の \ を使用してエスケープします。文字列リテラルには追加のエスケープが必要であることに注意してください。

たとえば、以下の関数は文字列を 10 回コピーします。

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

結果:

Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! ¦

replaceRegexpAll(haystack, pattern, replacement)

pattern 正規表現を使用した置換です。すべての出現を置き換えます。

例:

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

HHeelllloo,, WWoorrlldd!!

正規表現を空の部分文字列に適用した場合は、置換は 1 回しか行われません。

例:

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

here: Hello, World!

regexpQuoteMeta(s)

この関数は、文字列のいくつかの定義済み文字の前にバックスラッシュを追加します。定義済み文字は、以下の通りです。'0', '\', '|', '(', ')', '^', '$', '.', '[', ']', '?', '*' , '+', '{', ':', '-'.

この実装は re2 とは異なります。ゼロバイトを \x00 ではなく \0 としてエスケープし、必要な文字のみをエスケープします。

数学関数

こうした関数はすべて、Float64 数値を返します。結果の精度は可能な限り最大の精度に近くなりますが、対応する実数に最も近いマシン表現可能な数値と一致しない可能性があります。

関数 説明

e()

数値 e に近い Float64 数値を返します。

pi()

数値 π に近い Float64 数値を返します。

exp(x)

数値引数を受け入れ、引数の指数に近い Float64 数値を返します。

log(x), ln(x)

数値引数を受け入れ、引数の自然対数に近い Float64 数値を返します。

exp2(x)

数値引数を受け入れ、2 の x 乗に近い Float64 数値を返します。

log2(x)

数値引数を受け入れ、引数の二進対数に近い Float64 数値を返します。

exp10(x)

数値引数を受け入れ、10 の x 乗に近い Float64 数値を返します。

log10(x)

数値引数を受け入れ、引数の十進対数に近い Float64 数値を返します。

sqrt(x)

数値引数を受け入れ、引数の平方根に近い Float64 数値を返します。

cbrt(x)

数値引数を受け入れ、引数の立方根に近い Float64 数値を返します。

erf(x)

x が負でない場合は、erf は、標準偏差 s の正規分布のランダム変数が期待値から x 以上離れた値を取る確率積分です。

erfc(x)

数値引数を受け入れ、1 - erf (x) に近い Float64 数値を返しますが、x 値が大きい場合でも精度は失われません。

lgamma(x)

ガンマ関数の対数。

tgamma(x)

ガンマ関数。

sin(x)

正弦。

cos(x)

余弦。

tan(x)

正接。

asin(x)

逆正弦。

acos(x)

逆余弦。

atan(x)

逆正接。

pow(x, y), power(x, y)

2 つの数値引数 xy を取り、xy 乗に近い Float64 数値を返します。

intExp2

数値引数を受け入れ、2 の x 乗に近い UInt64 数値を返します。

intExp10

数値引数を受け入れ、10 の x 乗に近い UInt64 数値を返します。

丸め関数

関数 説明

floor(x[, N])

x 以下の最大の丸め数を返します。丸め数は 1/10N の倍数、または 1 / 10N が正確でない場合は適切なデータ型の最も近い数値となります。N は整数定数で、オプションのパラメータです。既定では、これはゼロです。これにより、数値が整数に丸められます。N は負の値にすることができます。

例:

floor (123.45, 1) = 123.4

floor (123.45, -1) = 120

x は任意の数値型です。結果は同じ型の数値になります。整数引数の場合は、負の N 値で丸めるのが有効です。N が負でない場合は、何も実行されません。

ceil(x[, N]), ceiling(x[, N])

x 以上の最小の丸め数を返します。それ以外の点は floor 関数と同じです。

round(x[, N])

x を特定の小数位 (N) に丸めます。最も近い偶数に丸められます。特定の数値が周囲の数値と等しい距離にある場合は、最も近い偶数桁の数値を返します。

パラメータ:

  • x — 丸める数値。数値データ型を返す任意の式を指定することができます。
  • N — 整数値。
    • N > 0 の場合は、値が小数点の右側に丸められます。
    • N < 0 の場合は、値が小数点の左側に丸められます。
    • N = 0 の場合は、値が整数に丸められます。この場合は、引数を省略することができます。

返される値は、入力された数値と同じ型の丸め数です。

roundToExp2(num)

数値を受け入れます。数値が 1 未満の場合は、0 を返します。それ以外の場合は、数値を最も近い 2 の次数 (負でない整数) に切り捨てます。

乱数生成関数

暗号化されない疑似乱数生成器が使用されます。関数はすべて、0 個または 1 個の引数を受け入れます。引数を渡す場合、それは任意の型にすることができます。その値は何にも使用されません。この引数の目的は、共通の部分式の削除を回避することです。これにより、同じ関数の 2 つの異なるインスタンスが、異なる乱数を持つ異なる列を返すようになります。

関数 説明

rand

疑似ランダム UInt32 数値を返します。すべての UInt32 型の数値に均等に分散されます。LCG (線形合同法) を使用します。

rand64

疑似ランダム UInt64 数値を返します。すべての UInt64 型の数値に均等に分散されます。LCG (線形合同法) を使用します。

randConstant

疑似ランダム UInt64 数値を返します。すべての UInt64 型の数値に均等に分散されます。

エンコード関数

下表には、エンコード関数に関する説明が含まれています。

関数 説明

hex

次の型の引数を受け入れます:String、UInt、Date、DateTime のいずれか。引数の 16 進表現が含まれている文字列を返します。大文字の A ~ F を使用します。0x プレフィックスまたは h サフィックスは使用しません。文字列の場合は、すべてのバイトは単純に 2 つの 16 進数としてエンコードされます。数値はビッグ エンディアン形式に変換されます。日付は、Unix 時間の開始からの日数としてエンコードされます。日時は、Unix 時間の開始からの秒数としてエンコードされます。

unhex(str)

任意の数の 16 進数字が含まれている文字列を受け入れ、対応するバイトが含まれている文字列を返します。大文字と小文字 (A ~ F) の両方をサポートします。16進数字の桁数は偶数である必要はありません。奇数の場合は、最後の数字は若いほうの 00-0F ハーフバイトとして解釈されます。引数文字列に 16 進数字以外の数字が含まれている場合は、例外は生成されません。結果を数値に変換する場合は、reversereinterpretAsType 関数を使用することができます。

bitmaskToList(num)

整数を受け入れます。これは、合計すると元の数になる2のべき乗のリストを含む文字列を返します。テキスト形式で、スペースなしのカンマ区切りで昇順に表示されます。

URL を操作する関数

下表には、URL を操作する関数に関する説明が含まれています。

関数 説明

protocol

プロトコル (例:http、ftp、mailto、imap) を返します。

domain

ドメインを返します。

domainWithoutWWW

ドメインを返し、その冒頭の 'www.' を 1 つのみ 削除します (存在する場合)。

topLevelDomain

トップレベル ドメインを返します。例:.com

firstSignificantSubdomain

最初の重要なサブドメインを返します。

  • ドメインが「com」、「net」、「org」、または「co」の場合は、最初の重要なサブドメインはセカンドレベル ドメインです。
  • それ以外の場合は、サードレベル ドメインです。

cutToFirstSignificantSubdomain

最初の重要なサブドメインまでのトップレベル サブドメインが含まれているドメインの部分を返します。

path

パスを返します。パスには、クエリ文字列は含まれていません。

pathFull

クエリ文字列とフラグメントが含まれているパスを返します。

例:/top/news.html?page=2#comments

queryString

クエリ文字列を返します。クエリ文字列には、以下は含まれません。

  • 最初の疑問符 (?)
  • #
  • # 以降の任意の要素

fragmenttext

フラグメント識別子を返します。最初のハッシュ # 記号は含まれていません。

queryStringAndFragment

クエリ文字列とフラグメント識別子を返します。

extractURLParameter(URL, name)

URL の name パラメータの値を返します (存在する場合)。それ以外の場合は、空文字列を返します。この名前のパラメータが多数ある場合は、最初に出現したものを返します。この関数は、パラメータ名が渡された引数と全く同じ方法で URL にエンコードされていることを前提としています。

extractURLParameters(URL)

URL パラメータに対応する name=value 文字列の配列を返します。値はいかなる方法でもデコードされません。

extractURLParameterNames(URL)

URL パラメータ名に対応する名前文字列の配列を返します。値はいかなる方法でもデコードされません。

URLHierarchy(URL)

URL が含まれている配列を返しますが、パスとクエリ文字列の末尾の記号 /? で切り取られます。連続する区切り文字は 1 つとしてカウントされます。連続するすべての区切り文字の後の位置で切られます。

例:

URLPathHierarchy('https://example.com/browse/CONV-6788') =
[
'/browse/',
'/browse/CONV-6788'
]

URLPathHierarchy(URL)

URLHierarchy(URL) と同じ結果を返しますが、結果にはプロトコルとホストは含まれていません。/’ 要素 (ルート) は含まれていません。

decodeURLComponent(URL)

デコードされた URL を返します。

cutWWW

URL のドメインの冒頭の「www.」を 1 つのみ 削除します (存在する場合)。

cutQueryString

クエリ文字列を削除します。疑問符も削除されます。

cutFragment

フラグメント識別子を削除します。番号記号も削除されます。

cutQueryStringAndFragment

クエリ文字列とフラグメント識別子を削除します。疑問符と番号記号も削除されます。

cutURLParameter(URL, name)

「name」URL パラメータを削除します (存在する場合)。この関数は、パラメータ名が渡された引数と全く同じ方法で URL にエンコードされていることを前提として動作します。

IP アドレスを操作する関数

下表には、IP アドレスを操作する関数に関する説明が含まれています。

関数 説明

IPv4NumToString (num)

UInt32 数値を取り、それをビッグ エンディアンの IPv4 アドレスとして解釈します。A.B.C.D 形式 (ドット区切りの 10 進法形式) の対応する IPv4 アドレスが含まれている文字列を返します。

IPv4StringToNum(s)

IPv4NumToString の逆関数。IPv4 アドレスの形式が無効な場合は、0 を返します。

IPv4NumToStringClassC(num)

IPv4NumToString に似ていますが、最後のオクテットの代わりに xxx を使用します。

IPv6NumToString(x)

バイナリ形式の IPv6 アドレスが含まれている FixedString(16) 値を受け入れます。このアドレスがテキスト形式で含まれている文字列を返します。IPv6 にマッピングされた IPv4 アドレスは、:: ffff: 111.222.33.44 の形式で出力されます。

IPv6StringToNum(s)

IPv6NumToString の逆関数。IPv6 アドレスの形式が無効な場合は、null バイトの文字列を返します。HEX は大文字でも小文字でも構いません。

IPv4ToIPv6(x)

UInt32 数値を取り、それをビッグ エンディアンの IPv4 アドレスとして解釈します。バイナリ形式の IPv6 アドレスが含まれている FixedString(16) 値を返します。

cutIPv6(x, bitsToCutForIPv6, bitsToCutForIPv4)

バイナリ形式の IPv6 アドレスが含まれている FixedString(16) 値を受け入れます。特定の数のビットを削除したアドレスがテキスト形式で含まれている文字列を返します。

IPv4CIDRtoIPv4Range(ipv4, cidr)

CIDR が含まれている IPv4 と UInt8 値を受け入れます。サブネットの低いほうと高いほうの範囲が含まれている 2 つの IPv4 値を持つタプルを返します。

IPv6CIDRtoIPv6Range(ipv6, cidr)

CIDR が含まれている IPv6 と UInt8 値を受け入れます。サブネットの低いほうと高いほうの範囲が含まれている 2 つの IPv6 値を持つタプルを返します。

Null 許容引数を操作する関数

関数 説明

isNull(x)

引数が NULL かどうかを確認します。

パラメータ:

  • x — 非複合データ型の値

返される値:

  • 1 — x が NULL の場合
  • 0 — x が NULL 以外の場合

isNotNull (x)

パラメータ:

  • x — 非複合データ型の値

返される値:

  • 0 — x が NULL の場合
  • 1 — x が NULL 以外の場合

coalesce(x,...)

  • パラメータ — 非複合型の任意の数のパラメータ。すべてのパラメータはデータ型による互換性がなければなりません。
  • 返される値 — 最初の NULL 以外の引数。すべての引数が NULL の場合は、NULL になります。

ifNull

メインの引数が NULL の場合に、代替値を返します。

ifNull (x, alt)

パラメータ:

  • x — NULL かどうかを確認する値
  • altx が NULL の場合に関数が返す値

返される値:

  • x が NULL 以外の場合、値 x
  • x が NULL の場合、値 alt

nullIf(x,y)

引数が等しい場合は、NULL を返します。

パラメータ:

  • x, y — 比較のための値。これらは互換性のある型でなければなりません。互換性がない場合は、ソリューションで例外が生成されます。

返される値:

  • 引数が等しい場合は、NULL
  • 引数が等しくない場合は、x 値

assumeNotNull(x)

パラメータ:

  • x — 元の値

返される値:

  • NULL 以外の場合は、Null 非許容型の元の値
  • 元の値が NULL の場合は、Null 非許容型の既定値。

toNullable(x)

引数の型を、Null 許容型に変換します。

パラメータ:

  • x — 任意の非複合型の値

返される値:

  • Null 非許容型の入力値

関連トピック

高度な SQL クエリ構文

集計関数

選択句の構文

サポートされているデータ型