TSQL では、集計関数、数学関数、三角関数、文字列関数、タイムスタンプ関数、およびデータ型変換関数をサポートしています。
集計関数
| 関数 | サポートされるデータ型 | 戻り値の型 | 説明 |
|---|---|---|---|
avg(expression) | SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE | 入力と同一 | 式の値の平均 |
count(*) | 該当なし | BIGINT | 行の合計数 |
count(expression) | すべてのデータ型 | BIGINT | NULL でない値の個数 |
count(distinct expression) | すべてのデータ型 | 該当なし | 一意の NULL でない値の個数 |
max(expression) | SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、VARCHAR | 入力と同一 | 最大値 |
min(expression) | SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、VARCHAR | 入力と同一 | 最小値 |
ts_last(expression, timestamp) | expression:DOUBLE、VARCHAR、BOOLEAN;timestamp:TIMESTAMP | expression の型と同一 | 最新のタイムスタンプにおける値 |
ts_first(expression, timestamp) | expression:DOUBLE、VARCHAR、BOOLEAN;timestamp:TIMESTAMP | expression の型と同一 | 最も早いタイムスタンプにおける値 |
時系列集計関数
ts_first および ts_last は、時系列データ向けに設計されています。一方、min および max はグループ内の最小または最大値を返しますが、これらの関数は特定の時点(結果セット内の最も早いタイムスタンプ:ts_first、または最も遅いタイムスタンプ:ts_last)に関連付けられた値を返します。最小値または最大値ではなく、最初または最後に記録された測定値を取得する場合に使用します。
数学関数
ほとんどの数学関数は、INTEGER、BIGINT、FLOAT、DOUBLE、SMALLINT を入力として受け付けます。三角関数 で、サポートされる三角関数の完全な一覧をご確認ください。
| 関数 | 戻り値の型 | 説明 |
|---|---|---|
ABS(x) | 入力と同一 | x の絶対値 |
CBRT(x) | FLOAT8 | x の立方根 |
CEIL(x) | 入力と同一 | x 以上で最小の整数 |
CEILING(x) | 入力と同一 | CEIL(x) |
DEGREES(x) | FLOAT8 | x をラジアンから度に変換 |
E() | FLOAT8 | オイラー数:2.718281828459045 |
EXP(x) | FLOAT8 | e の x 乗 |
FLOOR(x) | 入力と同一 | x 以下で最大の整数 |
LOG(x) | FLOAT8 | x の自然対数(底 e) |
LOG(x, y) | FLOAT8 | 底 x における y の対数 |
LOG10(x) | FLOAT8 | x の常用対数(底 10) |
LSHIFT(x, y) | 入力と同一 | x を y ビット左シフト |
MOD(x, y) | FLOAT8 | x を y で割った余り |
NEGATIVE(x) | 入力と同一 | x の符号反転 |
PI | FLOAT8 | 円周率 π |
POW(x, y) | FLOAT8 | x の y 乗 |
RADIANS(x) | FLOAT8 | x を度からラジアンに変換 |
RAND | FLOAT8 | [0, 1) の範囲の乱数 |
ROUND(x) | 入力と同一 | x を最も近い整数に四捨五入 |
RSHIFT(x, y) | 入力と同一 | x を y ビット右シフト |
SIGN(x) | INT | x の符号:-1、0、または 1 |
SQRT(x) | 入力と同一 | x の平方根 |
TRUNC(x, y) | DOUBLE | x を小数点以下 y 桁で切り捨て(デフォルト:0) |
例
以下の例では、math_func_demo テーブルを使用します:
SELECT * FROM math_func_demo;
+---------------+-----------------------+
| integer | float |
+---------------+-----------------------+
| 2010 | 17.4 |
| -2002 | -1.2 |
| 2001 | 1.2 |
| 6005 | 1.2 |
+---------------+-----------------------+ABS(x) — 整数列の絶対値:
SELECT ABS(`integer`) AS abs_value FROM math_func_demo;
+------------+
| abs_value |
+------------+
| 2010 |
| 2002 |
| 2001 |
| 6005 |
+------------+
4 行が選択されました(0.357 秒)CEIL(x) — 各浮動小数点数を最も近い整数に切り上げ:
SELECT CEIL(`float`) AS ceil_value FROM math_func_demo;
+------------+
| ceil_value |
+------------+
| 18.0 |
| -1.0 |
| 2.0 |
| 2.0 |
+------------+
4 行が選択されました(0.647 秒)FLOOR(x) — 各浮動小数点数を最も近い整数に切り下げ:
SELECT FLOOR(`float`) AS floor_value FROM math_func_demo;
+-------------+
| floor_value |
+-------------+
| 17.0 |
| -2.0 |
| 1.0 |
| 1.0 |
+-------------+
4 行が選択されました(0.11 秒)ROUND(x) — 最も近い整数に丸め;ROUND(x, y) — 小数点以下 y 桁に丸め:
SELECT ROUND(`float`) AS rounded FROM math_func_demo;
+---------+
| rounded |
+---------+
| 3.0 |
| -1.0 |
| 1.0 |
| 1.0 |
+---------+
4 行が選択されました(0.061 秒)
SELECT ROUND(`float`, 4) AS rounded_4dp FROM math_func_demo;
+-------------+
| rounded_4dp |
+-------------+
| 3.1416 |
| -1.2 |
| 1.2 |
| 1.2 |
+-------------+
4 行が選択されました(0.059 秒)LOG(x, y)、LOG10(x)、LOG(x) — 指定した底の対数、常用対数、自然対数:
SELECT LOG(2, 64) AS log2_64 FROM (VALUES(1));
+---------+
| log2_64 |
+---------+
| 6.0 |
+---------+
1 行が選択されました(0.069 秒)
SELECT LOG10(100) AS log10_100 FROM (VALUES(1));
+-----------+
| log10_100 |
+-----------+
| 2.0 |
+-----------+
1 行が選択されました(0.203 秒)
SELECT LOG(7.5) AS ln_7_5 FROM (VALUES(1));
+---------------------+
| ln_7_5 |
+---------------------+
| 2.0149030205422647 |
+---------------------+
1 行が選択されました(0.139 秒)三角関数
すべての三角関数は、INTEGER、BIGINT、FLOAT、DOUBLE、SMALLINT を入力として受け付け、FLOAT8 を返します。
| 関数 | 説明 |
|---|---|
SIN(x) | x の正弦 |
COS(x) | x の余弦 |
TAN(x) | x の正接 |
ASIN(x) | x の逆正弦 |
ACOS(x) | x の逆余弦 |
ATAN(x) | x の逆正接 |
SINH(x) | x の双曲正弦 |
COSH(x) | x の双曲余弦 |
TANH(x) | x の双曲正接 |
例
45 度をラジアンに変換し、その後その正弦および正接を計算します:
SELECT RADIANS(45) AS radians_45 FROM (VALUES(1));
+--------------------+
| radians_45 |
+--------------------+
| 0.7853981633974483 |
+--------------------+
1 行が選択されました(0.045 秒)
SELECT SIN(0.7853981633974483) AS sin_45 FROM (VALUES(1));
+--------------------+
| sin_45 |
+--------------------+
| 0.7071067811865475 |
+--------------------+
1 行が選択されました(0.059 秒)
SELECT TAN(0.7853981633974483) AS tan_45 FROM (VALUES(1));
+--------------------+
| tan_45 |
+--------------------+
| 0.9999999999999999 |
+--------------------+文字列関数
| 関数 | 構文 | 戻り値の型 | 説明 |
|---|---|---|---|
CONCAT | CONCAT(string [, string [, ...]]) | VARCHAR | 文字列を連結 |
INITCAP | INITCAP(string) | VARCHAR | 各単語の先頭文字を大文字にし、残りを小文字にする |
LENGTH | LENGTH(string [, encoding]) | INTEGER | 文字数 |
LOWER | LOWER(string) | VARCHAR | 小文字に変換 |
LPAD | LPAD(string, length [, fill]) | VARCHAR | 指定された長さまで左側を埋める。結果が長さを超える場合は切り捨て |
LTRIM | LTRIM(string1, string2) | VARCHAR | string2 に含まれる文字を string1 の左端から削除 |
REGEXP_REPLACE | REGEXP_REPLACE(source, pattern, replacement) | VARCHAR | Java 正規表現パターンに一致するすべての箇所を置き換え |
RPAD | RPAD(string, length [, fill]) | VARCHAR | 指定された長さまで右側を埋める。結果が長さを超える場合は切り捨て |
RTRIM | RTRIM(string1, string2) | VARCHAR | string2 に含まれる文字を string1 の右端から削除 |
STRPOS | STRPOS(string, substring) | INTEGER | 文字列中の部分文字列の位置 |
SUBSTR | SUBSTR(string, x [, y]) | VARCHAR | インデックス x から始まる部分文字列。オプションでインデックス y で終了 |
TRIM | TRIM([leading | trailing | both] [string1] FROM string2) | VARCHAR | 左端、右端、または両端から文字を削除 |
UPPER | UPPER(string) | VARCHAR | 大文字に変換 |
例
CONCAT — 複数の文字列を連結:
SELECT CONCAT('Drill', ' ', 1.0, ' ', 'release') AS result FROM (VALUES(1));
+----------------+
| result |
+----------------+
| Drill 1.0 release |
+----------------+
1 行が選択されました(0.134 秒)INITCAP — 各単語の先頭文字を大文字にする:
SELECT INITCAP('china beijing') AS result FROM (VALUES(1));
+--------------+
| result |
+--------------+
| China Beijing |
+--------------+
1 行が選択されました(0.106 秒)LENGTH — 文字列の文字数をカウント:
SELECT LENGTH('Hangzhou') AS char_count FROM (VALUES(1));
+------------+
| char_count |
+------------+
| 8 |
+------------+
1 行が選択されました(0.127 秒)LOWER — 小文字に変換:
SELECT LOWER('China Beijing') AS result FROM (VALUES(1));
+---------------+
| result |
+---------------+
| china beijing |
+---------------+
1 行が選択されました(0.103 秒)LPAD — 'hi' を長さ 5 に左詰めし、埋め込みテキストとして 'xy' を使用します:
SELECT LPAD('hi', 5, 'xy') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| xyxhi |
+--------+
1 行が選択されました(0.132 秒)LTRIM — 先頭の文字を削除:
SELECT LTRIM('zzzytest', 'xyz') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| test |
+--------+
1 行が選択されました(0.131 秒)REGEXP_REPLACE — Java 正規表現パターンに一致する箇所を置き換え。最初の例では、各 'a' を 'b' に置き換えます。2 番目の例では、パターン 'a.' を使用して、'a' の後に任意の文字が続く箇所をマッチさせます:
SELECT REGEXP_REPLACE('abc, acd, ade, aef', 'a', 'b') AS result FROM (VALUES(1));
+---------------------+
| result |
+---------------------+
| bbc, bcd, bde, bef |
+---------------------+
1 行が選択されました(0.105 秒)
SELECT REGEXP_REPLACE('abc, acd, ade, aef', 'a.', 'b') AS result FROM (VALUES(1));
+-----------------+
| result |
+-----------------+
| bc, bd, be, bf |
+-----------------+
1 行が選択されました(0.113 秒)RPAD — 埋め込みテキスト 'hi' を長さ 5 まで右側に埋め、埋め込みテキストとして 'xy' を使用:
SELECT RPAD('hi', 5, 'xy') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| hixyx |
+--------+
1 行が選択されました(0.107 秒)RTRIM — 末尾の文字を削除:
SELECT RTRIM('testxxzx', 'xyz') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| tes |
+--------+
1 行が選択されました(0.102 秒)STRPOS — 部分文字列の位置を検索:
SELECT STRPOS('high', 'ig') AS position FROM (VALUES(1));
+----------+
| position |
+----------+
| 2 |
+----------+
1 行が選択されました(0.22 秒)SUBSTR — インデックス 7 から始まる部分文字列、またはインデックス 3 から 4 までの部分文字列を抽出:
SELECT SUBSTR('China Beijing', 7) AS result FROM (VALUES(1));
+---------+
| result |
+---------+
| Beijing |
+---------+
1 行が選択されました(0.134 秒)
SELECT SUBSTR('China Beijing', 3, 2) AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| in |
+--------+
1 行が選択されました(0.129 秒)TRIM — 末尾、両端、または先頭から文字を削除:
SELECT TRIM(trailing 'A' FROM 'AABBAA') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| AABB |
+--------+
1 行が選択されました(0.172 秒)
SELECT TRIM(both 'A' FROM 'AABBAA') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| BB |
+--------+
1 行が選択されました(0.104 秒)
SELECT TRIM(leading 'A' FROM 'AABBAA') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| BBAA |
+--------+
1 行が選択されました(0.101 秒)UPPER — 大文字に変換:
SELECT UPPER('china beijing') AS result FROM (VALUES(1));
+---------------+
| result |
+---------------+
| CHINA BEIJING |
+---------------+
1 行が選択されました(0.081 秒)タイムスタンプ関数
| 関数 | 戻り値の型 | 説明 | 例 |
|---|---|---|---|
now() | TIMESTAMP | 現在のタイムスタンプ | now() |
CURRENT_TIMESTAMP | TIMESTAMP | 現在のタイムスタンプ | CURRENT_TIMESTAMP |
CURRENT_DATE | DATE | 現在の日付 | CURRENT_DATE |
CURRENT_TIME | TIME | 日付を含まない現在の時刻 | — |
EXTRACT(component FROM timestamp|date|time) | INTEGER | 年、月、日、時、分、秒を抽出 | EXTRACT(day FROM 'timestamp') |
tumble(timestamp, interval) | TIMESTAMP | 指定されたタイムスタンプを含むタンブリング ウィンドウの下限境界 | tumble('timestamp', interval '5' minute) |
date_diff(timestamp, interval) | TIMESTAMP | タイムスタンプから間隔を減算 | date_diff(timestamp, interval '5' minute) |
date_add(timestamp, interval) | TIMESTAMP | タイムスタンプに間隔を加算 | date_add(timestamp, interval '5' minute) |
例
SELECT CURRENT_DATE FROM (VALUES(1));
+---------------+
| CURRENT_DATE |
+---------------+
| 2019-11-27 |
+---------------+時刻値から時を抽出:
SELECT EXTRACT(hour FROM TIME '17:12:28.5') AS hour FROM (VALUES(1));
+------+
| hour |
+------+
| 17 |
+------+タイムスタンプから秒を抽出:
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40') AS second FROM (VALUES(1));
+--------+
| second |
+--------+
| 40.0 |
+--------+タイムスタンプから 5 分を減算:
SELECT DATE_DIFF(TIMESTAMP '2001-02-16 20:38:40', interval '5' minute) AS result FROM (VALUES(1));
+------------------------+
| result |
+------------------------+
| 2001-02-16 20:33:40.0 |
+------------------------+タイムスタンプに 5 分を加算:
SELECT DATE_ADD(TIMESTAMP '2001-02-16 20:38:40', interval '5' minute) AS result FROM (VALUES(1));
+------------------------+
| result |
+------------------------+
| 2001-02-16 20:43:40.0 |
+------------------------+タイムスタンプを含む 5 分間のタンブリング ウィンドウの下限境界を取得:
SELECT tumble(TIMESTAMP '2001-02-16 20:38:40', interval '5' minute) AS window_start FROM (VALUES(1));
+------------------------+
| window_start |
+------------------------+
| 2001-02-16 20:35:00.0 |
+------------------------+データ型変換関数
CAST
CAST は、式をあるデータ型から別のデータ型に変換します。
構文:
CAST (<expression> AS <data type>)| パラメーター | 説明 |
|---|---|
expression | 評価する値、または演算子と SQL 関数の組み合わせ |
data type | INTEGER や DATE などのターゲットとなるデータ型 |
例 — 数値を VARCHAR および CHAR に変換:
SELECT CAST(456 AS VARCHAR(3)) AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| 456 |
+--------+
1 行が選択されました(0.08 秒)
SELECT CAST(456 AS CHAR(3)) AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| 456 |
+--------+
1 行が選択されました(0.093 秒)日付および時刻の変換関数
TSQL は、以下の日付および時刻の形式をネイティブで解析します:
2008-12-1522:55:55.123…
その他の形式については、以下の変換関数を使用して、TIMESTAMP、DATE、TIME、INTEGER、FLOAT、DOUBLE、VARCHAR 間で変換を行います。
| 関数 | 戻り値の型 |
|---|---|
TO_CHAR(expression, format) | VARCHAR |
TO_DATE(expression, format) | DATE |
TO_TIMESTAMP(VARCHAR, format) | TIMESTAMP |
TO_TIMESTAMP(DOUBLE) | TIMESTAMP |
書式指定子
これらの関数では、Joda-Time の書式指定子を使用します。
| 記号 | 意味 | プレゼンテーション | 例 |
|---|---|---|---|
G | 時代 | テキスト | AD |
C | 世紀(>=0) | 番号 | 20 |
Y | 時代区分における年(>=0) | 年 | 1996 |
x | 週年(Week year) | 年 | 1996 |
w | 週年における週 | 番号 | 27 |
e | 曜日 | 番号 | 2 |
E | 曜日 | テキスト | 火曜日; 火 |
y | 年 | 年 | 1996 |
D | 年の日付 | 番号 | 189 |
M | 月 | 月 | July;Jul;07 |
d | 月の日付 | 番号 | 10 |
a | 午前/午後 | テキスト | PM |
K | 午前/午後の時(0–11) | 番号 | 0 |
h | 半日の時刻(1~12) | 数値 | 12 |
H | 1 日の時(0–23) | 数値 | 0 |
k | 1 日の時(1–24) | 数値 | 24 |
m | 時の分 | 数値 | 30 |
s | 分の秒 | 数値 | 55 |
S | 秒の小数部 | 番号 | 978 |
z | タイムゾーン | テキスト | Pacific Standard Time;PST |
Z | タイムゾーンオフセット/ID | ゾーン | -0800;-08:00;America/Los_Angeles |
' | テキスト区切り文字のエスケープ | リテラル | — |
TO_CHAR の例
数値を書式付き文字列に変換:
SELECT TO_CHAR(1256.789383, '#,###.###') AS result FROM (VALUES(1));
+-----------+
| result |
+-----------+
| 1,256.789 |
+-----------+
1 行が選択されました(1.767 秒)
SELECT TO_CHAR(125677.4567, '#,###.###') AS result FROM (VALUES(1));
+-------------+
| result |
+-------------+
| 125,677.457 |
+-------------+
1 行が選択されました(0.083 秒)DATE を書式付き文字列に変換:
SELECT TO_CHAR((CAST('2008-2-23' AS DATE)), 'yyyy-MMM-dd') AS result FROM (VALUES(1));
+-------------+
| result |
+-------------+
| 2008-Feb-23 |
+-------------+
1 行が選択されました(0.166 秒)TIME を書式付き文字列に変換:
SELECT TO_CHAR(CAST('12:20:30' AS TIME), 'HH mm ss') AS result FROM (VALUES(1));
+--------+
| result |
+--------+
| 12 20 30 |
+--------+
1 行が選択されました(0.07 秒)TIMESTAMP を書式付き文字列に変換:
SELECT TO_CHAR(CAST('2015-2-23 12:00:00' AS TIMESTAMP), 'yyyy MMM dd HH:mm:ss') AS result FROM (VALUES(1));
+---------------------+
| result |
+---------------------+
| 2015 Feb 23 12:00:00 |
+---------------------+
1 行が選択されました(0.142 秒)TO_DATE の例
文字列を日付に変換:
SELECT TO_DATE('2015-FEB-23', 'yyyy-MMM-dd') AS result FROM (VALUES(1));
+------------+
| result |
+------------+
| 2015-02-23 |
+------------+
1 行が選択されました(0.077 秒)変換された日付から年を抽出:
SELECT EXTRACT(year FROM mydate) AS extracted_year
FROM (SELECT TO_DATE('2015-FEB-23', 'yyyy-MMM-dd') AS mydate FROM (VALUES(1)));
+----------------+
| extracted_year |
+----------------+
| 2015 |
+----------------+
1 行が選択されました(0.128 秒)UNIX タイムスタンプ(ミリ秒)を日付に変換:
SELECT TO_DATE(1427849046000) AS result FROM (VALUES(1));
+------------+
| result |
+------------+
| 2015-04-01 |
+------------+
1 行が選択されました(0.082 秒)TO_TIME の例
ミリ秒を時刻値に変換:
SELECT to_time(82855000) AS result FROM (VALUES(1));
+----------+
| result |
+----------+
| 23:00:55 |
+----------+
1 行が選択されました(0.086 秒)TO_TIMESTAMP の例
書式付き文字列をタイムスタンプに変換:
SELECT TO_TIMESTAMP('2008-2-23 12:00:00', 'yyyy-MM-dd HH:mm:ss') AS result FROM (VALUES(1));
+------------------------+
| result |
+------------------------+
| 2008-02-23 12:00:00.0 |
+------------------------+
1 行が選択されました(0.126 秒)UNIX 時間値をタイムスタンプに変換:
SELECT TO_TIMESTAMP(1427936330) AS result FROM (VALUES(1));
+------------------------+
| result |
+------------------------+
| 2015-04-01 17:58:50.0 |
+------------------------+
1 行が選択されました(0.114 秒)UTC 日付文字列をタイムゾーンオフセット付きのタイムスタンプに変換:
SELECT
TO_TIMESTAMP('2015-03-30 20:49:59.0 UTC', 'YYYY-MM-dd HH:mm:ss.s z') AS Original,
TO_CHAR(TO_TIMESTAMP('2015-03-30 20:49:59.0 UTC', 'YYYY-MM-dd HH:mm:ss.s z'), 'z') AS New_TZ
FROM (VALUES(1));
+------------------------+---------+
| Original | New_TZ |
+------------------------+---------+
| 2015-03-30 20:49:00.0 | UTC |
+------------------------+---------+
1 行が選択されました(0.148 秒)