コンテンツにスキップ

完全な関数リファレンス

エラー処理

エラーの種類コード発生条件
引数の型エラーERR-02036, ERR-02037非数値を渡した場合、またはPIに引数を渡した場合
実行エラーERR-02317SQRTへの負数入力、MODの0除算、LOGの無効な底/値、EXP/POWERの範囲超過など

入力がNULLなら結果もNULLです。

ABS

数値列の絶対値を実数で返します。

ABS(column_expr)
Mach> CREATE LOG TABLE abs_table (c1 INTEGER, c2 DOUBLE, c3 VARCHAR(10));
Created successfully.

Mach> INSERT INTO abs_table VALUES(1, 1.0, '');
1 row(s) inserted.

Mach> INSERT INTO abs_table VALUES(2, 2.0, 'sqltest');
1 row(s) inserted.

Mach> INSERT INTO abs_table VALUES(3, 3.0, 'sqltest');
1 row(s) inserted.

Mach> SELECT ABS(c1), ABS(c2) FROM abs_table;
SELECT ABS(c1), ABS(c2) from abs_table;
ABS(c1)                     ABS(c2)
-----------------------------------------------------------
3                           3
2                           2
1                           1
[3] row(s) selected.

ADD_TIME

DATETIME列に年/月/日/時/分/秒単位の加減算を行います。ミリ秒、マイクロ秒、ナノ秒単位はサポートしません。Diffの形式は"Year/Month/Day Hour:Minute:Second"で、各項目は正数または負数を使用できます。

ADD_TIME(column,time_diff_format)
Mach> CREATE LOG TABLE add_time_table (id INTEGER, dt DATETIME);
Created successfully.

