ここでは、cast、decode、least、array、split、map などの関数の使用方法について説明します。
CAST
cast(expr as <type>)
式の結果をオブジェクト型に変換します。 たとえば、cast (‘1’ as bigint) を実行すると、String 型の「1」が Bingint 型の「1」に変換されます。 変換が失敗した場合、またはサポート対象外の場合は、例外が発生します。
- cast (double as bigint) を実行すると、Double 型の値が Bigint 型の値に変換されます。
- cast (string as bigint) を実行すると、String 型の値が Bigint 型の値に変換されます。 文字列が整数形式で表現された数字で構成されている場合は、Bigint 型の値に直接変換されます。
- 文字列が浮動形式または指数形式で表現された数値で構成される場合、最初に Double 型の値に変換され、次に Bigint 型の値に変換されます。
- cast(string as datetime) または cast(datetime as string) では、デフォルト形式
yyyy-mm-dd hh:mi:ss
が使用されます。
COALESCE
coalesce(expr1, expr2, ...)
使用法:
リストから NULL ではない最初の値を返します。 リスト内のすべての値が NULL の場合は、NULL が返されます。
パラメーターの説明:
expr: テスト対象の値 これらの値はすべて同じデータ型か、NULL でなければなりません。そうでない場合は、例外が発生します。
戻り値:
DECODE
decode(expression, search, result[, search, result]...[, default])
使用法:
選択関数に if-then-else 分岐を実装します。
- expression: 比較する式。
- search: expression と比較する検索文字列です。
- result: search と expression の値が一致したときに戻す値です。
- default: 任意のパラメーターです。 すべての検索項目が式と一致しない場合は、このデフォルト値が返されます。 指定しない場合は、NULL が返されます。
- 一致した検索レコードが返されます。
- 一致するレコードがない場合は、デフォルト値が返されます。
- デフォルト値が指定されていない場合は、 NULL が返されます。
注
- 少なくとも 3 つのパラメーターを指定しなければなりません。
- 結果のデータ型はすべて同じか NULL でなければなりません。 データ型が一致しない場合は、例外が発生します。 すべての検索と式のデータ型は同じでなければなりません。そうでなければ例外が報告されます。
- デコード中のオプション検索で、レコードが繰り返し一致した場合は、最初の値が返されます。
Select
decode(customer_id,
1, 'Taobao',
2, 'Alipay',
3, 'Aliyun',
Null, 'N/A',
'Others') as result
from sale_detail;
if customer_id = 1 then
result := 'Taobao';
elsif customer_id = 2 then
result := 'Alipay';
elsif customer_id = 3 then
result := 'Aliyun';
...
else
result := 'Others';
end if;
- MaxCompute SQLで NULL = NULL が計算され、NULL が返されますが、DECODE 関数では NULL と NULL の値は同じです。
- 上記の例で、 customer_id の値が NULL の場合、DECODE 関数では N/A が結果として返されます。
GET_IDCARD_AGE
get_idcard_age(idcardno)
使用法:
現在の年と、ID で識別された生年との差である ID 番号に基づいて現在の年齢を返します。
パラメーターの説明:
idcardno: String 型で、15 桁または 18 桁の ID 番号です。 計算では、都道府県コードと最後の桁に従って ID の有効性がチェックされ、チェックが失敗した場合は NULL が返されます。
戻り値:
Bigint 型が返されます。 入力値が NULL の場合、NULL が返されます。 現在の年と誕生年の差が 100 より大きい場合は、NULL が返されます。
GET_IDCARD_BIRTHDAY
get_idcard_birthday(idcardno)
使用法:
ID 番号に基づいて生年月日を返します。
パラメーターの説明:
idcardno: String 型で、15 桁または 18 桁の ID 番号です。 計算では、都道府県コードと最後の桁に従って ID の有効性がチェックされ、チェックが失敗した場合は NULL が返されます。
戻り値:
Datetime 型が返されます。 入力値が NULL の場合、NULL が返されます。
GET_IDCARD_SEX
get_idcard_sex(idcardno)
使用法:
ID 番号に基づいて性別を返します。値は M (男性) または F (女性) です。
パラメーターの説明:
idcardno: String 型で、15 桁または 18 桁の ID 番号です。 計算では、都道府県コードと最後の桁に従って ID の有効性がチェックされ、チェックが失敗した場合は NULL が返されます。
戻り値:
String 型が返されます。 入力値が NULL の場合、NULL が返されます。
GREATEST
greatest(var1, var2, ...)
使用法:
最大の入力パラメータ値を返します。
パラメーターの説明:
var1/var2: Bigint 型、Double 型、Decimal 型、Datetime 型、String 型のいずれかです。 すべての値が NULL の場合は、NULL が返されます。
戻り値:
- 入力パラメータの最大値が返されます。 暗黙の型変換が必要ない場合、戻り値のデータ型は入力パラメータのデータ型と同じになります。
- NULL が最小値です。
入力パラメータのデータ型によって、戻り値は次のようになります。
- Double 型、Bigint 型、Decimal 型、String 型の場合は、Double 型に変換されます。
- String 型と Datetime 型の場合は、Datetime 型に変換されます。
- それ以外の暗黙の変換はできません。
ORDINAL
ordinal(bigint nth, var1, var2, ...)
使用法:
入力変数を小さい順から大きい順にソートした後、「nth」で指定された位置に値を返します。
- nth: Bigint型で、値を返す位置を指定します。 NULL の場合は NULL が返されます。
- var1/var2: Bigint 型、Double 型、Decimal 型、Datetime 型、String 型のいずれかです。
- n 番目のビット値です。 暗黙の型変換が必要ない場合、戻り値のデータ型は入力パラメータのデータ型と同じになります。
- 暗黙の型変換が必要な入力パラメータ値がある場合、
- Double 型、Bigint 型、String 型の場合は、Double 型に変換されます。
- String 型と Datetime 型の場合は、Datetime 型に変換されます。
- それ以外の暗黙の変換はできません。
- NULL は最小値です。
ordinal(3, 1, 3, 2, 5, 2, 4, 6) = 2
LEAST
least(var1, var2, ...)
使用法:
入力パラメータの最小値を返します。
パラメーターの説明:
var1/var2: Bigint 型、Double 型、Decimal 型、Datetime 型、String 型のいずれかです。 すべての値が NULL の場合は、NULL が返されます。
- 入力パラメータの最小値が返されます。暗黙の型変換が必要ない場合、戻されるデータ型は入力パラメータのデータ型と同じになります。
- 暗黙の型変換が必要な入力パラメータ値がある場合
- Double 型、Bigint 型、String 型の場合は、Double 型に変換されます。
- String 型と Datetime 型の場合は、Datetime 型に変換されます。
- Decimal 型が Double 型、Bigint 型、String 型と比較されるときに、Decimal 型に変換されます。
- それ以外の暗黙の変換はできません。
-
NULL は最小値です。
MAX_PT
max_pt(table_full_name)
使用法:
パーティションテーブルの場合、レベル 1 にあるパーティションの最大値が返されます。これはアルファベット順にソートされます。また、そのパーティションに対応するデータファイルがあります。
パラメーターの説明:
table_full_name: String 型。テーブル名を指定します。プロジェクト名と同じでなければいけません (例:prj.src)。 このテーブルに対する読み取り権限を所有している必要があります。
戻り値:
レベル 1 のパーティションの最大値が返されます。
例:
pt =‘20120901’
pt =‘20120902’
select * from tbl where pt=max_pt('myproject.tbl');
alter table を使用して新しいパーティションを追加したが、このパーティションにデータファイルがない場合、このパーティションは返されません。
UUID
string uuid()
使用法:
ランダム IDを返します。 例: 29347a88-1e57-41ae-bb68-a9edbdd94212
SAMPLE
boolean sample(x, y, column_name)
使用法:
x と y の設定に従って column_name のすべての値をサンプリングし、サンプリング条件を満たさない行を除外します。
- x、y: Bigint 型。x 部分へのハッシュを示し、y 番目の部分が読み取られます。 y は省略できます。
- y を省略すると、最初の部分が読み取られます。 パラメーター内で y を省略すると、column_name も同時に無視されます。
- x と y は Bigint 型の定数で、0 より大きい値です。 それ以外のデータ型の場合、または 0 以下の場合は、例外が発生します。 y>, x の場合も、例外が発生します。 x と y のいずれかの入力値が NULL の場合、NULL が返されます。
- column_name: サンプリング対象の列です。
- column_name は省略することができます。その場合、x と y の値に従って、ランダムにサンプルが取得されます。
- 任意のデータ型にすることができ、列値は NULL にすることができます。 暗黙的な型変換は必要ありません。
- column_nameが NULL の場合、例外が報告されます。
戻り値:
Boolean 型。
NULL 値によるデータの偏りを避けるため、column_name に NULL 値があると、 x 部分で一様ハッシュが実行されます。 column_name が追加されていない場合、データサイズが小さいため、出力は必ずしも一様ではありません。 そのため、出力結果を向上させるには、column_name を追加することを推奨します。
例:
select * from tbla where sample (4, 1 , cola) = true;
-- The values are carried out Hash into 4 portions and take the first portion.
select * from tbla where sample (4, 2) = true;
-- The values do random Hash into 4 portions for each row of data and take the second portion.
CASE WHEN EXPRESSION
case
when (_condition1) then result1
when (_condition2) then result2
...
else resultn
end
case
when (_condition1) then result1
when (_condition2) then result2
when (_condition3) then result3
...
else resultn
end
case when 式を使用することで、式の値の計算結果に応じて、柔軟に値を戻すことができます。
select
case
when shop_name is null then 'default_region'
when shop_name like 'hang%' then 'zj_region'
end as region
From sale_detail;
- 結果のデータ型に Bigint 型と Double 型が含まれる場合は、Double 型に変換後、結果が返されます。
- 結果のデータ型に String 型が含まれる場合は、String 型に変換後、結果が返されます。 変換が失敗した場合は、エラーが報告されます (Boolean 型などの場合)。
- それ以外のデータ型の変更は実行できません。
If 式
if(testCondition, valueTrue, valueFalseOrNull)
使用法:
testConditionが真かどうかを判断します。 真の場合は True が返され、偽の場合は valueFalse または Null を返します。
- testCondition: 真偽を判定するための式です。 Boolean 型です。
- valueTrue: 式 testCondition が真の時に返される値です。
- valueFalseOrNull: 式 testCondition が真ではない場合、および NULL の可能性がある場合に返される値です。
戻り値:
戻り値のデータ型は、valueTrue またはvalueFalseOrNu のデータl型と同じです。
select if(1=2,100,200) from dual;
--Returned results:
+ ------------ +
| _c0 |
+------------+
| 200 |
+------------+
SPLIT
split(str, pat)
使用法:STR が Pat で分割された後、配列が返されます。
- str: String 型。分割する文字列を指定します。
- pat: String 型。区切り文字を指定します。正規表現を使用できます。
戻り値:
array <string>
結果は、pat で区切られた str の要素です。
select split("a,b,c",",") from dual;
Results:
+------+
| _c0 |
+------+
| [a, b, c] |
+------+
MaxCompute SQL および MapReduce for MaxCompute 2.0 で利用できる Set コマンドは、次のとおりです。
- SQL 文の実行時に、Tinyint 型、Smallint 型、Int 型、Float 型、Varchar 型、TIMESTAMP BINARY 型のデータが処理の対象になる場合は、
set odps.sql.type.system.odps2=true;
を SQL 文の前に追加する必要があります。 set 文と SQL 文は同時に送信します。 - プロジェクトレベル: 新規データ型をプロジェクトレベルで使用可能にできます。 プロジェクトオーナーが必要に応じて、次のコマンドを使用して、プロジェクトに設定できます。
set odps.sql.type.system.odps2=true;
STR_TO_MAP
関数宣言:
str_to_map(text [, delimiter1 [, delimiter2]])
使用法: ‘delimiter1’ を使って ”text" をキー値ペアに分割し、次に ‘delimiter2’ を使って各キー値ペアを分割します。
パラメータの説明
- text: String 型。分割する文字列を指定します。
- delimiter1: String 型の区切り文字です。指定しない場合、デフォルトは「, 」です。
- delimiter1: String 型の区切り文字です。指定しない場合、デフォルトは「, 」です。
戻り値: map <string, string >. 要素は、文字列 'delimiter1' と 'delimiter2' によって 'text' が分割された後のキー値の結果です。
例:
Select fig ('test1 & 1-test2 & 2 ','-','&');
以下の結果が返されます。
+------------+
| A |
+------------+
| {Test1: 1, Test2: 2} |
EXPLODE
explode(var)
使用法:
- var が Array 型の場合、列に格納されている配列が複数行に変換されます。
- var が Map 型の場合、列に格納されているマップの各キー値のペアは、2 つの列から成る行に変換されます。1 列はキー用、もう 1 列は値用です。
パラメーターの説明:
var: Array<T> 型または Map<K, V> 型です。
戻り値:
- 1 つの select 文では 1 つの UDTF しか指定できず、他の列は指定できません。
- group by、cluster by、distribution by、sort by と一緒には使用できません。
explode(array(null, 'a', 'b', 'c')) col
MAP
MAP map(K key1, V value1, K key2, V value2, ...)
使用法:
特定のキーと値のペアを使って、マップを作成します。
パラメータの説明
- 暗黙的な変換後も含め、すべてのキーのデータ型は一致しており、基本のデータ型でなければなりません。
- 暗黙の型変換後の値も含めて、すべての値のデータ型は一致している必要がありますが、どの型でも構いません。
戻り値:
Map 型が返されます。
例:
+------------+----+----+------------+------------+
| c1 | c2 | c3 | c4 | c5 |
+------------+----+----+------------+------------+
| 1000 | k11 | k21 | 86 | 15 |
| 1001 | k12 | k22 | 97 | 2 |
| 1002 | k13 | k23 | 99 | 1 |
+------------+----+----+------------+------------+
select map(c2,c4,c3,c5) from t_table;
結果は次のとおりです。
+ ---- +
| _c0 |
+------+
| {k11:86, k21:15} |
| {k12:97, k22:2} |
| {k13:99, k23:1} |
+------+
MAP_KEYS
ARRAY map_keys(map<K, V>)
使用法:
map パラメータ内のすべてのキーの配列を返します。
パラメーターの説明:
map:Map 型のデータです。
戻り値:
Array 型が返されます。入力値が NULL の場合、NULL が返されます。
例:
たとえば、t_table_map のフィールドは (c1 bigint,t_map map<string,bigint>
) で、データは次のとおりです。+------------+-------+
| C1 | t_map |
+ ------------ + ------- +
| 1000 | {k11:86, k21:15} |
| 1001 | {k12:97, k22:2} |
| 1002 | {k13:99, k23:1} |
+------------+-------+
次の SQL 文を実行します。
select c1,map_keys(t_map) from t_table_map;
結果は次のとおりです。
+------------+------+
| c1 | _c1 |
+------------+------+
| 1000 | [k11, k21] |
| 1001 | [k12, k22] |
| 1002 | [k13, k23] |
+------------+------+
MAP_VALUES
ARRAY map_values(map<K, V>)
使用法:
map パラメータ内のすべての値の配列を返します。
パラメーターの説明:
map:Map 型のデータです。
戻り値:
Array 型が返されます。入力値が NULL の場合、NULL が返されます。
select map_values(map('a',123,'b',456));
結果:
[123, 456]
ARRAY
ARRAY array(value1,value2, ...)
使用法:
特定の値を使って配列を作成します。
パラメーターの説明:
value: このパラメータは任意のデータ型にできますが、すべての値は同じデータ型にする必要があります。
戻り値:
Array 型が返されます。
例:
たとえば、t_table フィールド (c1 Bigint 型、c2 String 型、c3 String 型、c4 Bigint 型、c5 Bigint 型) に次のデータが格納されているとします。
+------------+----+----+------------+------------+
| c1 | c2 | c3 | c4 | c5 |
+------------+----+----+------------+------------+
| 1000 | k11 | k21 | 86 | 15 |
| 1001 | k12 | k22 | 97 | 2 |
| 1002 | k13 | k23 | 99 | 1 |
+------------+----+----+------------+------------+
次の SQL 文を実行します。
select array(c2,c4,c3,c5) from t_table;
+------+
| _c0 |
+------+
| [k11, 86, k21, 15] |
| [k12, 97, k22, 2] |
| [k13, 99, k23, 1] |
+ ---- +
SIZE
INT size(map)
INT size(array)
size(map<K,V>)
は、特定のマップのキー値ペア―の数を返します。size(array<T>)
は、特定の配列の要素数を返します。
map<K, V>
: Map 型のデータです。array<T>
: Array 型のデータです。
戻り値:
Int 型が返されます。
select size(map('a',123,'b',456)) from dual;--Returns 2
select size(map('a',123,'b',456,'c',789)) from dual;--Returns 3
select size(array('a','b')) from dual;--Returns 2
select size(array(123,456,789)) from dual;--Returns 3
ARRAY_CONTAINS
boolean array_contains(ARRAY<T> a,value v)
使用法:
指定された配列 a に v が含まれているかどうかを調べます。
- a: Array 型のデータです。
- v: 指定された v は、配列内のデータと同じデータ型ータ型でなければなりません。
戻り値:
Boolean 型が返されます。
例:
t_table_array のフィールドが (c1 bigint, t_array array<string>
) で、データが次のとおりだとします。
+ ------------ + --------- +
| c1 | t_array |
+------------+---------+
| 1000 | [k11, 86, k21, 15] |
| 1001 | [k12, 97, k22, 2] |
| 1002 | [k13, 99, k23, 1] |
+------------+---------+
次の SQL 文を実行します。
select c1, array_contains(t_array,'1') from t_table_array;
結果:
+------------+------+
| c1 | _c1 |
+------------+------+
| 1000 | false |
| 1001 | false |
| 1002 | true |
+------------+------+
SORT_ARRAY
ARRAY sort_array(ARRAY<T>)
使用法:
この関数は、指定された配列をソートするために使用します。
パラメーターの説明:
ARRAY<T>
: Array 型のデータで、配列内のデータ型は、どれでも構いません。
戻り値:
Array 型が返されます。
select sort_array(array('a','c','f','b')),sort_array(array(4,5,7,2,5,8)),sort_array(array('You','Me','He')) from dual;
結果:
[a, b, c, f] [2, 4, 5, 5, 7, 8] [He, You, Me]
次の SQL 文を実行します。
Select sort_array (C1), sort_array (C2), sort_array (C3) from t_array;
以下の結果が返されます。
[a, b, c, f] [2, 4, 5, 5, 7, 8] [He, You, Me]
POSEXPLODE
posexplode(ARRAY<T>)
使用法:
指定された配列を分けます。 各値が行に割り当てられ、各行は添字 (0から始まる) と配列要素に対応する2つの列から構成されます。
パラメーターの説明:
ARRAY:Array 型のデータ。配列内のデータは任意の型にできます。
戻り値:
テーブル生成関数が返されます。
select posexplode(array('a','c','f','b')) from dual;
結果:
+------------+-----+
| pos | val |
+------------+-----+
| 0 | a |
| 1 | c |
| 2 | f |
| 3 | b |
+------------+-----+
STRUCT
STRUCT struct(value1,value2, ...)
使用法:
指定された値リストを使って構造体を作成します。
パラメーターの説明:
value: 各値は任意のデータ型にできます。
戻り値:
STRUCT<col1:T1, col2:T2, ... >
が返されます。フィールド名は、col1, col2, … のように順になります。
select struct('a',123,'ture',56.90) from dual;
結果:
{col1:a, col2:123, col3:ture, col4:56.9}
NAMED_STRUCT
STRUCT named_struct(string name1, T1 value1, string name2, T2 value2, ...)
使用法:
指定された名前と値のリストを使って構造体を作成します。
- value: 各値は任意のデータ型にできます。
- name: String 型のフィールド名を指定します。
戻り値:
STRUCT<name1:T1, name2:T2, ... >
型が返されます。 生成される構造体のフィールド名は、name1、name2… のように連続しています。
select named_struct('user_id',10001,'user_name','LiLei','married','F','weight',63.50) from dual;
結果:
{user_id:10001, user_name:LiLei, married:F, weight:63.5}
INLINE
inline(array<struct<f1:T1, f2:T2, ... >>)
下図をご参照ください。
指定された構造体配列を展開します。 各要素には 1 行が与えられ、各構造体要素は各行の 1 列に対応します。
パラメーターの説明:
STRUCT<f1:T1, f2:T2, ... >
: 配列内の値は任意の型にすることができます。
戻り値:
テーブル生成関数が返されます。
例:
t_struct struct<user_id:bigint,user_name:string,married:string,weight:double>
<user_id: bigint,="" user_name:="" string,="" married:="" weight:="" double="">)
の場合、テーブルデータは </user_id:> のようになります。+----------+
| T_struct |
+----------+
{user_id:10001, user_name:LiLei, married:F, weight:63.5}
{user_id:10001, user_name:LiLei, married:F, weight:63.5}
+----------+
次の SQL 文を実行します。
select inline(array(t_struct)) from t_table;
以下の結果が返されます。
+------------+----+----+------------+------------+
| user_id | user_name | married | weight |
+------------+----+----+------------+------------+
| 10001 | LiLei | N | 63.5 |
| 10002 | HanMeiMei | Y | 43.5 |
+------------+-----------+---------+------------+
TRANS_ARRAY
trans_array (num_keys, separator, key1,key2,…,col1, col2,col3) as (key1,key2,…,col1, col2)
使用法:
1 行のデータを複数行に変換し、列内の固定区切り記号形式で区切られた配列を複数行に変換する UDTF です。
- num_keys: Bigint 型の定数。0 以上でなければなりません。 複数行に変換するときに、キーを転置するための列番号として使用されます。
- Key: 1つの行を複数行に変換するときは、複数行にある列を複製します。
- separator: String 型の定数です。 文字列を複数の要素に分割するために使用される区切り文字です。 NULL の場合は例外が発生します。
- keys: 転置するときのキーの列として、 num_keys で指定します。 num_keys がすべての列をキーとして指定されている場合 (つまり、num_keys がすべての列の数に等しい場合)、1 行のみが返されます。
- cols: 行に変換するための配列です。 キーの後のすべての列は転置される配列と見なされます。 String 型です。 格納されているコンテンツは、「Hangzhou; Beijing; shanghai」といった String 形式の配列になります。配列は、「;」で区切られます。
戻り値:
転置行、新しい列名は as で指定されます。 キーとしての列のデータ型は変更されず、他のすべての列は、String 型になります。 分割される行数は、配列に設定された最大数によって異なります。値のないロケールは NULL で補完されます。
- キーと見なされるすべての列を前面に配置し、転置する列を背面に配置する必要があります。
- 1 つの selct 文では1つの UDTF しか指定できず、他の列は指定できません。
- 1 つの selct 文では1つの UDTF しか指定できず、他の列は指定できません。
例:
+----------+----------+------------+
| login_id | login_ip | login_time |
+----------+----------+------------+
wangwangA 192.168.0.1,192.168.0.2 20120101010000,20120102010000
| Wangwangb | 192.168.25.10, 192.168.67.22, 192,168.6. 3 | maid, 20120223080000 |
+----------+----------+------------+
trans_array(1, ",", login_id, login_ip, login_time) as (login_id,login_ip,login_time)
+----------+----------+------------+
| Login_id | login_ip | login_time |
+----------+----------+------------+
| wangwangB | 192.168.45.10 | 20120111010000 |
| wangwangB | 192.168.67.22 | 20120112010000 |
| wangwangB | 192.168.6.3 | 20120223080000 |
| wangwangA | 192.168.0.1 | 20120101010000 |
| wangwangA | 192.168.0.2 | 20120102010000 |
+----------+----------+------------+
Login_id LOGIN_IP LOGIN_TIME
wangwangA 192.168.0.1,192.168.0.2 20120101010000
Login_id Login_ip Login_time
wangwangA 192.168.0.1 20120101010000
wangwangA 192.168.0.2 NULL