このトピックでは、ユーザー定義関数 (UDF) について説明します。
UDF
関数 | 説明 |
指定されたフィールドの特定の値が指定された値セットに含まれている場合、true を返します。フィールドは単値フィールドまたは複数値フィールドを指定できます。 | |
指定されたフィールドの特定の値が指定された値セットから除外されている場合、true を返します。フィールドは単値フィールドまたは複数値フィールドを指定できます。 | |
指定されたフィールドの転置インデックスが指定された条件を満たす場合、true を返します。 | |
指定された条件に基づいて転置インデックスを返します。この関数の構文は、HA3 でサポートされている query 句の構文と同じです。 | |
INT64 型の複数のフィールドの値を INT64 型の 1 つの値にマージします。 | |
フィールド内の指定された範囲の値を指定されたデータ型の値に変換します。 | |
指定されたフィールドの特定の値が指定された範囲に含まれている場合、true を返します。 | |
フィールドの値を正規化します。 |
サンプルクエリ
phone テーブルの全データのクエリ
SELECT nid, price, brand, size FROM phone ORDER BY nid LIMIT 1000 USE_TIME: 0.881, ROW_COUNT: 10
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
1 | 3599 | Huawei | 5.9 |
2 | 4388 | Huawei | 5.5 |
3 | 899 | Xiaomi | 5 |
4 | 2999 | OPPO | 5.5 |
5 | 1299 | Meizu | 5.5 |
6 | 169 | Nokia | 1.4 |
7 | 3599 | Apple | 4.7 |
8 | 5998 | Apple | 5.5 |
9 | 4298 | Apple | 4.7 |
10 | 5688 | Samsung | 5.6 |contain
プロトタイプ
boolean contain(INT a, const string b) boolean contain(LITERAL a, const string b) boolean contain(INT_ARRAY a, const string b) boolean contain(LITERAL_ARRAY a, const string b)説明
この関数を使用すると、a フィールドの値が b 値セットに含まれているかどうかを判断できます。 a フィールドは、単値フィールドまたは複数値フィールドです。
パラメータ:
a: データテーブルのフィールドを指定します。指定するフィールドは、INT、LITERAL、INT_ARRAY、または LITERAL_ARRAY 型のフィールドです。
b: 定数文字列を指定します。指定する定数は縦棒 (
|) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は true を返します。戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値が b 値セットに含まれていることを示します。false の値は、a フィールドの値が b 値セットから除外されていることを示します。
例
SELECT nid, price, brand, size FROM phone WHERE contain(nid, '1|2|3') ORDER BY nid LIMIT 100USE_TIME: 0.059, ROW_COUNT: 3
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
1 | 3599 | Huawei | 5.9 |
2 | 4388 | Huawei | 5.5 |
3 | 899 | Xiaomi | 5 |notcontain
プロトタイプ
boolean notcontain(INT a, const string b) boolean notcontain(LITERAL a, const string b) boolean notcontain(INT_ARRAY a, const string b) boolean notcontain(LITERAL_ARRAY a, const string b)説明
この関数を使用すると、a フィールドの値が b 値セットに含まれていないかどうかを判断できます。
パラメータ:
a: データテーブルのフィールドを指定します。指定するフィールドは、INT、LITERAL、INT_ARRAY、または LITERAL_ARRAY 型のフィールドです。
b: 定数文字列を指定します。指定する定数は縦棒 (
|) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は false を返します。戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値が b 値セットに含まれていないことを示します。false の値は、a フィールドの値が b 値セットに含まれていることを示します。
例
次のステートメントでは、
notcontain関数を使用して、nid フィールドの値が 1、2、または 3 でない行のデータエントリをクエリします。SELECT nid, price, brand, size FROM phone WHERE notcontain(nid, '1|2|3') ORDER BY nid LIMIT 100USE_TIME: 0.092, ROW_COUNT: 7 ------------------------------- TABLE INFO --------------------------- nid | price | brand | size | 4 | 2999 | OPPO | 5.5 | 5 | 1299 | Meizu | 5.5 | 6 | 169 | Nokia | 1.4 | 7 | 3599 | Apple | 4.7 | 8 | 5998 | Apple | 5.5 | 9 | 4298 | Apple | 4.7 | 10 | 5688 | Samsung | 5.6 |
MATCHINDEX
プロトタイプ
boolean MATCHINDEX(const string a, const string b)説明
この関数を使用すると、a フィールドの値に b パラメータの値が含まれているかどうかを判断できます。この関数を使用して、フィールドのインデックスを取得できます。
この関数は WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。
パラメータ:
a: STRING 型のフィールドを指定します。システムは、指定されたフィールドに基づいて転置インデックスを作成し、クエリを最適化します。
b: STRING 型のキーワードを指定します。
b パラメータの値は、検索クエリ文字列として使用できます。
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値に b パラメータの値が含まれていることを示します。false の値は、a フィールドの値に b パラメータの値が含まれていないことを示します。
例
次のステートメントでは、
MATCHINDEX関数を使用して、titleフィールドの値に Lens キーワードが含まれている行のデータエントリをクエリします。SELECT nid, brand FROM phone WHERE MATCHINDEX('title', 'Lens')------------------------------- TABLE INFO --------------------------- nid | brand | 1 | Huawei |
QUERY
プロトタイプ
boolean QUERY(const string a, const string b)説明
この関数を使用すると、a フィールドの値に b パラメータの値が含まれているかどうかを判断できます。システムは、指定されたキーワードを自動的に用語に変換してクエリを実行します。
この関数は、HA3 でサポートされている SQL ステートメントの query 句の構文をサポートしています。
この関数は WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。
パラメータ:
a: STRING 型のフィールドを指定します。システムは、指定されたフィールドを config 句の default_index パラメータの値として自動的に使用します。
b: STRING 型のキーワードを指定します。
システムは、ステートメントを最適化し、指定された範囲からデータをクエリした後、b パラメータの値をステートメントに含めます。
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値に b パラメータの値が含まれていることを示します。false の値は、a フィールドの値に b パラメータの値が含まれていないことを示します。
例
次のステートメントでは、
QUERY関数を使用して、titleフィールドの値に Huawei キーワードが含まれている行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone WHERE QUERY(title, 'Huawei')
USE_TIME: 0.034, ROW_COUNT: 1
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
2 | 4388 | Huawei | 5.5 |次のステートメントでは、Huawei キーワードと OPPO キーワードを使用して、title フィールドの値に Huawei キーワードまたは OPPO キーワードが含まれている行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone
WHERE QUERY(title, 'Huawei OR OPPO') USE_TIME: 0.03, ROW_COUNT: 2
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
2 | 4388 | Huawei | 5.5 |
4 | 2999 | OPPO | 5.5 |注:
この関数の b パラメータは、HA3 によって提供される query 句の構文パーサーによって解析されます。b パラメータを定数文字列に設定し、ステートメントを実行してクエリを実行する場合、定数文字列を一重引用符 (') で囲まないでください。たとえば、ステートメントの query=Huawei OPPO 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei OPPO') 条件と同じです。query 句で論理演算子を使用する場合は、各定数を一重引用符 (') で囲むことができます。たとえば、ステートメントの query='Huawei' AND 'OPPO' 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei' AND 'OPPO') 条件と同じです。SQL ステートメントの定数文字列の制限の詳細については、「制限」を参照してください。
一般的なエラー
エラータイプ | エラー原因 | 修正 |
関数構文が無効なため、クエリが失敗しました。 | QUERY('pidvid','123:456') | QUERY('pidvid','"123:456"') |
rangevalue
プロトタイプ
float rangevalue(float v, string desc)説明
この関数を使用すると、連続値を離散値に変換できます。
パラメータ:
v: 変換する連続値が格納されているフィールドを指定します。
desc: マッピングルールを記述します。
戻り値
指定された値が指定された離散値に変換された後に返される値。
例
次のステートメントでは、
rangevalue関数を使用して、次のルールに基づいて price フィールドの値を変換します。1000 以下の値は 1.0 に変換され、1000 より大きく 5000 より小さい値は 2.0 に変換され、その他の値は変換されません。SELECT rangevalue(price,'(,1000]:1.0;(1000,5000]:2.0') FROM phone;
range
プロトタイプ
boolean range(INT v, const string rangeDesc) boolean range(FLOAT v, const string rangeDesc) boolean range(DOUBLE v, const string rangeDesc)説明
この関数を使用すると、前方インデックスに対応する v フィールドの値が、rangeDesc パラメータで指定された範囲内にあるかどうかを判断できます。
パラメータ:
v: クエリするデータが格納されているフィールドを指定します。フィールドは単値フィールドである必要があります。
rangeDesc: 値の範囲を指定します。開区間、閉区間、または半閉区間を指定できます。
戻り値
次の表に、この関数のサンプルと対応する戻り値を示します。
サンプル | 戻り値 |
range(v, "[0, 100]") | 0<=v<=100 |
range(v, "(0, 100)") | 0<v<100 |
range(v, "[0, 100)") | 0<=v<100 |
range(v, "(0, 100]") | 0<v<=100 |
range(v, "(0,)") range(v, "(0,]") | 0<v |
range(v, "[0,)") range(v, "[0,]") | 0<=v |
range(v, "(,100)") range(v, "[,100)") | v<100 |
range(v, "(,100]") range(v, "[,100]") | v<=100 |
range(v, "(,)") range(v, "[,]") range(v, "[,)") range(v, "(,]") | true |
注: rangeDesc パラメータの値の前に感嘆符 (!) を付けると、指定された値の範囲の値は返されません。
例
次のステートメントでは、
range関数を使用します。SELECT nid FROM phone where range(price,"(127.0,30.0)") SELECT nid FROM phone where range(price,"!(127.0,30.0)")
normalizescore
プロトタイプ
double normalizescore(INT v, const double defaultScore) double normalizescore(FLOAT v, const double defaultScore) double normalizescore(DOUBLE v, const double defaultScore)説明
この関数を使用すると、v フィールドの値を DOUBLE 型の値に正規化できます。値が初期化されている場合、関数は入力値を返します。値が初期化されていない場合、関数は defaultScore パラメータの値を返します。
パラメータ:
v: クエリするデータが格納されているフィールドを指定します。フィールドは単値フィールドである必要があります。
defaultScore: DOUBLE 型の文字列に変換できる定数文字列を指定します。
戻り値
v フィールドの値が初期化されている場合、関数は入力値を返します。v フィールドの値が初期化されていない場合、関数は defaultScore パラメータの値を返します。
例
次のステートメントでは、normalizescore 関数を使用して、doc1、doc2、および doc3 の price フィールドを正規化します。
doc1: price=1.0
doc2: price= (初期化されていない)
doc3: price=2.0
実行
select normalizescore(price, "1000.0") as normalized_score from phone
USE_TIME: 32.141ms, ROW_COUNT: 2
------------------------------- TABLE INFO ---------------------------
normalized_score(double) |
1.0 |
1000.0 |
2.0. |