Mach> INSERT INTO  add_time_table VALUES(1, TO_DATE('1999-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  add_time_table VALUES(2, TO_DATE('2000-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  add_time_table VALUES(3, TO_DATE('2012-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  add_time_table VALUES(4, TO_DATE('2013-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  add_time_table VALUES(5, TO_DATE('2014-12-30 11:22:33 444:555:666'));
1 row(s) inserted.

Mach> INSERT INTO  add_time_table VALUES(6, TO_DATE('2014-12-30 23:22:33 444:555:666'));
1 row(s) inserted.

Mach> SELECT ADD_TIME(dt, '1/0/0 0:0:0') FROM add_time_table;
ADD_TIME(dt, '1/0/0 0:0:0')
----------------------------------
2015-12-30 23:22:33 444:555:666
2015-12-30 11:22:33 444:555:666
2014-11-11 01:02:03 004:005:006
2013-11-11 01:02:03 004:005:006
2001-11-11 01:02:03 004:005:006
2000-11-11 01:02:03 004:005:006
[6] row(s) selected.

Mach> SELECT ADD_TIME(dt, '0/0/0 1:1:1') FROM add_time_table;
ADD_TIME(dt, '0/0/0 1:1:1')
----------------------------------
2014-12-31 00:23:34 444:555:666
2014-12-30 12:23:34 444:555:666
2013-11-11 02:03:04 004:005:006
2012-11-11 02:03:04 004:005:006
2000-11-11 02:03:04 004:005:006
1999-11-11 02:03:04 004:005:006
[6] row(s) selected.

Mach> SELECT ADD_TIME(dt, '1/1/1 0:0:0') FROM add_time_table;
ADD_TIME(dt, '1/1/1 0:0:0')
----------------------------------
2016-01-31 23:22:33 444:555:666
2016-01-31 11:22:33 444:555:666
2014-12-12 01:02:03 004:005:006
2013-12-12 01:02:03 004:005:006
2001-12-12 01:02:03 004:005:006
2000-12-12 01:02:03 004:005:006
[6] row(s) selected.

Mach> SELECT ADD_TIME(dt, '-1/0/0 0:0:0') FROM add_time_table;
ADD_TIME(dt, '-1/0/0 0:0:0')
----------------------------------
2013-12-30 23:22:33 444:555:666
2013-12-30 11:22:33 444:555:666
2012-11-11 01:02:03 004:005:006
2011-11-11 01:02:03 004:005:006
1999-11-11 01:02:03 004:005:006
1998-11-11 01:02:03 004:005:006
[6] row(s) selected.

Mach> SELECT ADD_TIME(dt, '0/0/0 -1:-1:-1') FROM add_time_table;
ADD_TIME(dt, '0/0/0 -1:-1:-1')
----------------------------------
2014-12-30 22:21:32 444:555:666
2014-12-30 10:21:32 444:555:666
2013-11-11 00:01:02 004:005:006
2012-11-11 00:01:02 004:005:006
2000-11-11 00:01:02 004:005:006
1999-11-11 00:01:02 004:005:006
[6] row(s) selected.

Mach> SELECT ADD_TIME(dt, '-1/-1/-1 0:0:0') FROM add_time_table;
ADD_TIME(dt, '-1/-1/-1 0:0:0')
----------------------------------
2013-11-29 23:22:33 444:555:666
2013-11-29 11:22:33 444:555:666
2012-10-10 01:02:03 004:005:006
2011-10-10 01:02:03 004:005:006
1999-10-10 01:02:03 004:005:006
1998-10-10 01:02:03 004:005:006
[6] row(s) selected.

Mach> SELECT * FROM add_time_table WHERE dt > ADD_TIME(TO_DATE('2014-12-30 11:22:33 444:555:666'), '-1/-1/-1 0:0:0');
ID          DT
-----------------------------------------------
6           2014-12-30 23:22:33 444:555:666
5           2014-12-30 11:22:33 444:555:666
[2] row(s) selected.

Mach> SELECT * FROM add_time_table WHERE dt > ADD_TIME(TO_DATE('2014-12-30 11:22:33 444:555:666'), '-1/-2/-1 0:0:0');
ID          DT
-----------------------------------------------
6           2014-12-30 23:22:33 444:555:666
5           2014-12-30 11:22:33 444:555:666
4           2013-11-11 01:02:03 004:005:006
[3] row(s) selected.

Mach> SELECT ADD_TIME(TO_DATE('2000-12-01 00:00:00 000:000:001'), '-1/0/0 0:0:-1') FROM add_time_table;
ADD_TIME(TO_DATE('2000-12-01 00:00:00 000:000:001'), '-1/0/0 0:0:-1')
------------------------------------------
1999-11-30 23:59:59 000:000:001
1999-11-30 23:59:59 000:000:001
1999-11-30 23:59:59 000:000:001
1999-11-30 23:59:59 000:000:001
1999-11-30 23:59:59 000:000:001
1999-11-30 23:59:59 000:000:001
[6] row(s) selected.

Mach> SELECT * FROM add_time_table WHERE dt > ADD_TIME(TO_DATE('2014-12-30 11:22:33 444:555:666'), '-1/-2/-1 0:0:0');
ID          DT
-----------------------------------------------
6           2014-12-30 23:22:33 444:555:666
5           2014-12-30 11:22:33 444:555:666
4           2013-11-11 01:02:03 004:005:006
[3] row(s) selected.

APPROX_PERCENTILE

APPROX_PERCENTILE
APPROX_MEDIAN
APPROX_P05
APPROX_P10
APPROX_P90
APPROX_P95

これらの関数は、元の値をすべてソートせず、サイズを制限した要約情報を保持して分位点を近似します。入力データ量が非常に多く、わずかな誤差を許容できる場合に便利です。

APPROX_PERCENTILE(value, ratio)
APPROX_MEDIAN(value)
APPROX_P05(value)
APPROX_P10(value)
APPROX_P90(value)
APPROX_P95(value)
  • valueは数値型である必要があります。
  • ratio0.0以上1.0以下の定数である必要があります。
  • 戻り値の型はDOUBLEです。
  • NULL値は無視します。

APPROX_MEDIAN(value)は近似中央値です。APPROX_P05APPROX_P10APPROX_P90APPROX_P95はよく使う分位点の短縮形です。

SELECT APPROX_PERCENTILE(latency_ms, 0.95) AS ap95,
       APPROX_MEDIAN(latency_ms) AS amedian,
       APPROX_P05(latency_ms) AS ap05
FROM api_log;

ARRAY_LENGTH

ARRAY_LENGTH(array_value)は非NULLのARRAYの宣言された要素数(cardinality)を返します。

SELECT ARRAY_LENGTH(ARRAY[10, NULL, 30]);
-- 3

全要素がNULLでもcardinalityを返します。配列全体がNULLならNULLを返し、型情報のないARRAY_LENGTH(NULL)はエラーになります。ARRAYの構文と制約の詳細は数値ARRAY型を参照してください。

ARRAY_SPARSE

ARRAY_SPARSEは固定長ARRAYで値のある位置だけを指定します。位置は0始まりで、省略した位置は要素のNULLになります。

-- 対象列で型とcardinalityを決定します。
INSERT INTO sensor_array (id, channels)
VALUES (1, ARRAY_SPARSE(0 => 10, 3 => 40));

-- 対象列のない式では型とcardinalityを明示します。
SELECT ARRAY_SPARSE(INT32[4], 0 => 10, 3 => 40);

-- 角括弧の省略形は最大position + 1からcardinalityを推論します。
SELECT [1 => 12, 33 => 23];

角括弧の省略形は、対象ARRAYがあればその型とcardinalityを使用します。単独の式では密なARRAYと同じ共通数値型を使用し、最大positionに1を加えてcardinalityを決定します。対象列のない全要素NULLの疎な配列、重複したposition、範囲外のpositionはエラーです。取り込み方法とSDKの疎なオブジェクトはSparse ARRAYと選択列Append APIを参照してください。

AREA

AREA(y, x)は数値の(x, y)点からなる曲線の下の面積を正確に計算する集約関数です。

AREA(y, x)
  • 両方の引数が数値型である必要があります。
  • どちらかがNULLの行は無視します。
  • 有効な点が2つ未満なら結果はNULLです。
  • 戻り値の型はDOUBLEです。
SELECT AREA(power_kw, sample_sec)
FROM power_log;

AVG

数値列の平均値を返す集約関数です。

AVG(column_name)
Mach> CREATE LOG TABLE avg_table (id1 INTEGER, id2 INTEGER);
Created successfully.

Mach> INSERT INTO avg_table VALUES(1, 1);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(1, 2);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(1, 3);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(2, 1);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(2, 2);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(2, 3);
1 row(s) inserted.

Mach> INSERT INTO avg_table VALUES(null, 4);
1 row(s) inserted.

Mach> SELECT id1, AVG(id2) FROM avg_table GROUP BY id1;
id1         AVG(id2)
-------------------------------------------
2                2
NULL             4
1                2

BITAND / BITOR

2つの整数値を64ビット符号付き整数へ変換し、ビット単位のAND/OR演算の結果を返します。入力は整数型である必要があり、出力も64ビット符号付き整数です。

0未満の整数ではプラットフォームによって結果が異なる場合があるため、uintegerとushort型のみの使用を推奨します。

BITAND (<expression1>, <expression2>)
BITOR (<expression1>, <expression2>)
Mach> CREATE LOG TABLE bit_table (i1 INTEGER, i2 UINTEGER, i3 FLOAT, i4 DOUBLE, i5 SHORT, i6 VARCHAR(10));
Created successfully.

Mach> INSERT INTO bit_table VALUES (-1, 1, 1, 1, 2, 'aaa');
1 row(s) inserted.

Mach> INSERT INTO bit_table VALUES (-2, 2, 2, 2, 3, 'bbb');
1 row(s) inserted.

Mach> SELECT BITAND(i1, i2) FROM bit_table;
BITAND(i1, i2)
-----------------------
2
1
[2] row(s) selected.

Mach> SELECT * FROM bit_table WHERE BITAND(i2, 1) = 1;
I1          I2          I3                          I4                          I5          I6
---------------------------------------------------------------------------------------------------------------
-1          1           1                           1                           2           aaa
[1] row(s) selected.

Mach> SELECT BITOR(i5, 1) FROM bit_table WHERE BITOR(i5, 1) = 3;
BITOR(i5, 1)
-----------------------
3
3
[2] row(s) selected.

Mach> SELECT * FROM bit_table WHERE BITOR(i2, 1) = 1;
I1          I2          I3                          I4                          I5          I6
---------------------------------------------------------------------------------------------------------------
-1          1           1                           1                           2           aaa
[1] row(s) selected.

Mach> SELECT * FROM bit_table WHERE BITAND(i3, 1) = 1;
I1          I2          I3                          I4                          I5          I6
---------------------------------------------------------------------------------------------------------------
[ERR-02037 : Function [BITAND] argument data type is mismatched.]
[0] row(s) selected.

Mach> SELECT * FROM bit_table WHERE BITAND(i4, 1) = 1;
I1          I2          I3                          I4                          I5          I6
---------------------------------------------------------------------------------------------------------------
[ERR-02037 : Function [BITAND] argument data type is mismatched.]
[0] row(s) selected.

Mach> SELECT BITAND(i5, 1) FROM bit_table WHERE BITAND(i5, 1) = 1;
BITAND(i5, 1)
-----------------------
1
[1] row(s) selected.

Mach> SELECT * FROM bit_table WHERE BITOR(i6, 1) = 1;
I1          I2          I3                          I4                          I5          I6
---------------------------------------------------------------------------------------------------------------
[ERR-02037 : Function [BITOR] argument data type is mismatched.]
[0] row(s) selected.

Mach> SELECT BITOR(i1, i2) FROM bit_table;
BITOR(i1, i2)
-----------------------
-2
-1
[2] row(s) selected.

Mach> SELECT BITAND(i1, i3) FROM bit_table;
BITAND(i1, i3)
-----------------------
[ERR-02037 : Function [BITAND] argument data type is mismatched.]
[0] row(s) selected.

Mach> SELECT BITOR(i1, i6) FROM bit_table;
BITOR(i1, i6)
-----------------------
[ERR-02037 : Function [BITOR] argument data type is mismatched.]
[0] row(s) selected.

CAST

Machbase 8.7.0以降でサポート

CASTは値、列、式を指定したデータ型へ明示的に変換します。SELECT、述語、CASEUNION ALL、VIEW定義、プリペアドステートメントで使用できます。

構文

CAST(expression AS data_type)
CAST(expression AS data_type(length))
CAST(expression AS DECIMAL(precision[, scale]))
CAST(array_expression AS numeric_type[cardinality])
CAST(array_expression AS DECIMAL(precision[, scale])[cardinality])
  • expressionは変換する値、列、SQL式です。
  • array_expressionは数値ARRAYまたはSQL NULLです。
  • data_typeは次の表の変換先の型または別名です。
  • 型名は大文字小文字を区別しません。
  • lengthprecisionscaleは変換先の型で許可する場合のみ指定できます。
  • ARRAYの入力と変換先のcardinalityは完全に一致する必要があります。

対応する型と別名

分類変換先の型使用できる名前
符号付き整数16ビットINT16, SHORT
32ビットINT32, INT, INTEGER
64ビットINT64, LONG
符号なし整数16ビットUINT16, USHORT
32ビットUINT32, UINTEGER
64ビットUINT64, ULONG
実数単精度・倍精度FLOAT, DOUBLE
固定小数点DECIMALDECIMAL, NUMERIC, DEC, FIXED, NUMBER
文字固定長・可変長CHAR, VARCHAR
文字LOBテキストTEXT, CLOB
日付と時刻ナノ秒精度DATETIME
ネットワークアドレスIPアドレスIPV4, IPV6
バイナリバイナリ・バイナリLOBBINARY, BLOB
ドキュメントJSONJSON

同じ行の名前は同じ型として動作します。例えばINTEGERINTINT32はいずれも32ビット符号付き整数です。結果列の型メタデータには標準型名が表示される場合があります。

長さと精度

CHAR, VARCHAR, BINARY

長さ省略時のデフォルト値許容する長さ長さ超過時の処理
CHAR(n)1 byte1~32,767 byte先頭からn byteを保持
VARCHAR(n)32,767 byte1~32,767 byte先頭からn byteを保持
BINARY(n)1 byte1~67,108,864 byte先頭からn byteを保持

長さは文字数ではなくバイト数です。UTF-8文字列の変換ではマルチバイト文字が途中で切れる場合があるため、十分な長さを指定してください。CHARは余った領域を空白で埋めません。CAST(... AS CHAR(n))の結果メタデータは現在VARCHAR(n)と表示されます。

SELECT '[' || CAST('abc' AS CHAR) || ']' AS char_default;
-- [a]

SELECT '[' || CAST('abc' AS CHAR(5)) || ']' AS char_value;
-- [abc](空白を追加しない)

SELECT CAST('abcdef' AS VARCHAR(3)) AS varchar_value;
-- abc

SELECT CAST('414243' AS BINARY(2)) AS binary_value;
-- 4142

TEXTCLOBBLOBJSONにはlengthを指定できません。これらの型のCAST結果は現在最大32,767 byteをサポートします。許容長を超えて結果の意味が損なわれる場合は、自動で切り詰めずエラーを返します。

DECIMAL

構文解釈
DECIMALDECIMAL(10,0)
DECIMAL(p)DECIMAL(p,0)
DECIMAL(p,s)precision p, scale s
  • precision p1~65です。
  • scale s0~30で、precisionを超えることはできません。
  • 入力値の小数桁数がscaleを超える場合、中間値を0から遠ざかる方向へ丸めます。
  • DECIMAL系以外の型にはprecisionやscaleを指定できません。
SELECT CAST('12.34' AS DECIMAL(5,2));
-- 12.34

SELECT CAST(123.456 AS NUMERIC(6,2));
-- 123.46

NULLと空文字列

  • 入力がNULLなら変換先の型のNULLを返します。
  • Machbaseは長さ0の文字列リテラル''をSQL NULLとして扱います。
  • ''''は単一引用符1文字を表す文字列であり、空文字列ではありません。
SELECT CAST(NULL AS INTEGER) AS null_integer;
SELECT CAST('' AS VARCHAR(10)) AS empty_value;
SELECT CAST('''' AS VARCHAR(10)) AS quote_value;

数値変換

数値型同士の変換や、数値として解釈できる文字列から数値型への変換ができます。

SELECT CAST('123' AS INTEGER);
SELECT CAST('1.25' AS DOUBLE);
SELECT CAST(12.9 AS SHORT);       -- 12
SELECT CAST(-12.9 AS INTEGER);    -- -12
SELECT CAST('9223372036854775806e0' AS LONG);
  • 実数から整数への変換では、小数部を丸めず0方向へ切り捨てます。
  • 整数文字列の指数表記も整数精度を維持して解釈します。
  • 変換先の型の範囲外の値はエラーです。
  • 符号なし整数への変換では負数の結果は許可しません。小数部を切り捨てた結果が0になる値は、0に変換できます。
  • NaN、正の無限大、負の無限大は整数へ変換できません。

CASTで生成できる整数の範囲は次のとおりです。各型のNULL予約値は有効な結果範囲には含まれません。

変換先の型CAST結果の範囲
INT16, SHORT-32,767~32,767
UINT16, USHORT0~65,534
INT32, INT, INTEGER-2,147,483,647~2,147,483,647
UINT32, UINTEGER0~4,294,967,294
INT64, LONG-9,223,372,036,854,775,807~9,223,372,036,854,775,807
UINT64, ULONG0~18,446,744,073,709,551,614

数値ARRAY全体の変換

同じcardinalityの数値ARRAYは全要素の型を変換できます。変換先にはINT16UINT16INT32UINT32INT64UINT64FLOATDOUBLEDECIMALと、対応する型の表の数値別名を使用します。

SELECT CAST([1.9, NULL, -3.9] AS INT32[3]);
SELECT CAST([1.235, NULL, -2.345] AS DECIMAL(6,2)[3]);
  • 配列全体のNULLは変換後も配列全体のNULLです。
  • 要素のNULLは同じ位置の要素のNULLとして保持します。
  • 各非NULL要素には、対応するスカラー数値CASTの切り捨て、丸め、範囲の規則を適用します。
  • 1つでも変換できない要素があればCASTとそれを含む文全体が失敗します。変換済みの一部の要素や行を結果として残しません。
  • DECIMAL[N]DECIMAL(10,0)[N]DECIMAL(p)[N]DECIMAL(p,0)[N]として扱います。

プリペアドステートメントでもCASTの変換先がパラメーターの要素型、cardinality、DECIMALのprecision/scaleを決定します。同じステートメントに密なARRAY、疎なARRAY、配列全体のNULLを再バインドできます。

SELECT CAST(? AS INT32[3]);
SELECT CAST(? AS DECIMAL(12,4)[3]);

スカラーからARRAYへの展開やARRAYからスカラーへの縮小はできません。異なるcardinality間で埋め合わせや切り詰めは行わず、文字列、日付、IP、BINARY、JSONのARRAYを変換先に指定することはできません。

文字列とLOBの変換

数値、日付と時刻、IPアドレス、バイナリ、JSONを文字型へ変換できます。

  • 整数とDECIMALは値の10進表現を返します。
  • FLOATは最大9桁、DOUBLEは最大17桁の有効数字で表します。
  • DATETIMEはセッションの日付形式とタイムゾーンに従って文字列化します。
  • IPV4IPV6は標準化されたアドレス文字列で表します。
  • BINARYBLOBは接頭辞なしの大文字16進文字列で表します。
  • JSONは元のJSON表現を維持します。
SELECT CAST(123456 AS VARCHAR(8));
-- 123456

SELECT CAST(CAST('2001:db8::1' AS IPV6) AS VARCHAR(64));

SELECT CAST(CAST('0x00ff10' AS BLOB) AS VARCHAR(8));
-- 00FF10

文字列からBINARYまたはBLOBへの変換には、接頭辞なしの偶数長16進数、または0x/0X接頭辞付きの偶数長16進数を使用します。

SELECT CAST('414243' AS BINARY(3));
SELECT CAST('0x00ff10' AS BLOB);
SELECT CAST(X'414243' AS VARCHAR(6));

BINARY(n)は先頭からn byteのみを保持します。16進数以外の文字や奇数長の16進数はエラーです。

DATETIME変換

文字列または数値をDATETIMEへ変換できます。

  • 文字列はセッションのデフォルトの日付形式とタイムゾーンで解釈します。
  • 数値はUnix epochからのナノ秒数として解釈します。
  • 数値-1はDATETIMEのNULL表示用予約値のため変換できません。
  • DATETIMEから数値へ変換すると、Unix epochからのナノ秒値を返します。
SELECT CAST('2026-08-15 12:34:56' AS DATETIME);
SELECT CAST(1000000000 AS DATETIME);
SELECT CAST(CAST(1000000000 AS DATETIME) AS VARCHAR(40));

同じepoch値でも、セッションのタイムゾーンが異なれば文字列表示される日付と時刻が異なる場合があります。

IPV4とIPV6への変換

文字列をIPV4またはIPV6へ変換できます。アドレス全体が正しい形式である必要があります。

SELECT CAST('127.0.0.1' AS IPV4);
SELECT CAST('2001:db8::1' AS IPV6);

無効なアドレスや、変換先の型に一致しないアドレス形式はエラーです。

JSON変換

文字列をJSONへ変換するには、入力全体が有効なJSONである必要があります。オブジェクトと配列に加えて、JSON文字列、数値、truefalsenullも使用できます。

SELECT CAST('{"ok":true}' AS JSON);
SELECT CAST('[1,2,3]' AS JSON);
SELECT CAST('"abc"' AS JSON);
SELECT CAST(CAST('"abc"' AS JSON) AS VARCHAR(16));
-- "abc"

一部のみ有効なJSONや、末尾にJSON以外の文字が残る入力は変換できません。

式と結果メタデータ

CASTは通常のSQL式のため、WHERE条件、CASEUNION ALL、VIEW定義でも使用できます。

SELECT CASE
         WHEN reading >= 0 THEN CAST(reading AS VARCHAR(32))
         ELSE 'invalid'
       END AS reading_text
  FROM sensor_log;

CREATE VIEW sensor_cast_view AS
SELECT CAST(sensor_id AS VARCHAR(100)) AS sensor_id_text,
       CAST(value AS DECIMAL(12,3)) AS value_decimal
  FROM sensor_log;

プリペアドステートメントでもCAST構文は同じです。入力値は?またはSDKの名前付きマーカーで渡し、変換先の型とprecision/scaleはSQLで宣言します。

SELECT CAST(? AS DECIMAL(12,2)) AS amount;

CAST結果の型、バイト長、DECIMALのprecisionとscaleは、結果メタデータとVIEW列情報に反映されます。結果のNULL許容性は入力式のNULL許容性に従います。

CASEUNION ALLでARRAY結果を組み合わせるには、要素型、cardinality、DECIMALのprecision/scaleがすべて一致する必要があります。異なる場合は、各結果を明示的に同じARRAY型へCASTしてから組み合わせます。

各SDKは既存の結果メタデータAPIでCAST結果を確認します。CAST専用のSDK APIは提供しません。

SDKCAST結果メタデータAPI
Machbase SQLCLISQLDescribeCol(), SQLColAttribute()
ODBCSQLDescribeCol(), SQLColAttribute()
JDBCResultSetMetaData
Pythoncursor.description
Node.jsColumnMeta
.NETGetSchemaTable()
Go (native)native column metadata
Go (database/sql)ColumnTypeNullable() および ColumnType API

エラーが発生する場合

原因
非対応の変換先の型CAST('1' AS UNKNOWN_TYPE)
許容されないlengthまたはprecision/scaleCAST('1' AS INTEGER(2)), CAST('1' AS DECIMAL(2,3))
数値の範囲超過またはNULL予約値CAST('65535' AS USHORT)
符号なし整数へ変換する負数CAST('-1' AS UINTEGER)
数値へ変換できない文字列CAST('12x' AS INTEGER)
スカラーとARRAY間の変換CAST(1 AS INT32[1]), CAST([1] AS INT32)
ARRAYのcardinality不一致CAST([1, 2] AS INT32[3])
非対応のARRAY変換先の型CAST([1] AS VARCHAR[1])
無効なIPアドレスCAST('999.1.1.1' AS IPV4)
奇数長または16進数以外のバイナリ文字列CAST('123' AS BINARY(4)), CAST('GG' AS BLOB)
無効なJSONCAST('{bad}' AS JSON)
許容サイズを超えるLOBまたはJSON結果32,767 byteを超える TEXT, CLOB, BLOB, JSON 結果

互換性

CAST関数と数値ARRAY全体のCASTはMachbase 8.7.0でサポートします。Standard EditionとCluster Editionで使用できます。Cluster Editionでは、全ノードをCASTに対応した同じバージョンにそろえる必要があります。CASTに非対応の旧ノードとの混在実行はサポートしません。

関連ドキュメント

COUNT

列のレコード数を求める集約関数です。

COUNT(column_name)
Mach> CREATE LOG TABLE count_table (id1 INTEGER, id2 INTEGER);
Created successfully.

Mach> INSERT INTO count_table VALUES(1, 1);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(1, 2);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(1, 3);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(2, 1);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(2, 2);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(2, 3);
1 row(s) inserted.

Mach> INSERT INTO count_table VALUES(null, 4);
1 row(s) inserted.

Mach> SELECT COUNT(*) FROM count_table;
COUNT(*)
-----------------------
7
[1] row(s) selected.

Mach> SELECT COUNT(id1) FROM count_table;
COUNT(id1)
-----------------------
6
[1] row(s) selected.

CUME_DIST

CUME_DIST(value, threshold)は、valuethreshold以下の行の累積比率を返します。

CUME_DIST(value, threshold)
  • ウィンドウ関数ではなく集約関数です。
  • 両方の引数が数値型である必要があります。
  • thresholdは定数である必要があります。
  • 戻り値は0.0以上1.0以下のDOUBLEです。
SELECT CUME_DIST(latency_ms, 100)
FROM api_log;

CURRENT_USER / SESSION_USER / CURRENT_USER_ID / SESSION_USER_ID

Machbase 8.7.0以降でサポート

現在のSQL実行に適用される実効権限ユーザーと接続セッションユーザーを、名前または内部IDで参照します。Standard EditionとCluster Editionの両方でサポートします。

関数戻り値の型説明
CURRENT_USER()VARCHAR現在のSQL実行に適用する実効権限ユーザー名
SESSION_USER()VARCHAR現在の接続セッションの認証ユーザー名
CURRENT_USER_ID()INTEGER実効権限ユーザーの内部ID
SESSION_USER_ID()INTEGER認証セッションユーザーの内部ID

4つの関数は引数を取らず、括弧を付けて呼び出します。括弧なしのCURRENT_USERキーワードや、USERSYSTEM_USERCURRENT_SCHEMAの別名はサポートしません。

SELECT CURRENT_USER() AS current_name,
       SESSION_USER() AS session_name,
       CURRENT_USER_ID() AS current_id,
       SESSION_USER_ID() AS session_id;

通常のSQLでは、current userとsession userは同じです。

CURRENT_NAME  SESSION_NAME  CURRENT_ID  SESSION_ID
SYS           SYS           1           1

VIEWのユーザーコンテキスト

別のユーザーが所有する定義者権限のVIEWを参照すると、VIEW内部のSQLは所有者の権限で実行されます。

  • CURRENT_USER()CURRENT_USER_ID()はVIEW所有者を返します。
  • SESSION_USER()SESSION_USER_ID()はVIEWを呼び出した接続セッションユーザーを返します。

再現可能な所有者/呼び出し元の例は、VIEW構文を参照してください。

ユーザーが削除されたアクティブセッション

別の管理者セッションが現在接続中のユーザーをDROP USERしても、既存の接続は即座には終了しません。既存セッションの4つの関数は、ログイン時に保持したユーザー名とIDを返し続けます。削除されたユーザーは新規接続できず、M$SYS_USERSにも表示されません。

ユーザーIDはMachbaseメタデータの内部識別子です。長期保存する業務用ユーザーキーとして使用せず、現在のメタデータの比較や結合にのみ使用します。

SELECT COUNT(*)
  FROM M$SYS_USERS
 WHERE NAME = SESSION_USER()
   AND USER_ID = SESSION_USER_ID();

エラー

関数に引数を渡すとERR-02036を返します。他の3つの関数も同じ規則を適用します。

SELECT CURRENT_USER(1);
-- ERR-02036: Function [CURRENT_USER] has an invalid argument.

関連するアカウントのライフサイクルはアカウント管理を参照してください。

DATE_TRUNC

DATETIME値を指定時間単位に切り捨てて返します。

DATE_TRUNC (field, date_val [, count])
Mach> CREATE LOG TABLE trunc_table (i1 INTEGER, i2 DATETIME);
Created successfully.

Mach> INSERT INTO trunc_table VALUES (1, TO_DATE('1999-11-11 1:2:0 4:5:1'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (2, TO_DATE('1999-11-11 1:2:0 5:5:2'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (3, TO_DATE('1999-11-11 1:2:1 6:5:3'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (4, TO_DATE('1999-11-11 1:2:1 7:5:4'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (5, TO_DATE('1999-11-11 1:2:2 8:5:5'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (6, TO_DATE('1999-11-11 1:2:2 9:5:6'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (7, TO_DATE('1999-11-11 1:2:3 10:5:7'));
1 row(s) inserted.

Mach> INSERT INTO trunc_table VALUES (8, TO_DATE('1999-11-11 1:2:3 11:5:8'));
1 row(s) inserted.

Mach> SELECT COUNT(*), DATE_TRUNC('second', i2) tm FROM trunc_table group by tm ORDER BY 2;
COUNT(*)             tm
--------------------------------------------------------
2                    1999-11-11 01:02:00 000:000:000
2                    1999-11-11 01:02:01 000:000:000
2                    1999-11-11 01:02:02 000:000:000
2                    1999-11-11 01:02:03 000:000:000
[4] row(s) selected.

Mach> SELECT COUNT(*), DATE_TRUNC('second', i2, 2) tm FROM trunc_table group by tm ORDER BY 2;
COUNT(*)             tm
--------------------------------------------------------
4                    1999-11-11 01:02:00 000:000:000
4                    1999-11-11 01:02:02 000:000:000
[2] row(s) selected.

Mach> SELECT COUNT(*), DATE_TRUNC('nanosecond', i2, 2) tm FROM trunc_table group by tm ORDER BY 2;
COUNT(*)             tm
--------------------------------------------------------
1                    1999-11-11 01:02:00 004:005:000
1                    1999-11-11 01:02:00 005:005:002
1                    1999-11-11 01:02:01 006:005:002
1                    1999-11-11 01:02:01 007:005:004
1                    1999-11-11 01:02:02 008:005:004
1                    1999-11-11 01:02:02 009:005:006
1                    1999-11-11 01:02:03 010:005:006
1                    1999-11-11 01:02:03 011:005:008
[8] row(s) selected.

Mach> SELECT COUNT(*), DATE_TRUNC('nsec', i2, 1000000000) tm FROM trunc_table group by tm ORDER BY 2; //Same as DATE_TRUNC('sec', i2, 1)
COUNT(*)             tm
--------------------------------------------------------
2                    1999-11-11 01:02:00 000:000:000
2                    1999-11-11 01:02:01 000:000:000
2                    1999-11-11 01:02:02 000:000:000
2                    1999-11-11 01:02:03 000:000:000
[4] row(s) selected.

時間単位別に許容する範囲は次のとおりです。

  • nanosecond、microsecond、millisecond単位とその略称は5.5.6以降で使用できます。
  • weekは日曜日から始まります。
時間単位時間範囲
nanosecond (nsec)1000000000 (1 second)
microsecond (usec)60000000 (60 seconds)
millisecond (msec)60000 (60 seconds)
second (sec)86400 (1 day)
minute (min)1440 (1 day)
hour24 (1 day)
day1
week1
month1
year1

例えばDATE_TRUNC(‘second’, time, 120)の結果は2分単位となり、DATE_TRUNC(‘minute’, time, 2)と同じです。

DATE_BIN

指定した基準時刻originを基点に、DATETIME値をtime unittime rangeの区間(bin)に割り当てます。

DATE_BIN(field, count, source [, origin])
  • originを指定すると、その時刻を基点にバケットを計算します。
  • originを省略すると、サーバーのローカルタイムゾーンの1970-01-01 00:00:00を基点に計算します。
  • countは1以上の整数である必要があります。

DATE_TRUNC()ROLLUP()と同じローカルタイムゾーンの境界にそろえるには、originを省略した3引数形式を使用します。サーバーのタイムゾーンに関係なく常に同じ境界を使用するには、4引数形式でoriginを明示してください。

例えばサーバーのタイムゾーンがUTC+09:00の場合、従来はDATE_BIN(..., 0)の代わりにタイムゾーン補正済みのorigin値を直接指定してローカル時刻の境界にそろえる必要がありました。現在はDATE_BIN(field, count, source)だけで同じ結果を得られます。

Mach> CREATE LOG TABLE log (time DATETIME);
Created successfully.

Mach> INSERT INTO log VALUES (TO_DATE('2000-01-01 00:00:00'));
1 row(s) inserted.

Mach> INSERT INTO log VALUES (TO_DATE('2000-01-01 01:00:00'));
1 row(s) inserted.

Mach> INSERT INTO log VALUES (TO_DATE('2000-01-01 02:00:00'));
1 row(s) inserted.

Mach> INSERT INTO log VALUES (TO_DATE('2000-01-01 03:00:00'));
1 row(s) inserted.

Mach> INSERT INTO log VALUES (TO_DATE('2000-01-01 04:00:00'));
1 row(s) inserted.

Mach> SELECT TIME, DATE_BIN('hour', 2, time, TO_DATE('2020-01-01 00:00:00')) FROM log ORDER BY time;
TIME                            DATE_BIN('hour', 2, time, TO_DATE('2020-01-01 00:00:00'))
---------------------------------------------------------------------------------------------
2000-01-01 00:00:00 000:000:000 2000-01-01 00:00:00 000:000:000
2000-01-01 01:00:00 000:000:000 2000-01-01 00:00:00 000:000:000
2000-01-01 02:00:00 000:000:000 2000-01-01 02:00:00 000:000:000
2000-01-01 03:00:00 000:000:000 2000-01-01 02:00:00 000:000:000
2000-01-01 04:00:00 000:000:000 2000-01-01 04:00:00 000:000:000
[5] row(s) selected.

ローカルタイムゾーンの境界でバケットを計算する例は次のとおりです。

Mach> CREATE LOG TABLE t3521 (ts DATETIME);
Created successfully.

Mach> INSERT INTO t3521 VALUES (TO_DATE('2000-01-01 00:30:00'));
1 row(s) inserted.

Mach> INSERT INTO t3521 VALUES (TO_DATE('2000-01-01 02:59:59'));
1 row(s) inserted.

Mach> INSERT INTO t3521 VALUES (TO_DATE('2000-01-01 03:00:00'));
1 row(s) inserted.

Mach> INSERT INTO t3521 VALUES (TO_DATE('2000-01-01 08:00:00'));
1 row(s) inserted.

Mach> SELECT ts,
             DATE_BIN('hour', 3, ts) AS date_bin_3arg,
             DATE_TRUNC('hour', ts, 3) AS date_trunc_3arg
        FROM t3521
    ORDER BY ts;
ts                              date_bin_3arg                   date_trunc_3arg
----------------------------------------------------------------------------------------------------
2000-01-01 00:30:00 000:000:000 2000-01-01 00:00:00 000:000:000 2000-01-01 00:00:00 000:000:000
2000-01-01 02:59:59 000:000:000 2000-01-01 00:00:00 000:000:000 2000-01-01 00:00:00 000:000:000
2000-01-01 03:00:00 000:000:000 2000-01-01 03:00:00 000:000:000 2000-01-01 03:00:00 000:000:000
2000-01-01 08:00:00 000:000:000 2000-01-01 06:00:00 000:000:000 2000-01-01 06:00:00 000:000:000
[4] row(s) selected.

時間単位別の許容範囲は次のとおりです。

  • nanosecond、microsecond、millisecond単位とその略称は5.5.6以降で使用できます。
  • weekは7日と同じです。
時間単位
nanosecond (nsec)
microsecond (usec)
millisecond (msec)
second (sec)
minute (min)
hour
day
week
month
year

DAYOFWEEK

DATETIME値の曜日を整数で返します。

TO_CHAR (time, ‘DAY’)と意味は同じですが、この関数は整数を返します。

DAYOFWEEK(date_val)

返される整数は、次の表の曜日を表します。

戻り値曜日
0日曜日
1月曜日
2火曜日
3水曜日
4木曜日
5金曜日
6土曜日

DECODE

列値をsearch値と比較し、一致すると対応するreturn値を返します。一致するsearch値がなければdefault値を、defaultを省略した場合はNULLを返します。

DECODE(column, [search, return],.. default)
Mach> CREATE LOG TABLE decode_table (id1 VARCHAR(11));
Created successfully.

Mach> INSERT INTO decode_table VALUES('decodetest1');
1 row(s) inserted.

Mach> INSERT INTO decode_table VALUES('decodetest2');
1 row(s) inserted.

Mach> SELECT id1, DECODE(id1, 'decodetest1', 'result1', 'decodetest2', 'result2', 'DEFAULT') FROM decode_table;
id1          DECODE(id1, 'decodetest1', 'result1', 'decodetest2', 'result2', 'DEFAULT')
---------------------------------------------------------
decodetest2  result2
decodetest1  result1
[2] row(s) selected.

Mach> SELECT id1, DECODE(id1, 'codetest', 2, 99) FROM decode_table;
id1          DECODE(id1, 'codetest', 2, 99)
-----------------------------------------------
decodetest2  99
decodetest1  99
[2] row(s) selected.

Mach> SELECT DECODE(id1, 'decodetest1', 2) FROM decode_table;
DECODE(id1, 'decodetest1', 2)
--------------------------------
NULL
2
[2] row(s) selected.

Mach> SELECT DECODE(id1, 'codetest', 2) FROM decode_table;
DECODE(id1, 'codetest', 2)
-----------------------------
NULL
NULL
[2] row(s) selected.

EXTRACT_*

バイナリフレームからビットを抽出する関数群です。EXTRACT_*はビッグエンディアン、EXTRACT_LE_*はリトルエンディアンを使用します。すべての関数はBINARY/VARBINARYを入力に取り、frameがNULLなら結果もNULLです。

エンディアンモデル

  • EXTRACT_*: MSB優先(bit 0byte[0]のMSB)
  • EXTRACT_LE_*: LSB優先(bit 0byte[0]のLSB)
  • ビットの添字はフレーム全体を基準とする0始まりです。

共通規則

  • 単一ビット: 0 <= bit_pos < frame_bits
  • 範囲抽出: start_bit >= 01 <= bit_count <= 64start_bit + bit_count <= frame_bits
  • EXTRACT_FLOAT*は32ビット、EXTRACT_DOUBLE*は64ビットを読み取ります。
  • 符号付き抽出は2の補数(two’s complement)として解釈し、64ビットへ符号拡張します。
  • 範囲エラー: ERR_QP_INVALID_ARG_VALUEERR-02229系)
  • 引数の型エラー: ERR_QP_FUNCTION_ARG_TYPE

EXTRACT_BIT

EXTRACT_BIT(frame, bit_pos) / EXTRACT_LE_BIT(frame, bit_pos) → TINYINT

単一ビットを0または1で返します。

-- frame = 0x80 (1000 0000)
SELECT EXTRACT_BIT(frame, 0)    AS be_bit0,
       EXTRACT_LE_BIT(frame, 0) AS le_bit0
FROM t;

EXTRACT_LONG, EXTRACT_ULONG

EXTRACT_ULONG(frame, start_bit, bit_count) → BIGINT UNSIGNED
EXTRACT_LE_ULONG(frame, start_bit, bit_count) → BIGINT UNSIGNED
EXTRACT_LONG(frame, start_bit, bit_count) → BIGINT
EXTRACT_LE_LONG(frame, start_bit, bit_count) → BIGINT

1~64ビットを符号なし整数、または2の補数の整数として読み取ります。

-- frame = 0x12 34
SELECT EXTRACT_ULONG(frame, 0, 16)    AS be_u16,  -- 0x1234
       EXTRACT_LE_ULONG(frame, 0, 16) AS le_u16   -- 0x3412
FROM t;

EXTRACT_FLOAT,EXTRACT_DOUBLE

EXTRACT_FLOAT(frame, start_bit) → FLOAT
EXTRACT_LE_FLOAT(frame, start_bit) → FLOAT
EXTRACT_DOUBLE(frame, start_bit) → DOUBLE
EXTRACT_LE_DOUBLE(frame, start_bit) → DOUBLE

32/64ビットをIEEE754のfloat/doubleとして再解釈します。指定したビット範囲はframe内に収まる必要があります。

SELECT EXTRACT_FLOAT(frame, 0)      AS be_f32,
       EXTRACT_LE_FLOAT(frame, 0)   AS le_f32,
       EXTRACT_DOUBLE(frame, 64)    AS be_f64,
       EXTRACT_LE_DOUBLE(frame, 64) AS le_f64
FROM sensor_bin;

EXTRACT_SCALED_DOUBLE

EXTRACT_SCALED_DOUBLE(frame, start_bit, bit_count, signed, scale, offset) → DOUBLE
EXTRACT_LE_SCALED_DOUBLE(frame, start_bit, bit_count, signed, scale, offset) → DOUBLE

1~64ビットを、signed=0なら符号なし値、signed=1なら2の補数の符号付き値として読み取り、raw * scale + offsetを返します。

-- 20ビットのセンサー値、scale 0.01、offset -40.0
SELECT EXTRACT_SCALED_DOUBLE(frame, 0, 20, 0, 0.01, -40.0)    AS be_value,
       EXTRACT_LE_SCALED_DOUBLE(frame, 0, 20, 0, 0.01, -40.0) AS le_value
FROM t_bin;

FIRST / LAST

各グループを基準値でソートしたとき、最初または最後のレコードの特定の値を返す集約関数です。

  • FIRST: ソート順で最初のレコードの値を返します。
  • LAST: ソート順で最後のレコードの値を返します。
FIRST(sort_expr, return_expr)
LAST(sort_expr, return_expr)
Mach> create table firstlast_table (id integer, name varchar(20), group_no integer);
Created successfully.
Mach> insert into firstlast_table values (1, 'John', 0);
1 row(s) inserted.
Mach> insert into firstlast_table values (2, 'Grey', 1);
1 row(s) inserted.
Mach> insert into firstlast_table values (5, 'Ryan', 0);
1 row(s) inserted.
Mach> insert into firstlast_table values (4, 'Andrew', 0);
1 row(s) inserted.
Mach> insert into firstlast_table values (7, 'Kyle', 1);
1 row(s) inserted.
Mach> insert into firstlast_table values (6, 'Ross', 1);
1 row(s) inserted.

Mach> select group_no, first(id, name) from firstlast_table group by group_no;
group_no    first(id, name)
-------------------------------------
1           Grey
0           John
[2] row(s) selected.


Mach> select group_no, last(id, name) from firstlast_table group by group_no;
group_no    last(id, name)
-------------------------------------
1           Kyle
0           Ryan

FROM_TIMESTAMP

1970-01-01 00:00:00 UTCからの経過ナノ秒数をdatetime型へ変換します。

TO_TIMESTAMP()は、datetime型を同じ基準時点からの経過ナノ秒数へ変換します。

基準時点はUTC+09:00では1970-01-01 09:00:00と表示されます。次の例の日付と時刻はUTC+09:00基準です。

FROM_TIMESTAMP(nanosecond_time_value)
Mach> SELECT FROM_TIMESTAMP(1562302560007248869);
FROM_TIMESTAMP(1562302560007248869)
--------------------------------------
2019-07-05 13:56:00 007:248:869

SYSDATENOWは現在時刻を表すDATETIME値です。次の例は現在時刻をそのまま変換する場合と、1ミリ秒(1,000,000ナノ秒)を引く場合を示します。

Mach> select sysdate, from_timestamp(sysdate) from test_tbl;
sysdate                         from_timestamp(sysdate)
-------------------------------------------------------------------
2019-07-05 14:00:59 722:822:443 2019-07-05 14:00:59 722:822:443
[1] row(s) selected.

Mach> select sysdate, from_timestamp(sysdate-1000000) from test_tbl;
sysdate                         from_timestamp(sysdate-1000000)
-------------------------------------------------------------------
2019-07-05 14:01:05 130:939:525 2019-07-05 14:01:05 129:939:525      -- 1 ms (1,000,000 ns) の差がある
[1] row(s) selected.

FROM_UNIXTIME

整数で入力した32ビットUNIXTIME値をdatetime型へ変換します。UNIX_TIMESTAMPはdatetimeデータを32ビットUNIXTIME整数へ変換します。

次の例の日付と時刻はUTC+09:00基準です。

FROM_UNIXTIME(unix_timestamp_value)
Mach> SELECT FROM_UNIXTIME(315540671) FROM TEST;
FROM_UNIXTIME(315540671)
----------------------------------
1980-01-01 11:11:11 000:000:000

Mach> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP('2001-01-01')) FROM unix_table;
FROM_UNIXTIME(UNIX_TIMESTAMP('2001-01-01'))
------------------------------------------
2001-01-01 00:00:00 000:000:000

GROUP_CONCAT

グループ内の列値を文字列として連結して返す集約関数です。

Cluster Editionでは使用できません。
GROUP_CONCAT(
     [DISTINCT] column
     [ORDER BY { unsigned_integer | column }
     [ASC | DESC] [, column ...]]
     [SEPARATOR str_val]
)
  • DISTINCT: 重複値は1回のみ連結します。
  • ORDER BY: 指定列の値で連結順序をソートします。
  • SEPARATOR: 列値の連結に使用する区切り文字列です。デフォルトはカンマ(,)です。

構文に関する注意事項は次のとおりです。

  • 指定できる列は1つのみです。複数列を連結する場合は、TO_CHAR()とCONCAT演算子(||)で1つの式にまとめてください。
  • ORDER BYには連結対象以外の列も指定でき、複数列の指定も可能です。
  • SEPARATORには文字列定数のみ指定でき、文字列列は指定できません。
Mach> CREATE LOG TABLE concat_table(id1 INTEGER, id2 DOUBLE, name VARCHAR(10));
Created successfully.

Mach> INSERT INTO concat_table VALUES (1, 2, 'John');
1 row(s) inserted.

Mach> INSERT INTO concat_table VALUES (2, 1, 'Ram');
1 row(s) inserted.

Mach> INSERT INTO concat_table VALUES (3, 2, 'Zara');
1 row(s) inserted.

Mach> INSERT INTO concat_table VALUES (4, 2, 'Jill');
1 row(s) inserted.

Mach> INSERT INTO concat_table VALUES (5, 1, 'Jack');
1 row(s) inserted.

Mach> INSERT INTO concat_table VALUES (6, 1, 'Jack');
1 row(s) inserted.


Mach> SELECT GROUP_CONCAT(name) AS G_NAMES FROM concat_table GROUP BY id2;
G_NAMES
------------------------------------------------------------------------------------
Jack,Jack,Ram
Jill,Zara,John
[2] row(s) selected.

Mach> SELECT GROUP_CONCAT(DISTINCT name) AS G_NAMES FROM concat_table GROUP BY Id2;
G_NAMES
------------------------------------------------------------------------------------
Jack,Ram
Jill,Zara,John
[2] row(s) selected.

Mach> SELECT GROUP_CONCAT(name SEPARATOR '.') G_NAMES FROM concat_table GROUP BY Id2;
G_NAMES
------------------------------------------------------------------------------------
Jack.Jack.Ram
Jill.Zara.John
[2] row(s) selected.

Mach> SELECT GROUP_CONCAT(name ORDER BY id1) G_NAMES, GROUP_CONCAT(id1 ORDER BY id1) G_SORTID FROM concat_table GROUP BY id2;
G_NAMES
------------------------------------------------------------------------------------
G_SORTID
------------------------------------------------------------------------------------
Ram,Jack,Jack
2,5,6
John,Zara,Jill
1,3,4
[2] row(s) selected.

INSTR

対象文字列内でパターン文字列が始まる位置を返します。位置は1始まりです。

  • パターンがなければ0を返します。
  • 検索パターンの長さが0、またはNULLの場合はNULLを返します。
INSTR(target_string, pattern_string)
Mach> CREATE LOG TABLE string_table(c1 VARCHAR(20));
Created successfully.

Mach> INSERT INTO string_table VALUES ('abstract');
1 row(s) inserted.

Mach> INSERT INTO string_table VALUES ('override');
1 row(s) inserted.

Mach> SELECT c1, INSTR(c1, 'act') FROM string_table;
c1                    INSTR(c1, 'act')
------------------------------------------
override              0
abstract              6
[2] row(s) selected.

LEAST / GREATEST

複数の列/値を入力すると、LEASTは最小値、GREATESTは最大値を返します。

入力値が1つ、またはない場合はエラーです。入力値がNULLならNULLを返すため、入力が列の場合は事前に関数で変換してください。比較できない列(BLOB、TEXTなど)が含まれる場合や、比較のための型変換ができない場合はエラーです。

LEAST(value_list, value_list,...)
GREATEST(value_list, value_list,...)
Mach> CREATE LOG TABLE lgtest_table(c1 INTEGER, c2 LONG, c3 VARCHAR(10), c4 VARCHAR(5));
Created successfully.

Mach> INSERT INTO lgtest_table VALUES (1, 2, 'abstract', 'ace');
1 row(s) inserted.

Mach> INSERT INTO lgtest_table VALUES (null, 100, null, 'bag');
1 row(s) inserted.

Mach> SELECT LEAST (c1, c2) FROM lgtest_table;
LEAST (c1, c2)
-----------------------
NULL
1
[2] row(s) selected.

Mach> SELECT LEAST (c1, c2, -1) FROM lgtest_table;
LEAST (c1, c2, -1)
-----------------------
NULL
-1
[2] row(s) selected.

Mach> SELECT GREATEST(c3, c4) FROM lgtest_table;
GREATEST(c3, c4)
--------------------
NULL
ace
[2] row(s) selected.

Mach> SELECT LEAST(c3, c4) FROM lgtest_table;
LEAST(c3, c4)
-----------------
NULL
abstract
[2] row(s) selected.

Mach> SELECT LEAST(NVL(c3, 'aa'), c4) FROM lgtest_table;
LEAST(NVL(c3, 'aa'), c4)
----------------------------
aa
abstract
[2] row(s) selected.

LENGTH

文字列列の長さを返します。戻り値は英字(ASCII)を基準とするバイト数です。

LENGTH(column_name)
Mach> CREATE LOG TABLE length_table (id1 INTEGER, id2 DOUBLE, name VARCHAR(15));
Created successfully.

Mach> INSERT INTO length_table VALUES(1, 10, 'Around the Horn');
1 row(s) inserted.

Mach> INSERT INTO length_table VALUES(NULL, 20, 'Alfreds Futterkiste');
1 row(s) inserted.

Mach> INSERT INTO length_table VALUES(3, NULL, 'Antonio Moreno');
1 row(s) inserted.

Mach> INSERT INTO length_table VALUES(4, 40, NULL);
1 row(s) inserted.

Mach> select * FROM length_table;
ID1         ID2                         NAME
-------------------------------------------------------------
4           40                          NULL
3           NULL                        Antonio Moreno
NULL        20                          Alfreds Futterk
1           10                          Around the Horn
[4] row(s) selected.

Mach> select id1 * 10 FROM length_table;
id1 * 10
-----------------------
40
30
NULL
10
[4] row(s) selected.

Mach> select * FROM length_table Where id1 > 1 and id2 < 50;
ID1         ID2                         NAME
-------------------------------------------------------------
4           40                          NULL
[1] row(s) selected.

Mach> select name || ' with null concat' FROM length_table;
name || ' with null concat'
------------------------------------
NULL
Antonio Moreno with null concat
Alfreds Futterk with null concat
Around the Horn with null concat
[4] row(s) selected.

Mach> select LENGTH(name) FROM length_table;
LENGTH(name)
---------------
NULL
14
15
15
[4] row(s) selected.

LOWER

英字文字列を小文字へ変換します。

LOWER(column_name)
Mach> CREATE LOG TABLE lower_table (name VARCHAR(20));
Created successfully.

Mach> INSERT INTO lower_table VALUES('');
1 row(s) inserted.

Mach> INSERT INTO lower_table VALUES('James Backley');
1 row(s) inserted.

Mach> INSERT INTO lower_table VALUES('Alfreds Futterkiste');
1 row(s) inserted.

Mach> INSERT INTO lower_table VALUES('Antonio MORENO');
1 row(s) inserted.

Mach> INSERT INTO lower_table VALUES (NULL);
1 row(s) inserted.

Mach> SELECT LOWER(name) FROM lower_table;
LOWER(name)
------------------------
NULL
antonio moreno
alfreds futterkiste
james backley
NULL
[5] row(s) selected.

LPAD / RPAD

入力文字列が指定の長さになるまで、左側(LPAD)または右側(RPAD)に文字を埋めます。

最後のパラメーターcharは省略可能で、省略すると空白(’ ‘)で埋めます。入力が指定長より長い場合は文字を追加せず、先頭から指定の長さだけ返します。

LPAD(str, len, padstr)
RPAD(str, len, padstr)
Mach> CREATE LOG TABLE pad_table (c1 integer, c2 varchar(15));
Created successfully.

Mach> INSERT INTO pad_table VALUES (1, 'Antonio');
1 row(s) inserted.

Mach> INSERT INTO pad_table VALUES (25, 'Johnathan');
1 row(s) inserted.

Mach> INSERT INTO pad_table VALUES (30, 'M');
1 row(s) inserted.

Mach> SELECT LPAD(to_char(c1), 5, '0') FROM pad_table;
LPAD(to_char(c1), 5, '0')
-----------------------------
00030
00025
00001
[3] row(s) selected.

Mach> SELECT RPAD(to_char(c1), 5, '0') FROM pad_table;
RPAD(to_char(c1), 5, '0')
-----------------------------
30000
25000
10000
[3] row(s) selected.

Mach> SELECT LPAD(c2, 5) FROM pad_table;
LPAD(c2, 5)
---------------
    M
Johna
Anton
[3] row(s) selected.

Mach> SELECT RPAD(c2, 5) FROM pad_table;
RPAD(c2, 5)
---------------
M
Johna
Anton
[3] row(s) selected.

Mach> SELECT RPAD(c2, 10, '***') FROM pad_table;
RPAD(c2, 10, '***')
-----------------------
M*********
Johnathan*
Antonio***
[3] row(s) selected.

LTRIM / RTRIM

第1引数からパターン文字列に含まれる文字を削除します。LTRIMは左から、RTRIMは右から検査し、パターンにない文字に達すると停止します。すべての文字がパターンに含まれる場合はNULLを返します。

パターンを省略すると、空白(’ ‘)を削除します。

LTRIM(column_name, pattern)
RTRIM(column_name, pattern)
Mach> CREATE LOG TABLE trim_table1(name VARCHAR(10));
Created successfully.

Mach> INSERT INTO trim_table1 VALUES ('   smith   ');
1 row(s) inserted.

Mach> SELECT ltrim(name) FROM trim_table1;
ltrim(name)
---------------
smith
[1] row(s) selected.

Mach> SELECT rtrim(name) FROM trim_table1;
rtrim(name)
---------------
   smith
[1] row(s) selected.

Mach> SELECT ltrim(name, ' s') FROM trim_table1;
ltrim(name, ' s')
---------------------
mith
[1] row(s) selected.

Mach> SELECT rtrim(name, 'h ') FROM trim_table1;
rtrim(name, 'h ')
---------------------
   smit
[1] row(s) selected.

Mach> CREATE LOG TABLE trim_table2 (name VARCHAR(10));
Created successfully.

Mach> INSERT INTO trim_table2 VALUES ('ddckaaadkk');
1 row(s) inserted.

Mach> SELECT ltrim(name, 'dc') FROM trim_table2;
ltrim(name, 'dc')
---------------------
kaaadkk
[1] row(s) selected.

Mach> SELECT rtrim(name, 'dk') FROM trim_table2;
rtrim(name, 'dk')
---------------------
ddckaaa
[1] row(s) selected.

Mach> SELECT ltrim(name, 'dckak') FROM trim_table2;
ltrim(name, 'dckak')
------------------------
NULL
[1] row(s) selected.

Mach> SELECT rtrim(name, 'dckak') FROM trim_table2;
rtrim(name, 'dckak')
------------------------
NULL
[1] row(s) selected.

MAX

指定した数値列の最大値を返す集約関数です。

MAX(column_name)
Mach> CREATE LOG TABLE max_table (c INTEGER);
Created successfully.

Mach> INSERT INTO max_table VALUES(10);
1 row(s) inserted.

Mach> INSERT INTO max_table VALUES(20);
1 row(s) inserted.

Mach> INSERT INTO max_table VALUES(30);
1 row(s) inserted.

Mach> SELECT MAX(c) FROM max_table;
MAX(c)
--------------
30
[1] row(s) selected.

MEDIAN

MEDIAN(value)は数値式の正確な中央値を返し、PERCENTILE_CONT(value, 0.5)と同じ方式で動作します。

MEDIAN(value)
  • valueは数値型である必要があります。
  • NULL値は無視します。
  • 戻り値の型はDOUBLEです。
SELECT MEDIAN(temp_c)
FROM sensor_log;

MIN

指定した数値列の最小値を返す集約関数です。

MIN(column_name)
Mach> CREATE LOG TABLE min_table(c1 INTEGER);
Created successfully.

Mach> INSERT INTO min_table VALUES(1);
1 row(s) inserted.

Mach> INSERT INTO min_table VALUES(22);
1 row(s) inserted.

Mach> INSERT INTO min_table VALUES(33);
1 row(s) inserted.

Mach> SELECT MIN(c1) FROM min_table;
MIN(c1)
--------------
1
[1] row(s) selected.

NVL

列値がNULLなら指定値で置き換え、NULLでなければ元の値を返します。

NVL(string1, replace_with)
Mach> CREATE LOG TABLE nvl_table (c1 varchar(10));
Created successfully.

Mach> INSERT INTO nvl_table VALUES ('Johnathan');
1 row(s) inserted.

Mach> INSERT INTO nvl_table VALUES (NULL);
1 row(s) inserted.

Mach> SELECT NVL(c1, 'Thomas') FROM nvl_table;
NVL(c1, 'Thomas')
---------------------
Thomas
Johnathan

NEXTVAL

NEXTVAL(sequence_column)は、LookupテーブルのSequence列の次の値を返します。

NEXTVAL(sequence_column)
  • NEXTVALINSERT文でのみ使用できます。
  • 引数はPROPERTY(SEQUENCE=...)で設定された列である必要があります。
  • Sequence列の作成と例はSequence Columnを参照してください。
INSERT INTO seq_lookup (id, name) VALUES (NEXTVAL(id), 'sensor-a');

ROUND

入力値の指定桁(入力桁数+1)を丸めた結果を返します。桁数を省略すると小数点以下0桁に丸めます。負数を指定して整数部の桁で丸めることもできます。

ROUND(column_name, [decimals])
Mach> CREATE LOG TABLE round_table (c1 DOUBLE);
Created successfully.

Mach> INSERT INTO round_table VALUES (1.994);
1 row(s) inserted.

Mach> INSERT INTO round_table VALUES (1.995);
1 row(s) inserted.

Mach> SELECT c1, ROUND(c1, 2) FROM round_table;
c1                          ROUND(c1, 2)
-----------------------------------------------------------
1.995                       2
1.994                       1.99

ROWNUM

SELECTの結果行に番号を付けます。

SELECTで使用するサブクエリやインラインビュー内でも使用できます。インラインビューの選択リストでROWNUM()を使用する場合は、外側から参照できるように別名を指定してください。

ROWNUM()

使用できる句

SELECTの選択リスト、GROUP BY、ORDER BY句で使用できます。WHEREとHAVING句では使用できません。結果の番号でWHERE/HAVINGを制御するには、インラインビューでROWNUM()を計算してから外側のクエリで参照します。

使用できる句使用できない句
Target List / GROUP BY / ORDER BYWHERE / HAVING
Mach> CREATE LOG TABLE rownum_table(c1 INTEGER, c2 DOUBLE, c3 VARCHAR(10));
Created successfully.

Mach> INSERT INTO rownum_table VALUES(1, 1.0, '');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(2, 2.0, 'Second Row');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(3, 3.3, 'Third Row');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(4, 4.3, 'Fourth Row');
1 row(s) inserted.

Mach> SELECT INNER_RANK, c3 AS NAME
    2 FROM   (SELECT ROWNUM() AS INNER_RANK, * FROM rownum_table)
    3 WHERE  INNER_RANK < 3;
INNER_RANK           NAME
------------------------------------
1                    Fourth Row
2                    Third Row
[2] row(s) selected.

ソートによる結果番号の変化

SELECTにORDER BY句がある場合、選択リストのROWNUM()結果が連番にならない場合があります。ROWNUM()がORDER BYより先に処理されるためです。連番が必要な場合は、ORDER BYを含むクエリをインラインビューにして、外側のSELECTでROWNUM()を呼び出してください。

Mach> CREATE LOG TABLE rownum_table(c1 INTEGER, c2 DOUBLE, c3 VARCHAR(10));
Created successfully.

Mach> INSERT INTO rownum_table VALUES(1, 1.0, '');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(2, 2.0, 'John');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(3, 3.3, 'Sarah');
1 row(s) inserted.

Mach> INSERT INTO rownum_table VALUES(4, 4.3, 'Micheal');
1 row(s) inserted.

Mach> SELECT ROWNUM(), c2 AS SORT, c3 AS NAME
    2 FROM   ( SELECT * FROM rownum_table ORDER BY c3 );
ROWNUM()             SORT                        NAME
-----------------------------------------------------------------
1                    1                           NULL
2                    2                           John
3                    4.3                         Micheal
4                    3.3                         Sarah
[4] row(s) selected.

SERIESNUM

SERIES BYで区別した連続区間のうち、各行が属する区間の番号を返します。同じ区間の行には同じ番号を付けるため、区間内の行番号とは異なります。戻り値の型はBIGINTで、SERIES BY句を使用しない場合は常に1を返します。

SERIESNUM()
Mach> CREATE LOG TABLE T1 (C1 INTEGER, C2 INTEGER);
Created successfully.

Mach> INSERT INTO T1 VALUES (0, 1);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (1, 2);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (2, 3);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (3, 2);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (4, 1);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (5, 2);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (6, 3);
1 row(s) inserted.

Mach> INSERT INTO T1 VALUES (7, 1);
1 row(s) inserted.


Mach> SELECT SERIESNUM(), C1, C2 FROM T1 ORDER BY C1 SERIES BY C2 > 1;
SERIESNUM() C1 C2
-------------------------------------------------
1 1 2
1 2 3
1 3 2
2 5 2
2 6 3
[5] row(s) selected.

STDDEV / STDDEV_POP

入力列の標本標準偏差(STDDEV)と母標準偏差(STDDEV_POP)を返す集約関数です。それぞれVARIANCE、VAR_POPの平方根です。

STDDEV(column)
STDDEV_POP(column)
Mach> CREATE LOG TABLE stddev_table(c1 INTEGER, C2 DOUBLE);

Mach> INSERT INTO stddev_table VALUES (1, 1);
1 row(s) inserted.

Mach> INSERT INTO stddev_table VALUES (2, 1);
1 row(s) inserted.

Mach> INSERT INTO stddev_table VALUES (3, 2);
1 row(s) inserted.

Mach> INSERT INTO stddev_table VALUES (4, 2);
1 row(s) inserted.

Mach> SELECT c2, STDDEV(c1) FROM stddev_table GROUP BY c2;
c2                          STDDEV(c1)
-----------------------------------------------------------
1                           0.707107
2                           0.707107
[2] row(s) selected.

Mach> SELECT c2, STDDEV_POP(c1) FROM stddev_table GROUP BY c2;
c2                          STDDEV_POP(c1)
-----------------------------------------------------------
1                           0.5
2                           0.5
[2] row(s) selected.

SUBSTR

文字列列のSTART位置からSIZEの長さの部分文字列を返します。

  • STARTは1始まりで、0の場合はNULLを返します。
  • SIZEがSTART位置からの残りの文字列長より大きい場合は、START位置から末尾まで返します。 SIZEは省略可能で、省略すると文字列長を使用します。
SUBSTRING(column_name, start, [length])
Mach> CREATE LOG TABLE substr_table (c1 VARCHAR(10));
Created successfully.

Mach> INSERT INTO substr_table values('ABCDEFG');
1 row(s) inserted.

Mach> INSERT INTO substr_table values('abstract');
1 row(s) inserted.

Mach> SELECT SUBSTR(c1, 1, 1) FROM substr_table;
SUBSTR(c1, 1, 1)
--------------------
a
A
[2] row(s) selected.

Mach> SELECT SUBSTR(c1, 3, 3) FROM substr_table;
SUBSTR(c1, 3, 3)
--------------------
str
CDE
[2] row(s) selected.

Mach> SELECT SUBSTR(c1, 2) FROM substr_table;
SUBSTR(c1, 2)
-----------------
bstract
BCDEFG
[2] row(s) selected.

Mach> drop table substr_table;
Dropped successfully.

Mach> CREATE LOG TABLE substr_table (c1 VARCHAR(10));
Created successfully.

Mach> INSERT INTO substr_table values('ABCDEFG');
1 row(s) inserted.

Mach> SELECT SUBSTR(c1, 1, 1) FROM substr_table;
SUBSTR(c1, 1, 1)
--------------------
A
[1] row(s) selected.

Mach> SELECT SUBSTR(c1, 3, 3) FROM substr_table;
SUBSTR(c1, 3, 3)
--------------------
CDE
[1] row(s) selected.

Mach> SELECT SUBSTR(c1, 2) FROM substr_table;
SUBSTR(c1, 2)
-----------------
BCDEFG
[1] row(s) selected.

SUBSTRING_INDEX

指定したcount回だけ区切り文字delimを見つけるまでの部分文字列を返します。countが負数の場合は文字列の末尾から区切り文字を探し、見つけた位置から末尾まで返します。

countが0ならNULLを返します。countが0以外で文字列に区切り文字がなければ、入力文字列全体を返します。

SUBSTRING_INDEX(expression, delim, count)
Mach> CREATE LOG TABLE substring_table (url VARCHAR(30));
Created successfully.

Mach> INSERT INTO substring_table VALUES('www.machbase.com');
1 row(s) inserted.

Mach> SELECT SUBSTRING_INDEX(url, '.', 1) FROM substring_table;
SUBSTRING_INDEX(url, '.', 1)
----------------------------------
www
[1] row(s) selected.

Mach> SELECT SUBSTRING_INDEX(url, '.', 2) FROM substring_table;
SUBSTRING_INDEX(url, '.', 2)
----------------------------------
www.machbase
[1] row(s) selected.

Mach> SELECT SUBSTRING_INDEX(url, '.', -1) FROM substring_table;
SUBSTRING_INDEX(url, '.', -1)
----------------------------------
com
[1] row(s) selected.

Mach> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(url, '.', 2), '.', -1) FROM substring_table;
SUBSTRING_INDEX(SUBSTRING_INDEX(url, '.', 2), '.', -1)
-------------------------------------------
machbase
[1] row(s) selected.

Mach> SELECT SUBSTRING_INDEX(url, '.', 0) FROM substring_table;
SUBSTRING_INDEX(url, '.', 0)
----------------------------------
NULL
[1] row(s) selected.

SUM

数値列の合計を返す集約関数です。

SUM(column_name)
Mach> CREATE LOG TABLE sum_table (c1 INTEGER, c2 INTEGER);
Created successfully.

Mach> INSERT INTO sum_table VALUES(1, 1);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(1, 2);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(1, 3);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(2, 1);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(2, 2);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(2, 3);
1 row(s) inserted.

Mach> INSERT INTO sum_table VALUES(3, 4);
1 row(s) inserted.

Mach> SELECT c1, SUM(c1) from sum_table group by c1;
c1          SUM(c1)
------------------------------------
2           6
3           3
1           3
[3] row(s) selected.

Mach> SELECT c1, SUM(c2) from sum_table group by c1;
c1          SUM(c2)
------------------------------------
2           6
3           4
1           6
[3] row(s) selected.

SUMSQ

SUMSQは数値の二乗和を返します。

SUMSQ(value)
Mach> CREATE LOG TABLE sumsq_table (c1 INTEGER, c2 INTEGER);
Created successfully.

Mach> INSERT INTO sumsq_table VALUES (1, 1);
1 row(s) inserted.

Mach> INSERT INTO sumsq_table VALUES (1, 2);
1 row(s) inserted.

Mach> INSERT INTO sumsq_table VALUES (1, 3);
1 row(s) inserted.

Mach> INSERT INTO sumsq_table VALUES (2, 4);
1 row(s) inserted.

Mach> INSERT INTO sumsq_table VALUES (2, 5);
1 row(s) inserted.

Mach> SELECT c1, SUMSQ(c2) FROM sumsq_table GROUP BY c1;
c1          SUMSQ(c2)
------------------------------------
2           41
1           14
[2] row(s) selected.

SYSDATE / NOW

SYSDATEは関数ではなく疑似列で、現在のシステム時刻を返します。

NOWはSYSDATEと同じ機能で、利便性のために提供します。

SYSDATE
NOW
Mach> SELECT SYSDATE, NOW FROM t1;

SYSDATE                         NOW
-------------------------------------------------------------------
2017-01-16 14:14:53 310:973:000 2017-01-16 14:14:53 310:973:000

TO_CHAR

指定データ型を文字列型へ変換します。型に応じてformat_stringを指定できますが、バイナリ型には使用できません。

TO_CHAR(column)

TO_CHAR: 基本データ型

基本データ型は次のように文字列へ変換します。

Mach> CREATE LOG TABLE fixed_table (id1 SHORT, id2 INTEGER, id3 LONG, id4 FLOAT, id5 DOUBLE, id6 IPV4, id7 IPV6, id8 VARCHAR (128));
Created successfully.

Mach> INSERT INTO fixed_table values(200, 19234, 1234123412, 3.14, 7.8338, '192.168.0.1', '::127.0.0.1', 'log varchar');
1 row(s) inserted.

Mach> SELECT '[ ' || TO_CHAR(id1) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id1) || ' ]'
------------------------------------------------------------------------------------
[ 200 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id2) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id2) || ' ]'
------------------------------------------------------------------------------------
[ 19234 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id3) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id3) || ' ]'
------------------------------------------------------------------------------------
[ 1234123412 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id4) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id4) || ' ]'
------------------------------------------------------------------------------------
[ 3.140000 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id5) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id5) || ' ]'
------------------------------------------------------------------------------------
[ 7.833800 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id6) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id6) || ' ]'
------------------------------------------------------------------------------------
[ 192.168.0.1 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id7) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id7) || ' ]'
------------------------------------------------------------------------------------
[ 0000:0000:0000:0000:0000:0000:7F00:0001 ]
[1] row(s) selected.

Mach> SELECT '[ ' || TO_CHAR(id8) || ' ]' FROM fixed_table;
'[ ' || TO_CHAR(id8) || ' ]'
------------------------------------------------------------------------------------
[ log varchar ]
[1] row(s) selected.

TO_CHAR: 浮動小数点数

  • バージョン5.5.6以降でサポート

floatとdouble値を文字列へ変換します。書式指定子は繰り返して使用できず、’[letter][number]‘形式で指定します。

書式指定子説明
F / f列値の小数桁数を指定します。最大値は30です。
N / n小数桁数を指定し、整数部の3桁ごとにカンマ(,)を挿入します。最大値は30です。
Mach> create table float_table (i1 float, i2 double);
Created successfully.

Mach> insert into float_table values (1.23456789, 1234.5678901234567890);
1 row(s) inserted.

Mach> select TO_CHAR(i1, 'f8'), TO_CHAR(i2, 'N9') from float_table;
TO_CHAR(i1, 'f8')       TO_CHAR(i2, 'N9')
--------------------------------------------------------------
1.23456788              1,234.567890123
[1] row(s) selected.

TO_CHAR: DATETIME型

datetime列の値を指定形式の文字列へ変換する関数です。さまざまな文字列を生成し、組み合わせることができます。

format_stringを省略すると、デフォルトは"YYYY-MM-DD HH24: MI: SS mmm: uuu: nnn"です。

書式指定子説明
YYYY年を4桁の数値へ変換します。
YY年を2桁の数値へ変換します。
MM月を2桁の数値へ変換します。
MON月を英語3文字の略称へ変換します(例: JAN, FEB, MAY, …)。
DD日を2桁の数値へ変換します。
DAY曜日を英語3文字の略称へ変換します(例: SUN, MON, …)。
IWISO 8601に従い、曜日を考慮して年内の週番号を1~53へ変換します。
- 週は月曜日から始まります。
- 最初の週を前年の最終週とみなす場合があります。同様に、最終週を翌年の最初の週とみなす場合もあります。
詳細はISO 8601を参照してください。
WW曜日を考慮せず、年内の週番号を1~53へ変換します。
例えば1月1日~1月7日は1になります。
W曜日を考慮せず、月内の週番号を1~5へ変換します。
例えば3月1日~3月7日は1になります。
HH時を2桁の数値へ変換します。
HH12時を1~12の範囲の2桁の数値へ変換します。
HH24時を00~23の範囲の2桁の数値へ変換します。
HH2, HH3, HH6HHの後の数値単位で時を切り捨てます。

例えばHH6では0~5を0、6~11を6と表示します。
時系列統計の計算に便利です。
24時間制で表示します。
MI分を2桁の数値で表示します。
MI2, MI5, MI10, MI20, MI30MIの後の数値単位で分を切り捨てます。

例えばMI30では0~29分を0、30~59分を30と表示します。
時系列統計の計算に便利です。
SS秒を2桁の数値で表示します。
SS2, SS5, SS10, SS20, SS30SSの後の数値単位で秒を切り捨てます。

例えばSS30では0~29秒を0、30~59秒を30と表示します。
時系列統計の計算に便利です。
AM時刻をAM/PMで表示します。
mmmミリ秒を3桁の数値で表示します。

範囲は0~999です。
uuuマイクロ秒を3桁の数値で表示します。

範囲は0~999です。
nnnナノ秒を3桁の数値で表示します。

範囲は0~999です。
Mach> CREATE LOG TABLE datetime_table (id integer, dt datetime);
Created successfully.

Mach> INSERT INTO  datetime_table values(1, TO_DATE('1999-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  datetime_table values(2, TO_DATE('2012-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  datetime_table values(3, TO_DATE('2013-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  datetime_table values(4, TO_DATE('2014-12-30 11:22:33 444:555:666'));
1 row(s) inserted.

Mach> SELECT id, dt FROM datetime_table WHERE dt > TO_DATE('2000-11-11 1:2:3 4:5:0');
id          dt
-----------------------------------------------
4           2014-12-30 11:22:33 444:555:666
3           2013-11-11 01:02:03 004:005:006
2           2012-11-11 01:02:03 004:005:006
[3] row(s) selected.

Mach> SELECT id, dt FROM datetime_table WHERE dt > TO_DATE('2013-11-11 1:2:3') and dt < TO_DATE('2014-11-11 1:2:3');
id          dt
-----------------------------------------------
3           2013-11-11 01:02:03 004:005:006
[1] row(s) selected.

Mach> SELECT id, TO_CHAR(dt) FROM datetime_table;
id          TO_CHAR(dt)
-------------------------------------------------------------------------------------------------
4           2014-12-30 11:22:33 444:555:666
3           2013-11-11 01:02:03 004:005:006
2           2012-11-11 01:02:03 004:005:006
1           1999-11-11 01:02:03 004:005:006
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY')
-------------------------------------------------------------------------------------------------
4           2014
3           2013
2           2012
1           1999
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY-MM') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY-MM')
-------------------------------------------------------------------------------------------------
4           2014-12
3           2013-11
2           2012-11
1           1999-11
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY-MM-DD') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY-MM-DD')
-------------------------------------------------------------------------------------------------
4           2014-12-30
3           2013-11-11
2           2012-11-11
1           1999-11-11
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY-MM-DD TO_CHAR') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY-MM-DD TO_CHAR')
-------------------------------------------------------------------------------------------------
4           2014-12-30 TO_CHAR
3           2013-11-11 TO_CHAR
2           2012-11-11 TO_CHAR
1           1999-11-11 TO_CHAR
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS')
-------------------------------------------------------------------------------------------------
4           2014-12-30 11:22:33
3           2013-11-11 01:02:03
2           2012-11-11 01:02:03
1           1999-11-11 01:02:03
[4] row(s) selected.

Mach> SELECT id, TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS mmm.uuu.nnn') FROM datetime_table;
id          TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS mmm.
-------------------------------------------------------------------------------------------------
4           2014-12-30 11:22:33 444.555.666
3           2013-11-11 01:02:03 004.005.006
2           2012-11-11 01:02:03 004.005.006
1           1999-11-11 01:02:03 004.005.006
[4] row(s) selected.

TO_CHAR: 非対応の型

現在TO_CHARはバイナリ型をサポートしません。

通常の文字列に変換できないためです。画面で確認するには、TO_HEX()関数で16進値を表示してください。

TO_DATE

指定した書式文字列に従って文字列をdatetime型へ変換します。

format_stringを省略すると、デフォルトは"YYYY-MM-DD HH24: MI: SS mmm: uuu: nnn"です。

-- default format is "YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" if no format exists.
TO_DATE(date_string [, format_string])
Mach> CREATE LOG TABLE to_date_table (id INTEGER, dt datetime);
Created successfully.

Mach> INSERT INTO  to_date_table VALUES(1, TO_DATE('1999-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  to_date_table VALUES(2, TO_DATE('2012-11-11 1:2:3 4:5:6'));
1 row(s) inserted.

Mach> INSERT INTO  to_date_table VALUES(3, TO_DATE('2014-12-30 11:22:33 444:555:666'));
1 row(s) inserted.

Mach> INSERT INTO  to_date_table VALUES(4, TO_DATE('2014-12-30 23:22:34 777:888:999', 'YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn'));
1 row(s) inserted.

Mach> SELECT id, dt FROM to_date_table WHERE dt > TO_DATE('1999-11-11 1:2:3 4:5:0');
id          dt
-----------------------------------------------
4           2014-12-30 23:22:34 777:888:999
3           2014-12-30 11:22:33 444:555:666
2           2012-11-11 01:02:03 004:005:006
1           1999-11-11 01:02:03 004:005:006
[4] row(s) selected.

Mach> SELECT id, dt FROM to_date_table WHERE dt > TO_DATE('2000-11-11 1:2:3 4:5:0');
id          dt
-----------------------------------------------
4           2014-12-30 23:22:34 777:888:999
3           2014-12-30 11:22:33 444:555:666
2           2012-11-11 01:02:03 004:005:006
[3] row(s) selected.

Mach> SELECT id, dt FROM to_date_table WHERE dt > TO_DATE('2012-11-11 1:2:3','YYYY-MM-DD HH24:MI:SS') and dt < TO_DATE('2014-11-11 1:2:3','YYYY-MM-DD HH24:MI:SS');
id          dt
-----------------------------------------------
2           2012-11-11 01:02:03 004:005:006
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999', 'YYYY') FROM to_date_table LIMIT 1;
id          TO_DATE('1999', 'YYYY')
-----------------------------------------------
4           1999-01-01 00:00:00 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12', 'YYYY-MM') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12', 'YYYY-MM')
-----------------------------------------------
4           1999.12.01 00:00:00 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999', 'YYYY') FROM to_date_table LIMIT 1;
id          TO_DATE('1999', 'YYYY')
-----------------------------------------------
4           1999-01-01 00:00:00 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12', 'YYYY-MM') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12', 'YYYY-MM')
-----------------------------------------------
4           1999-12-01 00:00:00 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12-31 13:12', 'YYYY-MM-DD HH24:MI') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12-31 13:12', 'YYYY-MM-DD HH24:MI')
-------------------------------------------------------
4           1999-12-31 13:12:00 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12-31 13:12:32', 'YYYY-MM-DD HH24:MI:SS') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12-31 13:12:32', 'YYYY-MM-DD HH24:MI:SS')
-------------------------------------------------------
4           1999-12-31 13:12:32 000:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12-31 13:12:32 123', 'YYYY-MM-DD HH24:MI:SS mmm') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12-31 13:12:32 123', 'YYYY-MM-DD HH24:MI:SS mmm')
-------------------------------------------------------
4           1999-12-31 13:12:32 123:000:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12-31 13:12:32 123:456', 'YYYY-MM-DD HH24:MI:SS mmm:uuu') FROM to_date_table LIMIT 1;
id          TO_DATE('1999-12-31 13:12:32 123:456', 'YYYY-MM-DD HH24:MI:SS mmm:uuu')
-------------------------------------------------------
4           1999-12-31 13:12:32 123:456:000
[1] row(s) selected.

Mach> SELECT id, TO_DATE('1999-12-31 13:12:32 123:456:789', 'YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn') FROM to_date_table LIMIT 1;
id           TO_DATE('1999-12-31 13:12:32 123:456:789', 'YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn')
-------------------------------------------------------
4           1999-12-31 13:12:32 123:456:789
[1] row(s) selected.

TO_DATE_SAFE

TO_DATE()と同様ですが、変換に失敗するとエラーを出さずNULLを返します。

TO_DATE_SAFE(date_string [, format_string])
Mach> CREATE LOG TABLE date_table (ts DATETIME);
Created successfully.

Mach> INSERT INTO date_table VALUES (TO_DATE_SAFE('2016-01-01', 'YYYY-MM-DD'));
1 row(s) inserted.
Mach> INSERT INTO date_table VALUES (TO_DATE_SAFE('2016-01-02', 'YYYY'));
1 row(s) inserted.
Mach> INSERT INTO date_table VALUES (TO_DATE_SAFE('2016-12-32', 'YYYY-MM-DD'));
1 row(s) inserted.

Mach> SELECT ts FROM date_table;
ts
----------------------------------
NULL
NULL
2016-01-01 00:00:00 000:000:000
[3] row(s) selected.

TO_HEX

列値がNULLならNULLを返し、NULLでなければ元の値を16進文字列で返します。出力の一貫性のため、short、int、long型はBIG ENDIANへ変換します。

TO_HEX(column)
Mach> CREATE LOG TABLE hex_table (id1 SHORT, id2 INTEGER, id3 VARCHAR(10), id4 FLOAT, id5 DOUBLE, id6 LONG, id7 IPV4, id8 IPV6, id9 TEXT, id10 BINARY,
id11 DATETIME);
Created successfully.

Mach> INSERT INTO hex_table VALUES(256, 65535, '0123456789', 3.141592, 1024 * 1024 * 1024 * 3.14, 13513135446, '192.168.0.1', '::192.168.0.1', 'textext',
'binary', TO_DATE('1999', 'YYYY'));
1 row(s) inserted.

Mach> SELECT TO_HEX(id1), TO_HEX(id2), TO_HEX(id3), TO_HEX(id4), TO_HEX(id5), TO_HEX(id6), TO_HEX(id7), TO_HEX(id8), TO_HEX(id9), TO_HEX(id10), TO_HEX(id11)
FROM hex_table;
TO_HEX(id1)  TO_HEX(id2)  TO_HEX(id3)            TO_HEX(id4)  TO_HEX(id5)        TO_HEX(id6)        TO_HEX(id7)
-------------------------------------------------------------------------------------------------------------------------
TO_HEX(id8)                          TO_HEX(id9)
--------------------------------------------------------------------------------------------------------------------------
TO_HEX(id10)                                                                      TO_HEX(id11)
--------------------------------------------------------------------------------------------------------
0100   0000FFFF   30313233343536373839   D80F4940   1F85EB51B81EE941   0000000325721556   04C0A80001
06000000000000000000000000C0A80001   74657874657874
62696E617279                                                                      0CB325846E226000
[1] row(s) selected.

TO_INET_STR

TO_INET_STR(ipv4_value)IPV4値をドット区切りの10進文字列へ変換します。

TO_INET_STR(ipv4_value)
SELECT TO_INET_STR(TO_IPV4('192.168.0.1'));

TO_IPV4 / TO_IPV4_SAFE

指定した文字列をIPv4型へ変換します。文字列を数値へ変換できない場合、TO_IPV4()はエラーを返して処理を停止します。

TO_IPV4_SAFE()はエラー時にNULLを返すため、処理を継続できます。

TO_IPV4(string_value)
TO_IPV4_SAFE(string_value)
Mach> CREATE LOG TABLE ipv4_table (c1 varchar(100));
Created successfully.

Mach> INSERT INTO ipv4_table VALUES('192.168.0.1');
1 row(s) inserted.

Mach> INSERT INTO ipv4_table VALUES('     192.168.0.2    ');
1 row(s) inserted.

Mach> INSERT INTO ipv4_table VALUES(NULL);
1 row(s) inserted.

Mach> SELECT c1 FROM ipv4_table;
c1
------------------------------------------------------------------------------------
NULL
     192.168.0.2
192.168.0.1
[3] row(s) selected.

Mach> SELECT TO_IPV4(c1) FROM ipv4_table;
TO_IPV4(c1)
------------------
NULL
192.168.0.2
192.168.0.1
[3] row(s) selected.

Mach> INSERT INTO ipv4_table VALUES('192.168.0.1.1');
1 row(s) inserted.

Mach> SELECT TO_IPV4(c1) FROM ipv4_table limit 1;
TO_IPV4(c1)
------------------
[ERR-02068 : Invalid IPv4 address format (192.168.0.1.1).]
[0] row(s) selected.

Mach> SELECT TO_IPV4_SAFE(c1) FROM ipv4_table;
TO_IPV4_SAFE(c1)
-------------------
NULL
NULL
192.168.0.2
192.168.0.1
[4] row(s) selected.

TO_IPV6 / TO_IPV6_SAFE

指定した文字列をIPv6型へ変換します。文字列を数値型へ変換できない場合、TO_IPV6()はエラーを返して処理を停止します。

TO_IPV6_SAFE()はエラー時にNULLを返すため、処理を継続できます。

TO_IPV6(string_value)
TO_IPV6_SAFE(string_value)
Mach> CREATE LOG TABLE ipv6_table (id varchar(100));
Created successfully.

Mach> INSERT INTO ipv6_table VALUES('::0.0.0.0');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('::127.0.0.1');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('::127.0' || '.0.2');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('   ::127.0.0.3');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('::127.0.0.4  ');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('   ::FFFF:255.255.255.255   ');
1 row(s) inserted.

Mach> INSERT INTO ipv6_table VALUES('21DA:D3:0:2F3B:2AA:FF:FE28:9C5A');
1 row(s) inserted.

Mach> SELECT TO_IPV6(id) FROM ipv6_table;
TO_IPV6(id)
---------------------------------------------------------------
21da:d3::2f3b:2aa:ff:fe28:9c5a
::ffff:255.255.255.255
::127.0.0.4
::127.0.0.3
::127.0.0.2
::127.0.0.1
::
[7] row(s) selected.

Mach> INSERT INTO ipv6_table VALUES('127.0.0.10.10');
1 row(s) inserted.

Mach> SELECT TO_IPV6(id) FROM ipv6_table limit 1;
TO_IPV6(id)
---------------------------------------------------------------
[ERR-02148 : Invalid IPv6 address format.(127.0.0.10.10)]
[0] row(s) selected.

Mach> SELECT TO_IPV6_SAFE(id) FROM ipv6_table;
TO_IPV6_SAFE(id)
---------------------------------------------------------------
NULL
21da:d3::2f3b:2aa:ff:fe28:9c5a
::ffff:255.255.255.255
::127.0.0.4
::127.0.0.3
::127.0.0.2
::127.0.0.1
::
[8] row(s) selected.

TO_NUMBER / TO_NUMBER_SAFE

指定した文字列を数値(double)へ変換します。文字列を数値へ変換できない場合、TO_NUMBER()はエラーを返して処理を停止します。

TO_NUMBER_SAFE()はエラー時にNULLを返すため、処理を継続できます。

TO_NUMBER(string_value)
TO_NUMBER_SAFE(string_value)
Mach> CREATE LOG TABLE number_table (id varchar(100));
Created successfully.

Mach> INSERT INTO number_table VALUES('10');
1 row(s) inserted.

Mach> INSERT INTO number_table VALUES('20');
1 row(s) inserted.

Mach> INSERT INTO number_table VALUES('30');
1 row(s) inserted.

Mach> SELECT TO_NUMBER(id) from number_table;
TO_NUMBER(id)
------------------------------
30
20
10
[3] row(s) selected.

Mach> CREATE LOG TABLE safe_table (id varchar(100));
Created successfully.

Mach> INSERT INTO safe_table VALUES('invalidnumber');
1 row(s) inserted.

Mach> SELECT TO_NUMBER(id) from safe_table;
TO_NUMBER(id)
------------------------------
[ERR-02145 : The string cannot be converted to number value.(invalidnumber)]
[0] row(s) selected.

Mach> SELECT TO_NUMBER_SAFE(id) from safe_table;
TO_NUMBER_SAFE(id)
------------------------------
NULL
[1] row(s) selected.

TOP_K

TOP_K(value, k)は、頻度の高いk個の数値をvalue:count形式の文字列で返します。

TOP_K(value, k)
  • valueは数値型である必要があります。
  • kは正の整数定数である必要があります。
  • NULL値は無視します。
  • 戻り値の型はVARCHARです。
  • 頻度の降順、頻度が同じ場合は値の昇順でソートします。
SELECT TOP_K(alarm_code, 3)
FROM event_log;

結果例:

101:532,205:317,301:90

TO_TIMESTAMP

datetime型を1970-01-01 00:00:00 UTCからの経過ナノ秒数へ変換します。

次の例の日付と時刻はUTC+09:00基準です。

TO_TIMESTAMP(datetime_value)
Mach> create table datetime_tbl (c1 datetime);
Created successfully.

Mach> insert into datetime_tbl values ('2010-01-01 10:10:10');
1 row(s) inserted.

Mach> select to_timestamp(c1) from datetime_tbl;
to_timestamp(c1)
-----------------------
1262308210000000000
[1] row(s) selected.

TRUNC

TRUNC関数は、小数点以下n桁で切り捨てた値を返します。

nを省略すると0とみなし、小数部をすべて取り除きます。nが負数の場合は小数点より前の対応する桁で切り捨てます。

TRUNC(number [, n])
Mach> CREATE LOG TABLE trunc_table (i1 DOUBLE);
Created successfully.

Mach> INSERT INTO trunc_table VALUES (158.799);
1 row(s) inserted.

Mach> SELECT TRUNC(i1, 1), TRUNC(i1, -1) FROM trunc_table;
TRUNC(i1, 1)                TRUNC(i1, -1)
-----------------------------------------------------------
158.7                       150
[1] row(s) selected.

Mach> SELECT TRUNC(i1, 2), TRUNC(i1, -2) FROM trunc_table;
TRUNC(i1, 2)                TRUNC(i1, -2)
-----------------------------------------------------------
158.79                      100
[1] row(s) selected.

TS_CHANGE_COUNT

特定列の値の変更回数を求める集約関数です。

入力データの時刻順を保証できないため、1) JOIN、2) インラインビューとは併用できません。VARCHAR型はサポートしません。

  • Cluster Editionでは使用できません。
TS_CHANGE_COUNT(column)
Mach> CREATE LOG TABLE ipcount_table (id INTEGER, ip IPV4);
Created successfully.

Mach> INSERT INTO ipcount_table VALUES (1, '192.168.0.1');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (1, '192.168.0.2');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (1, '192.168.0.1');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (1, '192.168.0.2');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (2, '192.168.0.3');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (2, '192.168.0.3');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (2, '192.168.0.4');
1 row(s) inserted.

Mach> INSERT INTO ipcount_table VALUES (2, '192.168.0.4');
1 row(s) inserted.

Mach> SELECT id, TS_CHANGE_COUNT(ip) from ipcount_table GROUP BY id;
id          TS_CHANGE_COUNT(ip)
------------------------------------
2           2
1           4
[2] row(s) selected.

UNIX_TIMESTAMP

UNIX_TIMESTAMPは、Unixのtime()システムコールを基準にdate型の値を32ビット整数へ変換する関数です。FROM_UNIXTIMEは逆に整数値をdate型へ変換します。

UNIX_TIMESTAMP(datetime_value)
Mach> CREATE table unix_table (c1 int);
Created successfully.

Mach> INSERT INTO unix_table VALUES (UNIX_TIMESTAMP('2001-01-01'));
1 row(s) inserted.

Mach> SELECT * FROM unix_table;
C1
--------------
978274800
[1] row(s) selected.

UPPER

英字文字列を大文字へ変換します。

UPPER(string_value)
Mach> CREATE LOG TABLE upper_table(id INTEGER,name VARCHAR(10));
Created successfully.

Mach> INSERT INTO upper_table VALUES(1, '');
1 row(s) inserted.

Mach> INSERT INTO upper_table VALUES(2, 'James');
1 row(s) inserted.

Mach> INSERT INTO upper_table VALUES(3, 'sarah');
1 row(s) inserted.

Mach> INSERT INTO upper_table VALUES(4, 'THOMAS');
1 row(s) inserted.

Mach> SELECT id, UPPER(name) FROM upper_table;
id          UPPER(name)
----------------------------
4           THOMAS
3           SARAH
2           JAMES
1           NULL
[4] row(s) selected.

VARIANCE / VAR_POP

指定した数値列の分散を返す集約関数です。VARIANCEは標本分散、VAR_POPは母分散を返します。

VARIANCE(column_name)
VAR_POP(column_name)
Mach> CREATE LOG TABLE var_table(c1 INTEGER, c2 DOUBLE);
Created successfully.

Mach> INSERT INTO var_table VALUES (1, 1);
1 row(s) inserted.

Mach> INSERT INTO var_table VALUES (2, 1);
1 row(s) inserted.

Mach> INSERT INTO var_table VALUES (1, 2);
1 row(s) inserted.

Mach> INSERT INTO var_table VALUES (2, 2);
1 row(s) inserted.

Mach> SELECT VARIANCE(c1) FROM var_table;
VARIANCE(c1)
------------------------------
0.333333
[1] row(s) selected.

Mach> SELECT VAR_POP(c1) FROM var_table;
VAR_POP(c1)
------------------------------
0.25
[1] row(s) selected.

YEAR / MONTH / DAY

入力datetime列から年、月、日をそれぞれ抽出して整数で返します。

YEAR(datetime_col)
MONTH(datetime_col)
DAY(datetime_col)
Mach> CREATE LOG TABLE extract_table(c1 DATETIME, c2 INTEGER);
Created successfully.

Mach> INSERT INTO extract_table VALUES (to_date('2001-01-01 12:30:00 000:000:000'), 1);
1 row(s) inserted.

Mach> SELECT YEAR(c1), MONTH(c1), DAY(c1) FROM extract_table;
year(c1)    month(c1)   day(c1)
----------------------------------------
2001        1           1

ISNAN / ISINF

引数の数値がNaNまたはInfか判定します。NaNまたはInfなら1、それ以外は0を返します。

ISNAN(number)
ISINF(number)

次の例は、テーブルにすでにNaNInf値がある場合を想定します。SQL INSERT文でnaninfトークンを直接値として取り込むことはできません。

Mach> SELECT * FROM test;
I1                          I2                          I3
------------------------------------------------------------------------
1                           1                           1
nan                         inf                         0
NULL                        NULL                        NULL
[3] row(s) selected.


Mach> SELECT ISNAN(i1), ISNAN(i2), ISNAN(i3), i3 FROM test ;
ISNAN(i1)   ISNAN(i2)   ISNAN(i3)   i3
-----------------------------------------------------
0           0           0           1
1           0           0           0
NULL        NULL        NULL        NULL
[3] row(s) selected.

Mach> SELECT * FROM test WHERE ISNAN(i1) = 1;
I1                          I2                          I3
------------------------------------------------------------------------
nan                         inf                         0
[1] row(s) selected.

JSON_SET

JSONドキュメントの指定パスにSQLスカラー値をJSONスカラーとして保存します。

JSON_SET(json_doc, path, scalar)
Mach> SELECT JSON_SET('{"ship":{"status":"READY"}}', '$.ship.status', 'DONE') FROM dual;
JSON_SET('{"ship":{"status":"READY"}}', '$.ship.status', 'DONE')
--------------------------------------------------------------------------------
{"ship":{"status":"DONE"}}
[1] row(s) selected.

注意事項:

  • pathには完全なJSONPathを使用してください。
  • JSON_SET(..., path, NULL)はJSONのnullを保存します。
  • JSONドキュメント引数がNULLなら結果はSQL NULLです。
  • pathNULLや空文字列ならエラーになります。
  • オブジェクトのパスを中心にサポートします。
  • 配列要素の更新(例: $.items[0])はサポートしません。

JSON_SET_JSON

第3引数をJSON文字列として解析し、オブジェクトまたは配列のサブツリーを保存します。

JSON_SET_JSON(json_doc, path, json_text)
Mach> SELECT JSON_SET_JSON('{"ship":{}}', '$.ship.owner', '{"name":"machbase"}') FROM dual;
JSON_SET_JSON('{"ship":{}}', '$.ship.owner', '{"name":"machbase"}')
----------------------------------------------------------------------------
{"ship":{"owner":{"name":"machbase"}}}
[1] row(s) selected.

注意事項:

  • pathには完全なJSONPathを使用してください。
  • 第3引数がSQL NULLなら結果はSQL NULLです。
  • 無効なJSON文字列はエラーになります。
  • オブジェクトのパスを中心にサポートします。
  • 配列要素の更新はサポートしません。

JSON_REMOVE

JSONドキュメントから指定メンバーまたは下位パスを削除します。

JSON_REMOVE(json_doc, path)
Mach> SELECT JSON_REMOVE('{"owner":{"name":"machbase","team":"db"}}', '$.owner.team') FROM dual;
JSON_REMOVE('{"owner":{"name":"machbase","team":"db"}}', '$.owner.team')
--------------------------------------------------------------------------
{"owner":{"name":"machbase"}}
[1] row(s) selected.

注意事項:

  • pathには完全なJSONPathを使用してください。
  • 存在しないパスは何も変更しません。
  • JSON_REMOVE(..., '$')は許可しません。
  • JSONドキュメント引数がNULLなら結果はSQL NULLです。

PI()

π定数をDOUBLE型で返します。

SELECT PI();
Mach> SELECT PI();
PI()
------------------------------
3.141592653589793
[1] row(s) selected.

SQRT()

平方根を返します。

SELECT SQRT(9), SQRT(2.25), SQRT(16.0);
Mach> SELECT SQRT(9), SQRT(2.25), SQRT(16.0);
SQRT(9)   SQRT(2.25)         SQRT(16.0)
-----------------------------------------------
3         1.5000000000000000  4
[1] row(s) selected.

POWER()

baseexponent乗を返します。

SELECT POWER(2, 3), POWER(9, 0.5), POWER(4, -1);
Mach> SELECT POWER(2, 3), POWER(9, 0.5), POWER(4, -1);
POWER(2, 3)   POWER(9, 0.5)   POWER(4, -1)
------------------------------------------------
8             3.0000000000000000 0.2500000000000000
[1] row(s) selected.

POW()

POWER()の別名です。

SELECT POW(2, 3), POW(2, -1), POW(10, 0);
Mach> SELECT POW(2, 3), POW(2, -1), POW(10, 0);
POW(2, 3)   POW(2, -1)   POW(10, 0)
-----------------------------------------
8           0.5           1
[1] row(s) selected.

LOG()

LOG(n)は自然対数、LOG(base, n)は指定した底の対数を計算します。

SELECT LOG(2, 8), LOG(100), LOG(10, 1000);
Mach> SELECT LOG(2, 8), LOG(100), LOG(10, 1000);
LOG(2, 8)   LOG(100)             LOG(10, 1000)
------------------------------------------------
3           4.605170185988092     3
[1] row(s) selected.

LN()

自然対数ln(n)を返します。

SELECT LN(1), LN(10), LN(1000);
Mach> SELECT LN(1), LN(10), LN(1000);
LN(1)      LN(10)         LN(1000)
-----------------------------------
0          2.302585092994046 6.907755278982137
[1] row(s) selected.

EXP()

e^nを返します。

SELECT EXP(0), EXP(1), EXP(-1);
Mach> SELECT EXP(0), EXP(1), EXP(-1);
EXP(0)      EXP(1)         EXP(-1)
-----------------------------------
1           2.718281828459045 0.36787944117144233
[1] row(s) selected.

FLOOR()

負の無限大方向へ切り捨てます。

SELECT FLOOR(-1.2), FLOOR(3.9), FLOOR(-3.0);
Mach> SELECT FLOOR(-1.2), FLOOR(3.9), FLOOR(-3.0);
FLOOR(-1.2)  FLOOR(3.9)  FLOOR(-3.0)
-----------------------------------------
-2            3           -3
[1] row(s) selected.

CEIL()

正の無限大方向へ切り上げます。

SELECT CEIL(-1.2), CEIL(3.2), CEIL(-3.0);
Mach> SELECT CEIL(-1.2), CEIL(3.2), CEIL(-3.0);
CEIL(-1.2)  CEIL(3.2)  CEIL(-3.0)
-------------------------------------
-1           4          -3
[1] row(s) selected.

SIN()

ラジアンの入力から正弦を返します。

SELECT SIN(0), SIN(PI()/2), SIN(PI());
Mach> SELECT SIN(0), SIN(PI()/2), SIN(PI());
SIN(0)      SIN(PI()/2)   SIN(PI())
------------------------------------
0           1             0
[1] row(s) selected.

SLOPE

SLOPE(y, x)は、数値の(x, y)点に対する線形回帰直線の傾きを計算します。

SLOPE(y, x)
  • 両方の引数が数値型である必要があります。
  • NULL値は無視します。
  • 有効なデータが不足する場合やxの分散が0の場合、結果はNULLです。
  • 戻り値の型はDOUBLEです。
SELECT SLOPE(temp_c, sample_sec)
FROM sensor_log;

COS()

ラジアンの入力から余弦を返します。

SELECT COS(0), COS(PI()), COS(PI()/2);
Mach> SELECT COS(0), COS(PI()), COS(PI()/2);
COS(0)      COS(PI())   COS(PI()/2)
-------------------------------------
1           -1          0
[1] row(s) selected.

TAN()

ラジアンの入力から正接を返します。

SELECT TAN(0), TAN(PI()/4), TAN(PI());
Mach> SELECT TAN(0), TAN(PI()/4), TAN(PI());
TAN(0)      TAN(PI()/4)  TAN(PI())
-----------------------------------
0           1            0
[1] row(s) selected.

MOD()

商を0方向へ切り捨てて余りを計算します。

SELECT MOD(10, 3), MOD(11, 4), MOD(-10, 3), MOD(3.5, 0.5);
Mach> SELECT MOD(10, 3), MOD(11, 4), MOD(-10, 3), MOD(3.5, 0.5);
MOD(10, 3)  MOD(11, 4)  MOD(-10, 3)  MOD(3.5, 0.5)
-------------------------------------------------------
1           3           -1           0
[1] row(s) selected.

MODE

MODE(value)は入力集合で最も頻度の高い数値を返します。

MODE(value)
  • valueは数値型である必要があります。
  • NULL値は無視します。
  • 最頻値が複数あれば、最小の値を返します。
  • 戻り値の型はDOUBLEです。
SELECT MODE(alarm_code)
FROM event_log;

P05 / P10 / P90 / P95

よく使う分位点を簡潔に表す、正確な分位点計算の短縮関数です。

P05(value)
P10(value)
P90(value)
P95(value)
  • valueは数値型である必要があります。
  • NULL値は無視します。
  • 戻り値の型はDOUBLEです。

P05P10P90P95はそれぞれPERCENTILE_CONT(value, 0.05)0.100.900.95と同じ意味です。

SELECT P05(response_ms),
       P10(response_ms),
       P90(response_ms),
       P95(response_ms)
FROM web_log;

PERCENTILE_CONT / PERCENTILE_DISC

数値入力の正確な分位点を計算する集約関数です。

PERCENTILE_CONT(value, ratio)
PERCENTILE_DISC(value, ratio)
  • valueは数値型である必要があります。
  • ratio0.0以上1.0以下の定数である必要があります。
  • PERCENTILE_CONTは必要に応じてソート済みの隣接値間を補間します。
  • PERCENTILE_DISCは対象順位に対応する実際の観測値を選択します。
  • 両関数とも戻り値の型はDOUBLEです。
SELECT PERCENTILE_CONT(latency_ms, 0.95) AS pcont95,
       PERCENTILE_DISC(latency_ms, 0.95) AS pdisc95
FROM api_log;

QUANTILE

QUANTILE(value, ratio)は数値入力の正確な連続分位点を計算します。

QUANTILE(value, ratio)
  • valueは数値型である必要があります。
  • ratio0.0以上1.0以下の定数である必要があります。
  • 戻り値の型はDOUBLEです。
  • PERCENTILE_CONTと同じ連続分位点の規則を使用します。
SELECT QUANTILE(cpu_usage, 0.75)
FROM host_metric;

RAND()

乱数値を生成します。

SELECT RAND(5) = RAND(5) AS same_seed, RAND(7) = RAND(8) AS diff_seed, RAND() = RAND() AS diff_default;
Mach> SELECT RAND(5) = RAND(5) AS same_seed, RAND(7) = RAND(8) AS diff_seed, RAND() = RAND() AS diff_default FROM m$sys_users WHERE name = 'SYS';
same_seed   diff_seed   diff_default
------------------------------------
1           0           0
[1] row(s) selected.

RAND(seed)は同じシードで同じ値を返します。RAND()はセッションの内部状態に基づいて[0,1)の範囲の値を生成します。

REGEXP_LIKE

REGEXP_LIKEは文字列が正規表現パターンに一致するか検査します。Boolean値を返し、主にWHERE句で使用します。

REGEXP_LIKE(source, pattern)
REGEXP_LIKE(source, pattern, match_param)
  • sourceVARCHARである必要があります。
  • patternは定数のVARCHAR正規表現である必要があります。
  • match_paramは省略可能で、定数のVARCHARを指定します。cは大文字小文字を区別し、iは区別しません。デフォルトはcです。
SELECT *
FROM sensor_text
WHERE REGEXP_LIKE(message, 'error|warn', 'i');

REGEXP_INSTR

REGEXP_INSTRは正規表現に一致する位置を1始まりで返します。一致する値がなければ0を返します。

REGEXP_INSTR(source, pattern[, position[, occurrence[, return_pos[, match_param]]]])
  • sourceVARCHARである必要があります。
  • patternは定数のVARCHAR正規表現である必要があります。
  • positionoccurrence1以上の整数定数です。
  • return_posは整数定数です。0は開始位置、1は一致した文字列の直後の位置を返します。
  • match_paramcまたはiを使用できます。デフォルトはcです。
SELECT REGEXP_INSTR('TechOnTheNet', 'The', 1, 1, 1, 'i');

REGEXP_SUBSTR

REGEXP_SUBSTRは正規表現に一致する部分文字列を返します。

REGEXP_SUBSTR(source, pattern[, position[, occurrence[, match_param]]])
  • sourceVARCHARである必要があります。
  • patternは定数のVARCHAR正規表現である必要があります。
  • positionoccurrence1以上の整数定数です。
  • match_paramcまたはiを使用できます。デフォルトはcです。
SELECT REGEXP_SUBSTR('TechOnTheNet', 'a|e|i|o|u', 1, 2, 'i');

REGEXP_REPLACE

REGEXP_REPLACEは正規表現に一致する文字列を置換します。

REGEXP_REPLACE(source, pattern[, replacement[, position[, occurrence[, match_param]]]])
  • sourceVARCHARである必要があります。
  • patternreplacementは定数のVARCHAR値である必要があります。
  • replacementを省略すると一致文字列を削除します。
  • position1以上の整数定数です。
  • occurrenceは整数定数です。0はすべての一致を置換し、正の値はその番号の一致のみ置換します。
  • match_paramcまたはiを使用できます。デフォルトはcです。
SELECT REGEXP_REPLACE('TechOnTheNet', 'a|e|i|o|u', 'Z', 1, 2, 'i');

組み込み関数の対応する型

ShortIntegerLongFloatDoubleVarcharTextIpv4Ipv6DatetimeBinary
ABSoooooxxxxxx
ADD_TIMExxxxxxxxxox
APPROX_PERCENTILE / APPROX_MEDIAN / APPROX_P05 / APPROX_P10 / APPROX_P90 / APPROX_P95oooooxxxxxx
AREAoooooxxxxxx
AVGoooooxxxxxx
BITAND / BITORoooxxxxxxxx
COUNTooooooxooox
CUME_DISToooooxxxxxx
DATE_TRUNCxxxxxxxxxox
DECODEooooooxoxox
FIRST / LASTooooooxooox
FROM_TIMESTAMPoooooxxxxxx
FROM_UNIXTIMEoooooxxxxxx
GROUP_CONCATooooooxooox
INSTRxxxxxooxxxx
LEAST / GREATESTooooooxxxxx
LENGTHxxxxxooxxxo
LOWERxxxxxoxxxxx
LPAD / RPADxxxxxoxxxxx
LTRIM / RTRIMxxxxxoxxxxx
MAXooooooxooox
MEDIANoooooxxxxxx
MINooooooxooox
MODEoooooxxxxxx
NVLxxxxxoxoxxx
P05 / P10 / P90 / P95oooooxxxxxx
PERCENTILE_CONT / PERCENTILE_DISCoooooxxxxxx
QUANTILEoooooxxxxxx
REGEXP_LIKExxxxxoxxxxx
REGEXP_INSTRxxxxxoxxxxx
REGEXP_SUBSTRxxxxxoxxxxx
REGEXP_REPLACExxxxxoxxxxx
SLOPEoooooxxxxxx
TOP_Koooooxxxxxx
ROUNDoooooxxxxxx
ROWNUMooooooooooo
SERIESNUMooooooooooo
STDDEV / STDDEV_POPoooooxxxxxx
SUBSTRxxxxxoxxxxx
SUBSTRING_INDEXxxxxxooxxxx
SUMoooooxxxxxx
SYSDATE / NOWxxxxxxxxxxx
TO_CHARooooooxooox
TO_DATE / TO_DATE_SAFExxxxxoxxxxx
TO_HEXooooooooooo
TO_INET_STRxxxxxxxoxxx
TO_IPV4 / TO_IPV4_SAFExxxxxoxxxxx
TO_IPV6 / TO_IPV6_SAFExxxxxoxxxxx
TO_NUMBER / TO_NUMBER_SAFExxxxxoxxxxx
TO_TIMESTAMPxxxxxxxxxox
TRUNCoooooxxxxxx
TS_CHANGE_COUNToooooxxooox
UNIX_TIMESTAMPxxxxxxxxxox
UPPERxxxxxoxxxxx
VARIANCE / VAR_POPoooooxxxxxx
YEAR / MONTH / DAYxxxxxxxxxox
ISNAN / ISINFoooooxxxxxx

JSON関連関数

これらの関数はJSONデータ型を引数に取ります。

関数名説明備考
JSON_EXTRACT(JSON column name, ‘json path’)値を文字列型で返します。
値がなければERRORを返します。
- JSON object or array: すべてのオブジェクトを文字列へ変換して返します。
- String type: そのまま返します。
- Numeric type: 文字列へ変換して返します。
- boolean type: “True"または"False"を返します。
JSON_EXTRACT_DOUBLE(JSON column name, ‘json path’)値を64ビットdouble型で返します。
値がなければNULLを返します。
- JSON object or array: NULLを返します。
- String type: 変換可能なら変換して返し、不可能ならNULLを返します。
- Numeric type: 64ビット実数で返します。
- boolean type: “True"は1.0、“False"は0.0を返します。
JSON_EXTRACT_INTEGER(JSON column name, ‘json path’)値を64ビット整数型で返します。
値がなければNULLを返します。
- JSON object or array: NULLを返します。
- String type: 変換可能なら変換して返し、不可能ならNULLを返します。
- Numeric type: 64ビット整数で返します。
- boolean type: “True"は1、“False"は0を返します。
JSON_EXTRACT_STRING(JSON column name, ‘json path’)値を文字列型で返します。
値がなければNULLを返します。
矢印演算子(→)と同じ結果を返します。
- JSON object or array: すべてのオブジェクトを文字列へ変換して返します。
- String type: そのまま返します。
- Numeric type: 文字列へ変換して返します。
- boolean type: “True"または"False"を返します。
JSON_SET(json_doc, path, scalar)指定パスにSQLスカラー値をJSONスカラーとして保存した新しいJSONドキュメントを返します。- pathは完全なJSONPathを使用します。
- NULL値はJSONのnullとして保存します。
- オブジェクトのパスのみサポートします。
JSON_SET_JSON(json_doc, path, json_text)指定パスにJSON文字列をオブジェクトまたは配列のサブツリーとして保存した新しいJSONドキュメントを返します。- pathは完全なJSONPathを使用します。
- 第3引数がSQL NULLなら結果はSQL NULLです。
- 無効なJSON文字列はエラーになります。
JSON_REMOVE(json_doc, path)指定パスのメンバーまたはサブツリーを削除した新しいJSONドキュメントを返します。- pathは完全なJSONPathを使用します。
- 存在しないパスは何も変更しません。
- JSON_REMOVE(..., '$')は許可しません。
JSON_IS_VALID(‘json string’)JSON文字列が正しい形式か確認します。- 0: False
- 1: True
JSON_TYPEOF(JSON column name, ‘json path’)値の型を返します。- None: キーが存在しない
- Object: オブジェクト型
- Integer: 整数型
- Real: 実数型
- String: 文字列型
- True/False: Boolean
- Array: 配列型
- Null: NULL
Mach> CREATE LOG TABLE jsontbl (name VARCHAR(20), jval JSON);
Created successfully.

Mach> INSERT INTO jsontbl VALUES("name1", '{"name":"test1"}');
1 row(s) inserted.
Mach> INSERT INTO jsontbl VALUES("name2", '{"name":"test2", "value":123}');
1 row(s) inserted.
Mach> INSERT INTO jsontbl VALUES("name3", '{"name":{"class1": "test3"}}');
1 row(s) inserted.
Mach> INSERT INTO jsontbl VALUES("name4", '{"myarray": [1, 2, 3, 4]}');
1 row(s) inserted.
Mach> INSERT INTO jsontbl VALUES("name5", '{"name":"error"');
[ERR-02233: Error occurred at column (2): (Error in json load.)]

Mach> SELECT name, JSON_EXTRACT_STRING(jval, '$.name') FROM jsontbl;
name                  JSON_EXTRACT_STRING(jval, '$.name')
-----------------------------------------------------------------------------------------------------------
name4                 NULL
name3                 {"class1": "test3"}
name2                 test2
name1                 test1
[4] row(s) selected.

Mach> SELECT name, JSON_EXTRACT_INTEGER(jval, '$.myarray[1]') FROM jsontbl;
name                  JSON_EXTRACT_INTEGER(jval, '$.myarray[1]')
--------------------------------------------------------------------
name4                 2
name3                 NULL
name2                 NULL
name1                 NULL
[4] row(s) selected.

Mach> SELECT name, JSON_TYPEOF(jval, '$.name') FROM jsontbl;
name                  JSON_TYPEOF(jval, '$.name')
-----------------------------------------------------------------------------------------------------------
name4                 None
name3                 Object
name2                 String
name1                 String
[4] row(s) selected.

JSON演算子

->演算子はJSONデータのオブジェクトへのアクセスに使用します。

JSON_EXTRACT_STRING関数と同じ結果を返します。

json_col -> 'json path'

JSON列のメンバー値には、JSONPathを使用する->演算子とドットの省略構文でアクセスできます。

-- JSONPathの矢印構文
jval->'$.sensor.temperature'

-- JSONドット省略構文
jval.sensor.temperature

2つの式は同じJSON値を参照します。既存の->演算子は引き続き使用でき、ドット構文は同じ値をより短く表すための追加構文です。

Mach> SELECT name, jval->'$.name' FROM jsontbl;
name                  JSON_EXTRACT_STRING(jval, '$.name')
-----------------------------------------------------------------------------------------------------------
name4                 NULL
name3                 {"class1": "test3"}
name2                 test2
name1                 test1
[4] row(s) selected.

Mach> SELECT name, jval->'$.myarray[1]' FROM jsontbl;
name                  JSON_EXTRACT_INTEGER(jval, '$.myarray[1]')
--------------------------------------------------------------------
name4                 2
name3                 NULL
name2                 NULL
name1                 NULL
[4] row(s) selected.

Mach> SELECT name, jval->'$.name.class1' FROM jsontbl;
name                  jval->'$.name.class1'
-----------------------------------------------------------------------------------------------------------
name4                 NULL
name3                 test3
name2                 NULL
name1                 NULL
[4] row(s) selected

JSONPathの矢印構文

矢印構文はJSONPath文字列を使用します。

jval->'$.name'
jval->'$.sensor.temperature'
jval->'$.items[0].name'

角括弧でJSONキーを直接指定することもできます。キー名にドット(.)を含む場合は角括弧構文を使用します。

-- キー名がa.bの場合
jval->'$["a.b"]'
jval->'$[a.b]'

-- 複数階層のキーを角括弧で指定
jval->'$[Plant1][Line1][Temperature]'

-- ドットを含む1つのキー名
jval->'$[Plant1.Line1.Temperature]'

$[Plant1.Line1.Temperature]Plant1.Line1.Temperatureという1つのキーを検索します。Plant1Line1Temperatureを階層ごとのキーとして検索するには、$[Plant1][Line1][Temperature]または$.Plant1.Line1.Temperatureを使用します。

キー名に特殊文字やドットを含む場合は、次のように引用符付きの角括弧構文を推奨します。

jval->'$["a.b"]["c.d"]["e.f"]'

次の構文はサポートしません。

jval->'$."a.b"'

JSONドット省略構文

JSON列の後にメンバー名を付けてJSON値を参照できます。

-- 単一メンバー
jval.name

-- 入れ子のメンバー
jval.sensor.temperature

-- 配列の添字
jval.items[0].name

-- 特殊文字を含むキー
jval.items[0]."product-id"

ドット構文で二重引用符で囲んだキーは、大文字小文字と特殊文字をそのまま保持します。

SELECT name, jval."Camel-Key", jval.items[0]."product-id"
  FROM jsontbl
 ORDER BY name;

WHERE句での型比較

JSONメンバーのアクセス結果は参照時に文字列のように表示されます。ただし、WHERE句で数値型の値と比較すると、JSON値を数値として解析し、数値比較を行います。

SELECT name
  FROM jsontbl
 WHERE jval->'$.value' > 100
 ORDER BY name;

SELECT name
  FROM jsontbl
 WHERE jval.value BETWEEN 10 AND 30
 ORDER BY name;

SELECT name
  FROM jsontbl
 WHERE jval.value IN (10, 20, 30)
 ORDER BY name;

次の比較に対応します。

  • JSON integer値とSQL integer値の比較
  • JSON real/double値とSQL numeric値の比較
  • JSON数値文字列とSQL numeric値の比較
  • JSON boolean値と文字列'true''false'の比較
  • =<><<=>>=BETWEEN、リテラルのIN (...)

SQL integer値との比較ではJSON integerを整数として比較するため、90071992547409929007199254740993のようにdoubleの精度範囲を超える値も区別できます。

文字型の値との比較では、従来どおり文字列比較を行います。

SELECT name
  FROM jsontbl
 WHERE jval->'$.name' = 'test1'
 ORDER BY name;

数値比較でJSON値を数値として解釈できない場合、その条件には一致せず、エラーにはなりません。通常のVARCHAR列と数値の比較ポリシーは変更せず、自動数値比較はJSONメンバーアクセス式にのみ適用します。

名前解決規則

通常のSQL列名の解決は、JSONドットの解釈より優先されます。

SELECT t.jval.name
  FROM jsontbl t;

上記の式は、最初に通常の列名として解決を試みます。通常の列として解決できず、jvalがJSON列であれば、jval.nameをJSONメンバーへのアクセスとして扱います。

JSONドットアクセスは、JSON列を基点としてのみ使用できます。

-- 非対応
(jval->'$.sensor').temperature
name.member

制約

次の構文はサポートしません。

  • ワイルドカード: jval.items[*].name
  • 再帰的下降: jval..name
  • フィルター式: jval.items[?(@.price > 10)]
  • 負数の配列添字: jval.items[-1]
  • 単一引用符のキー: jval.'product-id'
  • ドット構文と矢印構文の混在: jval.items->'$.name'
  • JSON以外の列へのドットアクセス: name.member
  • 任意の式の後のドットアクセス: (jval->'$.sensor').temperature
  • 矢印パス内の引用符付きメンバー: jval->'$."a.b"'

IN (SELECT ...)形式のサブクエリINでは、JSONメンバー値の自動数値比較はサポートしません。リテラルのIN (...)を使用してください。

ウィンドウ関数

ウィンドウ関数は、行間の比較、計算、定義を行う関数で、分析関数やランキング関数とも呼ばれます。

SELECT文でのみ使用できます。

ウィンドウ関数の構文

ウィンドウ関数には必ずOVER句を含めます。

WINDOW_FUNCTION (ARGUMENTS) OVER ([PARTITION BY column_name] [ORDER BY column_name])
  • WINDOW_FUNCTION: ウィンドウ関数名
  • ARGUMENTS: 関数に応じて0~N個の引数を指定できます。
  • PARTITION BY clause: 全体集合を基準に応じて小さなグループへ分割します(省略可能)。
  • ORDER BY clause: ソート基準となるORDER BY句を指定します(省略可能)。

ウィンドウ関数一覧

LAG

パーティションごとのウィンドウからN行前の値を取得します。

対象行がなければNULLを返します。

LAG(column_name, N) OVER ([PARTITION BY column_name] [ORDER BY column_name])
Mach> CREATE LOG TABLE lag_table (name varchar(10), dt datetime, value INTEGER);
Created successfully.

Mach> INSERT INTO lag_table VALUES('name1', TO_DATE('2024-01-01'), 1);
1 row(s) inserted.

Mach> INSERT INTO lag_table VALUES('name1', TO_DATE('2024-01-02'), 2);
1 row(s) inserted.

Mach> INSERT INTO lag_table VALUES('name1', TO_DATE('2024-01-03'), 3);
1 row(s) inserted.

-- Divide the set by name, sort by dt, and retrieve the first previous value.
Mach> SELECT name, dt, value, LAG(value, 1) OVER(PARTITION BY name ORDER BY dt) FROM lag_table;
name        dt                              value       LAG(value, 1)
---------------------------------------------------------------------------
name1       2024-01-01 00:00:00 000:000:000 1           NULL
name1       2024-01-02 00:00:00 000:000:000 2           1
name1       2024-01-03 00:00:00 000:000:000 3           2
[3] row(s) selected.

LEAD

パーティションごとのウィンドウからN行後の値を取得します。

対象行がなければNULLを返します。

LEAD(column_name, N) OVER ([PARTITION BY column_name] [ORDER BY column_name])
Mach> CREATE LOG TABLE lead_table (name varchar(10), dt datetime, value INTEGER);
Created successfully.

Mach> INSERT INTO lead_table VALUES('name1', TO_DATE('2024-01-01'), 1);
1 row(s) inserted.

Mach> INSERT INTO lead_table VALUES('name1', TO_DATE('2024-01-02'), 2);
1 row(s) inserted.

Mach> INSERT INTO lead_table VALUES('name1', TO_DATE('2024-01-03'), 3);
1 row(s) inserted.

-- Divide the set by name, sort by dt, and retrieve the first and subsequent values.
Mach> SELECT name, dt, value, LEAD(value, 1) OVER(PARTITION BY name ORDER BY dt) FROM lead_table;
name        dt                              value       LEAD(value, 1)
----------------------------------------------------------------------------
name1       2024-01-01 00:00:00 000:000:000 1           2
name1       2024-01-02 00:00:00 000:000:000 2           3
name1       2024-01-03 00:00:00 000:000:000 3           NULL
[3] row(s) selected.

NTILE

NTILE(n)はソートされた行を可能な限り均等にn個のバケットへ分け、各行が属するバケット番号を返します。

NTILE(n) OVER ([PARTITION BY column_name] ORDER BY column_name)
  • nは正の定数である必要があります。
  • OVER (...)内のORDER BYは必須です。
  • 行数が均等に分かれない場合、先頭側のバケットが1行ずつ多くなります。
Mach> SELECT user_id,
             score,
             NTILE(4) OVER (ORDER BY score) AS score_band
      FROM exam_result;
最終更新日