このトピックでは、文字列関数の基本的な構文と例について説明します。
Log Service は、次の文字列関数をサポートしています。
関数 | 構文 | 説明 | SQL | SPL |
chr(x) | ASCII コードを文字に変換します。 | √ | √ | |
codepoint(x) | 文字を ASCII コードに変換します。 | √ | √ | |
concat(x, y...) | 複数の文字列を連結します。 | √ | √ | |
from_utf8(x) | バイナリ文字列を UTF-8 テキストとしてデコードし、無効な文字をデフォルトの置換文字 (U+FFFD) に置き換えます。 | √ | √ | |
from_utf8(x, replace_string) | バイナリ文字列を UTF-8 テキストとしてデコードし、無効な文字をカスタム文字列に置き換えます。 | √ | √ | |
length(x) | 文字列の長さを返します。 | √ | √ | |
levenshtein_distance(x, y) | x と y の間の最小編集距離を計算します。 | √ | × | |
lower(x) | 文字列を小文字に変換します。 | √ | √ | |
lpad(x, length, lpad_string) | 文字列の先頭に指定した文字列をパディングして、指定した長さにします。 | √ | √ | |
ltrim(x) | 文字列の先頭の空白を削除します。 | √ | √ | |
normalize(x) | 文字列を NFC 形式に正規化します。 | √ | × | |
position(sub_string in x) | 別の文字列内で最初に出現する部分文字列の開始位置を返します。 | √ | × | |
replace(x, sub_string ) | 文字列から指定された部分文字列のすべての出現箇所を削除します。 | √ | √ | |
replace(x, sub_string, replace_string) | 指定された部分文字列のすべての出現箇所を置換文字列に置き換えます。 | √ | √ | |
reverse(x) | 文字列を反転させます。 | √ | √ | |
rpad(x, length, rpad_string) | 文字列の末尾に指定した文字列をパディングして、指定した長さにします。 | √ | √ | |
rtrim(x) | 文字列の末尾の空白を削除します。 | √ | √ | |
split(x, delimiter) | 文字列をデリミタで分割し、部分文字列の配列を返します。 | √ | √ | |
split(x, delimiter, limit) | 指定された区切り文字で文字列を分割し、limit パラメーターを使用して分割数を制限し、結果の部分文字列の配列を返します。 | √ | √ | |
split_part(x, delimiter, part) | 文字列をデリミタで分割し、指定された位置の部分文字列を返します。 | √ | √ | |
split_to_map(x, delimiter01, delimiter02) | 2 つのデリミタを使用して、文字列をキーと値のペアのマップに分割します。 | √ | √ | |
strpos(x, sub_string) | この関数は position(sub_string in x) のエイリアスです。 | √ | √ | |
substr(x, start) | 指定された位置から始まる部分文字列を文字列から抽出します。 | √ | √ | |
substr(x, start, length) | 指定された位置から始まる、指定された長さの部分文字列を文字列から抽出します。 | √ | √ | |
to_utf8(x) | 文字列を UTF-8 バイナリ文字列にエンコードします。 | √ | √ | |
trim(x) | 文字列の先頭と末尾の空白を削除します。 | √ | √ | |
upper(x) | 文字列を大文字に変換します。 | √ | √ | |
csv_extract_map(x, delimiter, quote, keys) | CSV テキストの行から指定された値を抽出し、マップに格納します。 | √ | × | |
ilike(x, pattern) | 大文字と小文字を区別せずに、文字列がパターンに一致するかどうかをチェックします。 | √ | √ | |
str_uuid() | ランダムな 128 ビットの UUID を生成し、文字列として返します。 | × | √ | |
gzip_compress(data, compression_level) | GZIP アルゴリズムを使用して文字列をバイナリストリームに圧縮します。 | × | √ | |
gzip_decompress(binary_data) | GZIP 圧縮されたバイナリストリームを解凍し、元の文字列を返します。 | × | √ | |
search(search_expression) | SQL 分析文内でログデータに対して全文検索を実行します。ブール演算、フィールド固有の検索、あいまいクエリ、範囲クエリをサポートします。 | √ | × |
chr 関数
chr 関数は、ASCII コードを文字に変換します。
構文
chr(x)パラメーター
パラメーター | 説明 |
x | ASCII コード。 |
戻り値の型
varchar
例
region フィールドの値の最初の文字が 'c' であるかどうかを判断します。ここで、99 は小文字 'c' の ASCII コードです。
フィールド例
region:cn-shanghaiクエリと分析の文 (テスト)
* | SELECT substr(region, 1, 1) = chr(99)クエリと分析の結果:
_col0列の戻り値はtrueであり、regionフィールドの最初の文字がchr(99)(文字c) と一致することを示します。
Codepoint 関数
codepoint 関数は、文字を ASCII コードに変換します。
構文
codepoint(x)パラメーター
パラメーター | 説明 |
x | 変換する文字。 |
戻り値の型
integer
例
region フィールドの値の最初の文字が 'c' であるかどうかを判断します。ここで、99 は小文字 'c' の ASCII コードです。
フィールド例
upstream_status:200クエリ文 (テスト)
* | SELECT codepoint(cast (substr(region, 1, 1) AS char(1))) = 99クエリと分析の結果:
_col0列は 2 行のデータを返し、両方の行の値はtrueです。
Concat 関数
複数の文字列を 1 つの文字列に連結します。
構文
concat(x, y...)パラメーター
パラメーター | 説明 |
x | 値は varchar である必要があります。 |
y | 値は varchar である必要があります。 |
戻り値の型
戻り値は varchar です。
例
region フィールドと request_method フィールドの値を 1 つの文字列に連結します。
フィールド例
region:cn-shanghai time:14/Jul/2021:02:19:40クエリと分析の文 (テスト)
* | SELECT concat(region, '-', time)クエリと分析の結果では、
_col0列はcn-shanghai-14/Jul/2021:01:16:30のような連結された文字列を返します。
from_utf8 関数
バイナリ文字列を UTF-8 エンコード形式にデコードします。
構文
無効な UTF-8 文字をデフォルトの置換文字 U+FFFD に置き換えます。
from_utf8(x)無効な UTF-8 文字を指定された文字に置き換えます。
from_utf8(x,replace_string)
パラメーター
パラメーター | 説明 |
x | デコードするバイナリ文字列。 |
replace_string | 無効な UTF-8 文字を置き換えるために使用されるオプションの単一文字またはスペース。 |
戻り値の型
varchar
例
バイナリ文字列 0x80 をデコードし、無効な UTF-8 文字をデフォルトの置換文字 (U+FFFD) に置き換えます。
クエリと分析の文 (デバッグ)
* | SELECT from_utf8(from_base64('0x80'))クエリと分析の結果:クエリは単一の列
_col0を返します。値は置換文字 (U+FFFD) を含む文字列であり、無効な UTF-8 バイトがデフォルトの置換文字に置き換えられたことを意味します。
バイナリ文字列 0x80 をデコードし、無効な UTF-8 文字を '0' に置き換えます。
クエリと分析の文 (デバッグ)
* | SELECT from_utf8(from_base64('0x80'), '0')クエリと分析の結果は、
_col0という名前の単一の列と値0□4を返します。四角いボックスは正しくレンダリングできないバイトを表しており、これはfrom_utf8関数が無効な UTF-8 バイトを置き換えた後の出力です。
Length 関数
文字列の長さを返します。
構文
length(x)パラメーター
パラメーター | |
x | varchar 値。 |
戻り値
bigint
例
http_user_agent フィールド値の長さを計算します。
フィールド例
http_user_agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2クエリ文 (テスト)
* | SELECT length(http_user_agent)クエリと分析の結果は
127であり、http_user_agentフィールドの値の文字列長を表します。
levenshtein_distance
2 つの文字列間の最小編集距離を計算します。
構文
levenshtein_distance(x, y)パラメーター
パラメーター | 説明 |
x | varchar 型の値。 |
y | varchar 型の値。 |
戻り値
bigint
例
instance_id フィールドと owner_id フィールドの値の間の最小編集距離をクエリします。
フィールド例
instance_id:i-01 owner_id:owner-01クエリと分析の文 (デバッグ)
* | SELECT levenshtein_distance(owner_id, instance_id)クエリと分析の結果は
5です。
Lower 関数
文字列を小文字に変換します。
構文
lower(x)パラメーター
パラメーター | 説明 |
x | varchar 文字列。 |
戻り値の型
varchar
例
request_method フィールドの値を小文字に変換します。
フィールド例
request_method:GETクエリと分析の文 (デバッグ)
* | SELECT lower(request_method)クエリと分析の結果は
getです。
lpad 関数
lpad 関数は、文字列の左側に指定された文字をパディングして、指定された長さにします。
構文
lpad(x, length, lpad_string)パラメーター
パラメーター | 説明 |
x | 値は varchar 型である必要があります。 |
length | 結果の文字列の目的の長さを指定する整数。
|
lpad_string | パディングに使用する文字または文字列。 |
戻り値の型
varchar
例
instance_id フィールドの値を先頭ゼロで 10 桁の長さにパディングします。
フィールド例
instance_id:i-01クエリ文 (テスト)
* | SELECT lpad(instance_id, 10, '0')クエリと分析の結果では、
_col0列の戻り値は000000i-01です。
ltrim 関数
文字列の先頭のスペースを削除します。
構文
ltrim(x)パラメーター
パラメーター | 説明 |
x | 入力文字列。varchar 型である必要があります。 |
戻り値の型
varchar
例
region フィールドの値から先頭のスペースを削除します。
フィールド例
region: cn-shanghaiクエリと分析の文 (テスト)
* | SELECT ltrim(region)結果は
cn-shanghaiです。
Normalize 関数
正規化形式 C (NFC) 形式を使用して文字列を正規化します。
構文
normalize(x)パラメーター
パラメーター | 説明 |
x | 正規化する varchar 文字列。 |
戻り値の型
varchar
例
この例では、文字列 schön を NFC 形式を使用して正規化します。
クエリ文 (デバッグ)
* | SELECT normalize('schön')クエリと分析の結果は 1 行 1 列を返し、列名は
_col0、値はschönです。
Position 関数
文字列内の部分文字列の開始位置を返します。
構文
position(sub_string in x)パラメーター
パラメーター | 説明 |
sub_string | 検索する部分文字列。 |
x | 検索する文字列。varchar 型である必要があります。 |
戻り値の型
部分文字列の 1 から始まる開始位置を表す整数を返します。部分文字列が見つからない場合、関数は 0 を返します。
例
region フィールド内の部分文字列 cn の位置を見つけます。
フィールド例
region:cn-shanghaiクエリと分析の文 (テスト)
* | SELECT position('cn' in region)クエリと分析の結果:
_col0列は1を返します。これは、部分文字列cnが文字列cn-shanghaiの位置 1 から始まることを示します。
Replace 関数
replace 関数は、文字列内の指定された部分文字列のすべての出現箇所を削除または置換します。
構文
文字列から部分文字列のすべての出現箇所を削除します。
replace(x, sub_string)部分文字列のすべての出現箇所を別の文字列に置き換えます。
replace(x, sub_string, replace_string)
パラメーター
パラメーター | 説明 |
x | ソース文字列。データ型は varchar である必要があります。 |
sub_string | 削除または置換する部分文字列。 |
replace_string | 置換文字列。 |
戻り値の型
varchar
例
Reverse 関数
reverse 関数は、文字を逆の順序で並べた文字列を返します。
構文
reverse(x)パラメーター
パラメーター | 説明 |
x | 入力文字列。varchar 型である必要があります。 |
戻り値の型
varchar
例
request_method フィールドの値を反転させます。
フィールド例
request_method:GETクエリ文 (テスト)
* | SELECT reverse(request_method)結果は
TEGです。
rpad 関数
文字列の右側に指定された文字をパディングして、指定された長さにします。
構文
rpad(x, length, rpad_string)パラメーター
パラメーター | 説明 |
x | ソース文字列。varchar 型である必要があります。 |
length | 結果の文字列の目的の長さを整数で指定します。
|
rpad_string | パディングに使用する文字または文字列。 |
戻り値の型
varchar
例
次の例では、instance_id フィールドの値を末尾のゼロで 10 の長さにパディングします。
フィールド例
instance_id:i-01クエリ文 (デバッグ)
* | SELECT rpad(instance_id, 10, '0')クエリと分析の結果:
_col0列は値i-01000000を返します。
rtrim 関数
文字列の末尾のスペースを削除します。
構文
rtrim(x)パラメーター
パラメーター | 説明 |
x | ソース文字列。varchar である必要があります。 |
戻り値の型
varchar
例
このクエリは、instance_id フィールドの値から末尾のスペースを削除します。
フィールド例
instance_id:i-01クエリ文 (デバッグ)
* | SELECT rtrim(instance_id)クエリと分析の結果:
_col0列の戻り値はi-01です。
split 関数
split 関数は、区切り文字を使用して文字列を部分文字列の配列に分割します。
構文
区切り文字で文字列を分割します。
split(x, delimiter)区切り文字で文字列を最大数の部分文字列に分割します。
split(x,delimiter,limit)
パラメーター
パラメーター | 説明 |
x | 分割する varchar 文字列。 |
delimiter | 文字列を分割するために使用されるデリミタ。 |
limit | 返す部分文字列の最大数。値は正の整数である必要があります。 |
戻り値の型
array
例
例 1:
request_uriフィールドの値をスラッシュ (/) を使用して 4 つの部分文字列に分割し、これらの部分文字列の配列を返します。フィールド例
request_uri:/request/path-1/file-9クエリと分析の文 (テスト)
* | SELECT split(request_uri, '/')クエリと分析の結果:クエリは
["" ,"request","path-1","file-9"]を返します。これは、request_uriを/で分割して作成された配列です。
例 2:スラッシュ (/) を使用して
request_uriフィールドの値を 3 つの部分文字列に分割し、部分文字列のコレクションを返します。フィールド例
request_uri:/request/path-1/file-9クエリと分析の文 (テスト)
* | SELECT split(request_uri, '/', 3)クエリと分析の結果では、_col0 列の値は
["","request","path-1/file-9"]です。
Split_part 関数
指定された区切り文字で文字列を分割し、指定されたインデックスの部分文字列を返します。
構文
split_part(x, delimiter, part)パラメーター
パラメーター | 説明 |
x | 分割する文字列。この値は varchar である必要があります。 |
delimiter | 区切り文字として使用される空でない文字列。 |
part | 返す部分文字列の 1 から始まるインデックスを指定する整数式。値は 0 より大きい必要があります。 |
戻り値
varchar
例
request_uri フィールドの値を疑問符 (?) で分割し、最初の部分文字列 (ファイルパス) を返します。次に、各パスのリクエスト数をカウントします。
フィールド例
request_uri: /request/path-2/file-6?name=value&age=18 request_uri: /request/path-2/file-0?name=value&age=18 request_uri: /request/path-3/file-2?name=value&age=18クエリ文 (テスト)
* | SELECT count(*) AS PV, split_part(request_uri, '?', 1) AS Path GROUP BY Path ORDER BY pv DESCクエリと分析の結果:
/request/path-2/file-6の PV は 49、/request/path-2/file-0の PV は 47、/request/path-3/file-2の PV は 44 です。
split_to_map 関数
split_to_map 関数は、2 つのデリミタを使用してキーと値のペアの文字列をマップに解析します。
構文
split_to_map(x, delimiter01, delimiter02)パラメーター
パラメーター | 説明 |
x | 解析する入力文字列。varchar 型である必要があります。 |
delimiter01 | キーと値のペアを区切るデリミタ。 |
delimiter02 | 各ペアのキーと値を区切るデリミタ。 |
戻り値の型
map
例
英語のコンマ (,) と英語のコロン (:) を使用して time フィールドの値を分割し、MAP を返します。
フィールド例
upstream_response_time:"80",request_time:"40"クエリと分析の文
* | SELECT split_to_map(time, ',', ':')この関数はマップを返します。クエリと分析の結果では JSON 形式で表示されます:
{"request_time":"\"40\"","upstream_response_time":"\"80\""}。
Strpos 関数
strpos 関数は、文字列内の部分文字列の開始位置を返します。これは position 関数のエイリアスです。
構文
strpos(x, sub_string)パラメーター
パラメーター | 説明 |
x | 検索対象のソース文字列。varchar である必要があります。 |
sub_string | 検索する部分文字列。 |
戻り値の型
部分文字列の 1 から始まる開始位置を表す整数を返します。部分文字列が見つからない場合は 0 を返します。
例
この例では、server_protocol フィールド内の文字 'H' の位置を見つけます。
クエリ文 (テスト)
* | SELECT strpos(server_protocol, 'H')クエリと分析の結果:
_col0列は 2 行のデータを返し、両方とも値1です。これは、server_protocolフィールドで文字 H が最初に出現する位置が 1 であることを示します。
substr 関数
substr 関数は、指定された位置から始まる部分文字列を文字列から抽出します。
構文
指定された開始位置から文字列の末尾までの部分文字列を抽出します。
substr(x, start)指定された位置から始まる、指定された長さの部分文字列を文字列から抽出します。
substr(x,start,length)
パラメーター
パラメーター | 説明 |
x | ソース文字列。 |
start | 抽出の 1 から始まる開始位置。 |
length | 抽出する文字数を指定するオプションの整数。このパラメーターを省略すると、関数は |
戻り値の型
varchar
例
server_protocol フィールドの値から最初の 4 文字 (HTTP 部分) を抽出し、HTTP リクエストの数をカウントします。
フィールド例
server_protocol:HTTP/2.0クエリ文 (テスト)
* | SELECT substr(server_protocol, 1, 4) AS protocol, count(*) AS count GROUP BY protocolクエリと分析の結果では、
protocol列の値はHTTP、count列の値は9078です。
to_utf8 関数
文字列を UTF-8 バイナリ表現にエンコードします。
構文
to_utf8(x)パラメーター
パラメーター | 説明 |
x | エンコードする文字列。これは varchar である必要があります。 |
戻り値の型
varbinary
例
文字列 'log' を UTF-8 形式にエンコードします。
クエリ文 (テスト)
* | SELECT to_utf8('log')クエリと分析の結果では、
_col0列の戻り値はbG9nです。
Trim 関数
文字列の先頭と末尾のスペースを削除します。
構文
trim(x)パラメーター
パラメーター | 説明 |
x | 入力文字列。varchar である必要があります。 |
戻り値の型
varchar
例
instance_id フィールドの値から先頭と末尾のスペースを削除します。
フィールド例
instance_id: i-01クエリと分析の文 (テスト)
* | SELECT trim(instance_id)クエリと分析の結果:i-01
Upper 関数
文字列を大文字に変換します。
構文
upper(x)パラメーター
パラメーター | 説明 |
x | 値は varchar 型である必要があります。 |
戻り値の型
varchar
例
この例では、region フィールドの値を大文字に変換します。
フィールド例
region:cn-shanghaiクエリ文 (テスト)
* | SELECT upper(region)クエリと分析の結果は
CN-SHANGHAIです。
csv_extract_map 関数
csv_extract_map 関数は、単一行の CSV 文字列を解析し、マップを返します。
構文
csv_extract_map(x, delimiter, quote, keys)パラメーター
パラメーター | 説明 |
x | 単一行の CSV テキストを含む |
delimiter | 文字列内の値を区切る単一の |
quote | 値を囲むために使用される単一の |
keys | 抽出された値のキー名を定義する文字列の配列。キーの数は CSV 文字列の値の数と一致する必要があります。一致しない場合、関数は null を返します。 |
戻り値の型
map(varchar, varchar)
例
この例では、content フィールドから CSV 情報を抽出します。
フィールド例
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com'クエリ文
select csv_extract_map(content, ',', '"', array['ip', 'time', 'host']) as item出力データ
クエリは次の JSON レコードを返します:
{"ip":"192.168.0.100","host":"example.aliyundoc.com","time":"10/Jun/2019:11:32:16,127 +0800"}。
ilike 関数
大文字と小文字を区別せずに、文字列が指定されたパターンに一致するかどうかをチェックします。
構文
ilike(x, pattern)パラメーター
パラメーター | 説明 |
x | 評価する文字列。varchar 型である必要があります。 |
pattern | 文字パターン。パターンには次のワイルドカード文字を含めることができます:
|
戻り値の型
boolean
例
この例では、request_uri の値が file-6 で終わるかどうかをチェックします。
フィールド例
request_uri: '/request/path-2/File-6'クエリ文
select ilike(request_uri, '%file-6')クエリと分析の結果
クエリと分析の結果は true であり、request_uri が file-6 で終わることを示します。
str_uuid
str_uuid() 関数は、ランダムな 128 ビットの識別子を文字列として返します。
構文
str_uuid()戻り値
戻り値の型:
VARCHARフォーマット: 32 個の 16 進数と 4 つのハイフン
-を持つ 36 文字の文字列。構造:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
例
シミュレートされたテスト環境で一意の識別子を大量に生成するには:
* | extend uuid = str_uuid()Gzip_compress 関数
gzip_compress 関数は、GZIP アルゴリズムを使用して文字列を圧縮し、圧縮されたバイナリデータを返します。
構文
-- 方法 1:デフォルトの圧縮レベル (6)
gzip_compress(data)
-- 方法 2:圧縮レベルを指定
gzip_compress(data, compression_level)パラメーター
パラメーター | 型 | 説明 |
data | VARCHAR | 圧縮する文字列。 |
compression_level | BIGINT | 圧縮レベル、1 から 9 までのオプションの整数。 |
戻り値
戻り値の型:
VARBINARY説明:圧縮されたバイナリデータ。
例
例 1:基本的な圧縮
* | extend compress_data = gzip_compress('Hello World')例 2:大きなテキストで最大の圧縮を実現する
大きなログ (数万文字) の圧縮を最大化し、ストレージスペースを節約するには、レベル
9を使用します:* | extend compress_data = gzip_compress('Hello World',9)
gzip_decompress
gzip_decompress は、GZIP 圧縮されたバイナリデータ (Varbinary) を解凍し、元のプレーンテキストコンテンツを返します。
構文
gzip_decompress(binary_data)パラメーター
binary_data は、有効な GZIP 圧縮データである必要があり、通常は gzip_compress 関数によって生成されます。入力が標準の GZIP 形式でない場合、関数は NULL を返します。
戻り値
戻り値の型:
VARCHAR説明:解凍後の元のプレーンテキストコンテンツ。
例
単純な圧縮と解凍のパイプライン:
* | extend original_content = gzip_decompress(gzip_compress('Hello SLS!')) -- 出力: "Hello SLS!"
Search 関数
search 関数は、SQL 分析文でログデータに対して全文検索を実行します。標準の SQL 関数として、ブール演算、フィールドクエリ、あいまいクエリ、範囲クエリなどの複雑なクエリ条件をサポートします。
制限事項
制限事項 | 説明 |
サブクエリごとの制限 | 各サブクエリ (基になる SELECT) では、 |
OR 演算子の制限 |
|
インデックスが作成されており、スキャンモードではないこと。 | search 関数はスキャンモードではサポートされていません。 |
クエリ構文の競合 | クエリ構文の入力に実際のフィルター条件が含まれている場合、search 関数は使用できません。クエリ構文の入力が空または |
パラメーターの型 |
|
パラメーターの数 | この関数は、正確に 1 つのパラメーターを取る必要があります。 |
構文
search(search_expression)SQL 分析文での使用法:
* | SELECT ... FROM log WHERE search('search_expression')重要:search 関数は WHERE 句でのみ使用できます。
パラメーター
パラメーター | 説明 |
search_expression |
|
戻り値の型
BOOLEAN 型。true は現在の行がクエリ条件に一致することを示し、false は一致しないことを示します。
例
例 1:
errorとtimeoutの両方を含むログを検索します。* | SELECT * FROM log WHERE search('error AND timeout')例 2:
statusフィールドが200のログを検索します。* | SELECT * FROM log WHERE search('status: 200')例 3:
search()関数と SQL 述語を組み合わせて、statusが200でrequest_timeが100より大きいログを検索します。* | SELECT * FROM log WHERE search('status: 200') AND request_time > 100詳細については、「search 関数を使用して全文検索を実行する」をご参照ください。