スカラー関数
 
このページをシェアする                  
スカラー関数
Zen スカラー関数のリファレンス
以下のトピックでスカラー関数について説明します。
ビット演算子
算術演算子
文字列関数
数値関数
時刻と日付の関数
システム関数
論理関数
変換関数
Zen はスカラー関数をサポートしており、このようなスカラー関数を SQL ステートメントに一次式として含むことができます。
ビット演算子
ビット演算子を使用すると、1 つまたは複数のオペランドのビットを操作することができます。ビット演算子には次の種類があります。
演算子
説明
&
ビット演算 AND
~
ビット演算 NOT
|
ビット演算 OR
^
ビット演算 排他的 OR
式の記憶域の長さは、ビット演算を実行するときに考慮すべき重要な要因です。ビット演算でサポートされるデータ型は次のとおりです。
BIT
TINYINT
SMALLINT
INTEGER
BIGINT
UTINYINT
USMALLINT
UINTEGER
UBIGINT
次の表では、ビット演算子について説明します。各ビット演算子は、オペランドとして 1 つの数値のみを取ります。
 
表 44 説明、構文、返される値、およびビット演算子の例
ビット演算子
説明と構文
返される値
AND
ビット演算子 AND は、2 つのオペランド間でビットごとに論理積演算を実行します。AND は、2 つのビットを比較し、両方のビットの値が 1 の場合にのみ、値 1 を結果に代入します。そうでない場合、結果のビットは 0 にセットされます。
&
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
異なる INTEGER データ型のオペランドを伴うビット演算 AND では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。
ビット演算 AND にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
& 演算子を IF 関数と組み合わせて使用し、テーブルがシステム テーブルかユーザー定義のテーブルかを調べることができます。
select Xf$Name, IF(Xf$Flags & 16 = 16, 'System table','User table') from X$File
NOT
ビット演算子 NOT は、あらゆる変数のビット値を反転し、その値を対応する結果のビットにセットします。
~
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。チルダ(~)は、ユーザー定義名の一部として使用できません。
ビット演算子 NOT は、INTEGER データ型の単一オペランドの反転を返します。すべての 1 は 0 に変換され、すべての 0 は 1 に変換されます。
次のクエリは、数値リテラルに対して補数演算を実行します。
SELECT ~12
結果は -13 です。補数演算は符合ビットも補完するため、結果は負数になります。
OR
ビット演算子 OR は、2 つのオペランド間でビットごとの論理和演算を実行します。OR は、2 つのビットを比較し、一方または両方のビットの値が 1 の場合は、値 1 を結果に代入します。入力式のどちらのビットの値も 1 でない場合、結果のビットは 0 にセットされます。OR 演算子は、オペランドとして数値のみを取ります。
|
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
異なる INTEGER データ型のオペランドを伴うビット演算 OR では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。
ビット演算 OR にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
次の例では、外部キーと主キーの制約の一覧を取得することができます。
select B.Xf$Name "Table name", C.Xe$Name "Column name",
IF (Xi$Flags & 8192 = 0, 'Primary key', 'Foreign key') "Key type" from X$Index A, X$File B, X$Field C
where (A.Xi$Flags & (16384 | 8192)) > 0 AND A.Xi$File = B.Xf$Id AND A.Xi$Field = C.Xe$Id
OR(排他的)
ビット演算子の排他的 OR は、2 つのオペランド間でビットごとの排他的論理和演算を実行します。排他的 OR は、2 つのビットを比較し、両方のビットの値が 0 または 1 の場合は、値 0 を結果に代入します。そうでない場合は、対応する結果のビットを 1 にセットします。
^
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。キャレット記号(^)は、ユーザー定義名の一部として使用できません。
異なる INTEGER データ型のオペランドを伴うビット演算排他的 OR では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。
ビット演算排他的 OR にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
次の SQL クエリは、2 つの数値リテラルで排他的 OR を実行します。
SELECT 12 ^ 8
結果は 4 です。
 
真理値表
次の表は、ビット演算の真理値表です。
表 45 ビット演算の真理値表
A
B
A & B
A | B
A ^ B
~ A
0
0
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
0
0
算術演算子
日付演算
Zen では、加算または減算する日数が整数で、日付がベンダー文字列に埋め込まれている場合、その整数を日付に加算したり日付から減算したりできます。これは、日付について変換を実行するのと同じです。
また、Zen では、ある日付を別の日付から減算して日数を計算することもできます。
SELECT * FROM person P, Class C WHERE p.Date_Of_Birth < ' 1973-09-05' and c.Start_date >{d '1995-05-08'} + 30
文字列関数
文字列関数は、CHAR、NCHAR、VARCHAR、NVARCHAR、LONGVARCHAR、または NLONGVARCHAR データ型のようなテキスト情報から成る列の処理および操作に使用されます。
文字列関数ではマルチバイトの文字列がサポートされます。(ただし、CASE(文字列)はマルチバイト文字列をサポートしないことに注意してください。CASE(文字列)キーワードは、文字列データがシングルバイトの ASCII であることを前提としています。CASE(文字列)を参照してください。)
string と示される引数には、列の名前、文字列リテラル、または別のスカラー関数の結果を指定できます。
表 46 文字列関数
関数
説明
ASCII (string)
string の一番左の文字の数値を返します。値は、データベース コード ページ内の文字の位置です。UNICODE 関数も参照してください。
BIT_LENGTH (string)
string の長さをビット数で返します。
CHAR (code)
code 引数により選択されるデータベース コード ページの文字に対応する、単一文字の文字列を返します。引数は整数値でなければなりません。NCHAR 関数も参照してください。
CHAR_LENGTH (string)
string 内のバイト数を返します。CHAR および NCHAR string では、すべての埋め込みが意味を持ちます。
CHAR_LENGTH2 (string)
string 内の文字数を返します。CHAR および NCHAR string では、すべての埋め込みが意味を持ちます。データにダブルバイト文字が含まれている場合は、文字列のサイズより小さい値が返されることがあります。
CHARACTER_LENGTH (string)
CHAR_LENGTH と同じです。
CONCAT (string1, string2)
string2string1 に連結した結果の文字列を返します。
ISNUMERIC (string)
文字列値が数値として評価できる場合は 1(TRUE)を返します。そうでない場合は 0(FALSE)を返します。
LCASE または LOWER (string)
string の大文字がすべて小文字に変換された文字列を返します。
LEFT (string, count)
string の左端から count 分の文字を返します。count の値は整数です。
LENGTH (string)
string 内の文字数を返します。VARCHAR、NVARCHAR、LONGVARCHAR、または NLONGVARCHAR の string の場合、後続の空白はカウントされます。CHAR、NCHAR、LONGVARCHAR、または NLONGVARCHAR の string の場合、後続のヌルはカウントされます。string の終端文字はカウントされません。ANSI_PADDING = OFF の場合、後続のヌルは後続の空白と同様に扱われ、CHAR 列では長さにカウントされません。
LOCATE (string1, string2[, start])
string2 の中で string1 が最初に現れる位置を返します。string2 内での検索は、開始位置(start)が指定されていなければ、先頭の文字位置から始めます。検索は指定された開始位置から始まります。string2 の先頭文字位置は 1 です。string1 が見つからない場合は、値 0 が返されます。
LTRIM (string)
string から先頭の空白を除いた文字を返します。CHAR および NCHAR string では、すべての埋め込みが意味を持ちます。
NCHAR (code)
code 引数で指定される Unicode コードポイント値に対応する、単一文字のワイド文字列を返します。引数は整数値でなければなりません。CHAR 関数も参照してください。
OCTET_LENGTH (string)
string の長さを 8 進数(バイト数)で返します。CHAR および NCHAR string では、すべての埋め込みが意味を持ちます。
POSITION (string1, string2)
string2 の中にある string1 の位置を返します。string1string2 内に存在しない場合は、ゼロが返されます。
REPLACE (string1, string2, string3)
string1 を検索して string2 が現れる箇所を探し、それをすべて string3 に置き換えます。その結果が返されます。文字列が現れなかった場合は、string1 が返されます。
REPLICATE (string, count)
stringcount の回数だけ繰り返して構成した string を返します。count の値は整数です。
REVERSE (string)
文字の並びが反転された string を返します。文字列型の先頭のスペースは末尾のスペースとは異なり、意味のあるものと見なされることに注意してください。を参照してください。
RIGHT (string, count)
string の右端から count 分の文字を返します。count の値は整数です。
RTRIM (string)
string から後続の空白を除いた文字列を返します。ANSI_PADDING = OFF の場合、後続のヌルは後続の空白と同様に扱われ、CHAR 列の値から除かれます。
SOUNDEX (string)
アルファ文字列を 4 文字のコードに変換して類似した音声の語や名前を検索します。2 つの文字列の類似性を評価する 4 文字(SOUNDEX)のコードを返します。通常は名前です。
メモ:合衆国政府が使用する Soundex の公式な実装に設定される現在の規則に従います。
SPACE (count)
count で示された数の空白から成る string を返します。
STUFF (string1, start, length, string2)
string1start 位置から length で示された数だけの文字を string2 で置き換えた結果得られる文字列を返します。startlength は整数です。
SUBSTRING (string1, start, length)
string1 の中の start で指定された文字位置から、length で指定された文字数を取り出し、その文字列を返します。start 値には、任意の数値を指定できます。string1 の先頭位置は 1 です。0 または負数の start 値は、先頭位置の左と見なされます。length は負の値にできません。
UCASE または UPPER (string)
string の小文字すべて大文字に変換された文字列を返します。
UNICODE (string)
string の一番左の文字の Unicode コードポイント値を返します。ASCII 関数も参照してください。
スカラー関数の RTRIM または LEFT を使用する WHERE 句を含むクエリは、最適化することができます。たとえば、次のようなクエリがあるとします。
SELECT * FROM T1, T2 WHERE T1.C1 = LEFT(T2.C1, 2)
この場合、T1.C1 と T2.C2 がインデックス列ならば、述部の両側が最適化されます。述部は、WHERE キーワードの後に続く完全な検索条件です。結合に含まれるテーブルのサイズに従って、オプティマイザーは最初に処理する適切なテーブルを選択します。
一方の述部で、LTRIM および RIGHT が複雑な式中に含まれている場合、これらを最適化することはできません。
次の例では、整数の列と文字の列を持つ新しいテーブルを作成します。文字の列だけに値を持つ行を 4 行挿入し、その後で、それらの行の整数列を各行に含まれる文字の ASCII 文字コードで更新します。
CREATE TABLE numchars(num INTEGER,chr CHAR(1) CASE);
INSERT INTO numchars (chr) VALUES('a');
INSERT INTO numchars (chr) VALUES('b');
INSERT INTO numchars (chr) VALUES('A');
INSERT INTO numchars (chr) VALUES('B');
UPDATE numchars SET num=ASCII(chr);
SELECT * FROM numchars;
SELECT の結果:
num        chr
---------- ---
97         a
98         b
65         A
66         B
 
SELECT num FROM numchars WHERE num=ASCII('a')
SELECT の結果:
num
------
97
============ 
次の例では、Person テーブルの名前と姓を連結しており、"RooseveltBora" という結果が出ます。
SELECT CONCAT(First_name, Last_name) FROM Person WHERE First_name = 'Roosevelt'
============ 
次の例では、名前を小文字に変換してから大文字に変換しているため、"roosevelt"、"ROOSEVELT" という結果が出ます。
SELECT LCASE(First_name), UCASE(First_name) FROM Person WHERE First_name = 'Roosevelt'
============ 
次の例では、左端から 3 文字に切り詰められた名前、長さ 9、LOCATE の結果 0、という結果が出ます。このクエリの結果は "Roo"、9、0 です。
SELECT LEFT(First_name, 3),LENGTH(First_name), LOCATE(First_name, 'a') FROM Person WHERE First_name = 'Roosevelt'
============ 
次は、文字列で LTRIM および RTRIM 関数を使用した例で、結果は "Roosevelt"、"Roosevelt"、"elt" になります。
SELECT LTRIM(First_name), RTRIM(First_name), RIGHT(First_name, 3) FROM Person WHERE First_name = 'Roosevelt'
============ 
次は、SUBSTRING 関数を使用した例です。
この SUBSTRING は、指定された列の 2 番目の文字から最高 3 文字を返します。
SELECT SUBSTRING(First_name,2, 3) FROM Person WHERE First_name = 'Roosevelt'
結果セット:
'oos'
次の SUBSTRING は、開始位置が文字列の最後を越えているため、空文字列を返します。
SELECT substring('ABCDE',10,1);
次の SUBSTRING は、指定された値を返します。
SELECT substring('ABCDE',0,2); – 'A' を返します
SELECT substring('ABCDE',-5,10); – 'ABCD' を返します
SELECT substring('ABCDE',-1,4); – 'AB' を返します
============ 
SmithSmythe の文字列に SOUNDEX を使用した例を次に示します。
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')'
結果セット:
S530
S530
============ 
次の例は、Person テーブルで SOUNDEX を使用して "Kennedy" のように聞こえるすべての姓を検索する方法を示します。
SELECT Last_Name FROM Person WHERE SOUNDEX(last_name) = SOUNDEX ('Kennedy')
SELECT の結果:
Last_Name
---------
Kandy
Kenady
Kennedy
Kennedy
============ 
以下は REVERSE 関数の使用例です。
SELECT REVERSE(dept_name) from COURSE where dept_name = 'Music'
結果セット:
               cisuM
               cisuM
               cisuM
               cisuM
               cisuM
 
5 行が影響を受けました。
 
先頭のスペースには意味があるため、次のクエリは 0 行を返します。
SELECT * from COURSE WHERE REVERSE(dept_name) = 'cisuM'
これは、dept_name が 20 文字幅の CHAR フィールドとして定義されているからです。次に示すどちらのクエリ ステートメントでも期待される結果を返します。
SELECT * from COURSE WHERE REVERSE(dept_name) = '               cisuM'
 
SELECT * from COURSE WHERE LTRIM(REVERSE(dept_name)) = 'cisuM'
 
結果セット:
MUS 101   Hymnology      3   Music
MUS 102   Church         3   Music
MUS 203   Piano          3   Music
MUS 304   Music Theory   3   Music
MUS 405   Recital        3   Music
 
5 行が影響を受けました。
数値関数
数値関数は、decimal 値や integer 値のような数値情報だけから成る列の処理および操作に使用されます。
表 47 数値関数
関数
説明
ABS (numeric_exp)
numeric_exp の絶対値(正数)を返します。
ACOS (float_exp)
ラジアンで示された角度として、float_exp のアークコサインを返します。
ASIN (float_exp)
ラジアンで示された角度として、float_exp のアークサインを返します。
ATAN (float_exp)
ラジアンで示された角度として、float_exp のアークタンジェントを返します。
ATAN2 (float_exp1, float_exp2)
ラジアンで示された角度として、x(float_exp1)座標と y(float_exp2)座標のアークタンジェントを返します。
CEILING (numeric_exp)
numeric_exp で示された値以上の最小の整数を返します。
COS (float_exp)
float_exp がラジアンで示された角度である場合、float_exp のコサインを返します。
COT (float_exp)
float_exp がラジアンで示された角度である場合、float_exp のコタンジェントを返します。
DEGREES (numeric_exp)
numeric_exp のラジアンから変換された度数を返します。
EXP (float_exp)
float_exp の指数値を返します。
FLOOR (numeric_exp)
numeric_exp で示された値以下の最大の整数を返します。
LOG (float_exp)
float_exp の自然対数を返します。
LOG10 (float_exp)
float_exp の 10 を底とする対数を返します。
MOD (integer_exp1, integer_exp2)
integer_exp1integer_exp2 で割った余り(絶対値)を返します。
PI ( )
πの定数値を浮動小数点値で返します。
POWER (numeric_exp, integer_exp)
numeric_expinteger_exp で示されたべき乗を行った値を返します。
RADIANS (numeric_exp)
numeric_exp の度数から変換されたラジアン値を返します。
RAND (integer_exp)
integer_exp をオプションのシード値として使用する、ランダムな浮動小数点値を返します。
ROUND (numeric_exp, integer_exp)
小数点の右側の integer_exp で示される位置で丸められた numeric_exp を返します。integer_exp が負数の場合、numeric_exp は、小数点の左側の |integer_exp|(integer_exp の絶対値)で示される位置で丸められます。
SIGN (numeric_exp)
numeric_exp の符号を示す値を返します。numeric_exp が 0 より小さい場合は -1 が返されます。numeric_exp が 0 の場合は 0 が返されます。numeric_exp が 0 より大きい場合は 1 が返されます。
SIN (float_exp)
float_exp がラジアンで示された角度である場合、float_exp のサインを返します。
SQRT (float_exp)
float_exp の平方根を返します。
TAN (float_exp)
float_exp がラジアンで示された角度である場合、float_exp のタンジェントを返します。
TRUNCATE (numeric_exp, integer_exp)
小数点の右側の integer_exp で示される位置で切り捨てられた numeric_exp を返します。integer_exp が負数の場合、numeric_exp は、小数点の左側の |integer_exp|(絶対値)で示される位置で切り捨てられます。
次の例では、Room テーブルの部屋番号の列と収容人数の列の MOD を一覧表示します。
SELECT Number, Capacity, MOD(Number, Capacity) FROM Room WHERE Building_Name = 'Faske Building' and Type = 'Classroom'
============ 
次の例では、Faculty テーブルから 100 で割り切れる給与すべてを選択します。
SELECT Salary FROM Faculty WHERE MOD(Salary, 100) = 0
時刻と日付の関数
日付および時刻関数により、DATE や TIME データ型のデータを生成、処理、および操作することができます。このトピックでは、これらの関数の使用について説明します。
CURTIME()、CURDATE()、NOW() を INSERT ステートメントで使用して、現在の現地日付、時刻、およびタイムスタンプの値を挿入できます。たとえば、次のように指定します。
CREATE TABLE table1 (col1 DATE)
INSERT INTO table1 VALUES (CURDATE())
すべての時刻と日付関数は、次に示すように INSERT ステートメント内の SELECT サブクエリをサポートしています。
INSERT INTO t1 (c1, c2) SELECT CURRENT_DATE(), CURRENT_TIME()
CURDATE()、CURTIME()、NOW() などのいくつかの関数では、次に示すような直接の挿入もサポートされます。
INSERT INTO t1 (c1) VALUES (CURDATE())
ほかの例については、時刻と日付関数の例を参照してください。
 
表 48 時刻と日付の関数
関数
説明
CURDATE ( )
現在の現地日付を 'yyyy-mm-dd' 形式で返します。デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、CURDATE() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付と時刻を計算し、SET TIME ZONE のディスプレースメント値を加算することによって決定されます。
CURRENT_DATE ( )
現在の UTC 日付を 'yyyy-mm-dd' 形式で返します。
CURTIME ( )
現在の現地時刻を 'hh:mm:ss' 形式で返します。デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、CURTIME() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付と時刻を計算し、SET TIME ZONE のディスプレースメント値を加算することによって決定されます。
CURRENT_TIME ( )
現在の UTC 時刻を 'hh:mm:ss' 形式で返します。
CURRENT_TIMESTAMP ( )
現在の UTC 日付と時刻をタイムスタンプ値として 'yyyy-mm-dd hh:mm:ss.mmm' 形式で返します。
DATEADD (datepart, interval, date_exp)
日付に interval を加算した新しい DATETIME 値を返します。たとえば、datapart が day、interval が 11、date_exp が 2020 年 1 月 26 日の場合は、2020 年 2 月 6 日を返します。
datepart には interval を加算する日付の部分を指定します。値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
hour
minute
second
millisecond
interval には、datepart を増加させるために用いる正または負の整数値を指定します。interval に小数部が含まれる場合、小数部は無視されます。
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。DATETIME を参照してください。
DATEDIFF (datepart, start, end)
2 つの日付の差異を表す整数を返します。この整数は、2 つの日付間の日付と時刻の境界の数です。
たとえば、テーブル mytest に col1 および col2 の 2 つの列があり、両方とも DATETIME だとします。col1 の値は 2000-01-01 11:11:11.234 で、col2 は 2004-09-11 10:10:10.211 です。次の SELECT ステートメントは 56 を返します。それが col1 と col2 の月の差異だからです。
SELECT DATEDIFF(month, col1, col2) as Month_Difference FROM mytest
datepart には差異を計算する日付の部分を指定します。値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
hour
minute
second
millisecond
start には差異を計算する始まりの日付を指定します。start は DATETIME 値または DATE 形式の Unicode 文字列を返す式です。
end には差異を計算する終わりの日付を指定します。end は DATETIME 値または DATE 形式の Unicode 文字列を返す式です。
end から start が減算されます。戻り値が整数値の範囲外の場合はエラーが返されます。データ型の範囲を参照してください。
DATEFROMPARTS (year, month, day)
指定された年、月、日の日付値を返します。
パラメーターのいずれかがヌルである場合は、ヌルが返されます。
DATENAME (datepart, date_exp)
date_expdatepart を表す英語の文字列(VARCHAR)を返します。たとえば、datepart month は January、February というように月名を返します。datepart weekday は Monday、Tuesday というように曜日を返します。
datepart は返される日付の部分で、値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
weekday
hour
minute
second
millisecond
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。DATETIME を参照してください。
DATEPART (datepart, date_exp)
date_expdatepart を表す整数を返します。たとえば、datepart month は月を表す整数を返します(1 月 = 1、2 月 = 2)。datepart weekday は曜日を表す整数を返します(日曜日 = 1、土曜日 = 7)。
datepart は返される日付の部分で、値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
weekday
hour
minute
second
millisecond
TZoffset
TZoffset 値は、タイム ゾーンのオフセットを分数(符号付き)で返します。TZoffset を指定した DATEPART 関数は、SYSDATETIMEOFFSET() および、タイム ゾーンのオフセットを含んでいる文字列リテラルでのみ機能します。タイム ゾーン オフセットの範囲は -14:00 から +14:00 です。時刻と日付関数の例を参照してください。
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。DATETIME を参照してください。
DAY (date_exp)
指定された date_exp の日にちを返します。 これは DATEPART(day, date_exp) とまったく同じです。DATEPART (datepart, date_exp) を参照してください。
DAYNAME (date_exp)
date_exp の曜日部分に対して、曜日の名前(たとえば、Sunday から Saturday)を含んでいる英語の文字列を返します。
date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
DAYOFMONTH (date_exp)
date_exp の月の何日目かを 1 ~ 31 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
DAYOFYEAR (date_exp)
date_exp の年の何日目かを 1 ~ 366 の範囲の整数値で返します。
DATETIMEFROMPARTS (year, month, day, hour, minute, seconds, milliseconds)
提供されたパラメーターで構成されるタイムスタンプ値を返します。パラメーターのいずれかがヌルである場合は、ヌルが返されます。
DATETIMEOFFSETFROMPARTS (year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision)
指定されたオフセットと精度を使用して、特定の日付と時刻の文字列値を返します。
percision を除くパラメーターのいずれかがヌルである場合は、ヌルが返されます。precision がヌルの場合は、エラーが返されます。
precision には、分数値の精度を指定します。指定できる範囲は 0 から 7 です。fractionsprecision によって決まり、範囲は 0 から 9999999 です。たとえば、precision が 3 の場合、各 fractions はミリ秒を表します。fractions に指定される桁数は、precision の値以下でなければなりません。
hour_offset には、タイム ゾーンの時部分を指定します。範囲は -14 から +14 です。minute_offset には、タイム ゾーンの分部分を指定します。範囲は 0 から 59 です。hour_offsetminute_offset の符号は、hour_offset が 0 でない限り、同じでなければなりません。
datetimeoffset のデフォルトの文字列リテラル書式は、YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] です。
EXTRACT (extract_field, extract_source)
extract_sourceextract_field 部分を返します。引数 extract_source は、日付、時刻、または間隔を表す式です。
extract_field に指定できるキーワードは次のとおりです。
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
これらの値は、ターゲット式から返されます。
HOUR (time_exp)
時刻を 0 ~ 23 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MINUTE (time_exp)
分を 0 ~ 59 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MONTH (date_exp)
月を 1 ~ 12 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MONTHNAME (date_exp)
date_exp の月の部分に対して、月名(たとえば、January から December)を含んでいる英語の文字列を返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
NOW ( )
現在の現地日付と時刻をタイムスタンプ値として次の形式で返します。
'yyyy-mm-dd hh:mm:ss.mmm'
デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、NOW() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付と時刻を計算し、SET TIME ZONE のディスプレースメント値を加算することによって決定されます。
QUARTER (date_exp)
date_exp の四半期を 1 ~ 4 の範囲の整数値で返します。1 は 1 月 1 日~ 3 月 31 日を表します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
SECOND (time_exp)
秒を 0 ~ 59 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
SYSDATETIMEOFFSET
現在の日付と時刻に加えて、Zen データベース エンジンが起動しているコンピューターの現在のタイム ゾーンと UTC の間の時間と分のオフセットを返します。サマー タイム(DST)が考慮されます。
返されるデフォルトの書式は、YYYY-MM-DD hh:mm:ss[.nnnnnnn] [<+ | ->hh:mm] です。プラス記号は、現在のタイム ゾーンが UTC より進んでいることを示します。マイナス記号は、現在のタイム ゾーンが UTC より遅れていることを示します。
TIMEFROMPARTS (hour, minute, seconds, fractions, precision)
指定された時刻パラメーターで構成される時刻値を返します。
percision を除くパラメーターのいずれかがヌルである場合は、ヌルが返されます。precision がヌルの場合は、エラーが返されます。
precision には、分数値の精度を指定します。指定できる範囲は 0 から 7 です。fractionsprecision によって決まり、範囲は 0 から 9999999 です。たとえば、precision が 3 の場合、各 fractions はミリ秒を表します。fractions に指定される桁数は、precision の値以下でなければなりません。
TIMEFROMPARTS のデフォルトの書式は、hh:mm:ss[.nnnnnnn] です。
TIMESTAMPADD (interval, integer_exp, timestamp_exp)
interval タイプの integer_exp で示された間隔を timestamp_exp に加算したタイムスタンプを返します。
interval に指定できるキーワードは次のとおりです。
SQL_TSI_YEAR
SQL_TSI_QUARTER
SQL_TSI_MONTH
SQL_TSI_WEEK
SQL_TSI_DAY
SQL_TSI_HOUR
SQL_TSI_MINUTE
SQL_TSI_SECOND
TIMESTAMPDIFF (interval, timestamp_exp1, timestamp_exp2)
timestamp_exp2timestamp_exp1 より大きい場合に、その差である interval の整数値を返します。
interval に指定できる値は、TIMESTAMPADD と同じです。
WEEK (date_exp)
date_exp が 1 年の第何週目かを 1 ~ 53 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
WEEKDAY (date_exp)
指定された date_exp の曜日を返します。1 = 日曜日、7 = 土曜日です。 これは DATEPART(weekday, date_exp) とまったく同じです。DATEPART (datepart, date_exp) を参照してください。
YEAR (date_exp)
年数を整数値で返します。範囲はデータ ソースに依存します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
時刻と日付関数の例
次は HOUR の使用例です。
SELECT c.Name, c.Credit_Hours FROM Course c WHERE c.Name = ANY (SELECT cl.Name FROM Class cl WHERE c.Name = cl.Name AND c.Credit_Hours >(HOUR (Finish_Time - Start_Time) + 1))
============ 
これは MINUTE の使用例です。
SELECT minute(log) FROM billing
============ 
次は SECOND の使用例です。
SELECT SECOND(log) FROM billing;
SELECT log FROM billing where SECOND(log) = 31
============ 
次は NOW() の使用例です。
SELECT now() - log FROM billing
============ 
次は、MONTH、DAY、YEAR、HOUR、MINUTE を使用するより複雑な例です。
SELECT Name, Section, MONTH(Start_Date), DAY(Start_Date), YEAR(Start_Date), HOUR(Start_Time), MINUTE(Start_Time) FROM Class
============ 
次は CURDATE() の使用例です。
SELECT ID, Name, Section FROM Class WHERE (Start_Date - CURDATE()) <= 2 AND (Start_Date - CURDATE()) >= 0
============ 
次の例では、Class テーブルにあるクラスの開始日を基に、月の何日目かとその曜日を求めます。
SELECT DAYOFMONTH(Start_date), DAYOFWEEK(Start_date) from Class;
SELECT * FROM person WHERE YEAR(Date_Of_Birth) < 1970
============ 
次は、TZoffset パラメーターを指定した DATEPART の使用例です。
SELECT DATEPART(TZoffset, SYSDATETIMEOFFSET())
ステートメントが -360 を返すとしたら、現在のタイム ゾーンは UTC より 360 分遅れています。
SELECT SYSDATETIMEOFFSET() が 2011-01-24 14:33:08.4650000 -06:00 を返すとします。これを前提として、次のクエリは -360 を返します。
SELECT DATEPART(TZoffset, '2011-01-24 14:33:08.4650000 -06:00')
タイム ゾーンの部分が文字列リテラルから省略されている場合は、0 が返されます。
SELECT DATEPART(TZoffset, '2011-01-24 14:33:08.4650000')
============ 
次の例は、DATEFROMPARTS を使用して、提供された値を基に日付を返します。
SELECT NOW(), DATEFROMPARTS(DATEPART(Year, NOW()), DATEPART(Month, NOW()), DATEPART(Day, NOW()))
戻り値:2013-05-09 14:33:34.835 PM     5/9/2013
============ 
次の例は、TIMEFROMPARTS を使用して、提供された値を基に時刻を返します。
SELECT NOW(), TIMEFROMPARTS(DATEPART(hour, NOW()), DATEPART(minute, NOW()), DATEPART(second, NOW()), DATEPART(millisecond, NOW()), 3)
戻り値:2013-05-09 15:04:11.425 PM   15:04:11.425
============ 
次の例は、DATETIMEFROMPARTS を使用して、提供された値を基にタイムスタンプを返します。
SELECT DATETIMEFROMPARTS(1962, 08, 12, 17, 45, 0, 0)
戻り値:1962-08-12 17:45:00.000 PM
============ 
次の例は、DATETIMEOFFSETFROMPARTS を使用して、タイム ゾーン指定を加えたタイムスタンプの表示文字列を返します。
SELECT DATETIMEOFFSETFROMPARTS (1962, 08, 12, 17, 45, 0, 0, 5, 0, 0) + ' GMT'
戻り値:1962-08-12 17:45:00 +05:00 GMT
システム関数
システム関数は、システム レベルの情報を提供します。
表 49 システム関数
関数
説明
DATABASE ( )
現在のデータベース名を返します。
NEWID ( )
データ型 uniqueidentifier の一意な値を作成します。
USER ( )
現在のユーザーのログイン名を返します。
システム関数の例
次の例は、現在のユーザーおよびデータベースの名前を取得する方法を示します。
SELECT USER();
SELECT DATABASE();
============ 
以下の例は、新規テーブル table1 の最初の列として、データ型 UNIQUEIDENTIFIER の列を作成しています。NEWID 関数を使用してデフォルト値を設定することによって、テーブル内の新しい行の col1 にそれぞれ一意な値が与えられます。
CREATE TABLE table1 (col1 UNIQUEIDENTIFIER DEFAULT NEWID() NOT NULL, col2 INTEGER);
    INSERT INTO table1 (col2) VALUES (1);
    INSERT INTO table1 (col2) VALUES (2);
    INSERT INTO table1 (col2) VALUES (3);
論理関数
論理関数は、一定の条件に基づいたデータの操作に使用されます。
表 50 論理関数
関数
説明
COALESCE (expression1, expression2[, ... ])
式リストを左から調べて、最初の非ヌル引数を返します。
詳細については、COALESCE も参照してください。
IF (predicate, expression1, expression2)
述部(predicate)が真の場合は expression1 を返します。そうでない場合は expression2 を返します。
NULL ( )
列をヌル値として設定します。
IFNULL (exp, value)
exp がヌルの場合は value が返されます。exp がヌルでない場合は exp が返されます。value に指定するデータ型は、exp のデータ型と互換性がなければなりません。
ISNULL (exp, value)
ヌルを value で示された値に置き換えます。exp はヌルをチェックする式です。valueexp がヌルの場合に返される値です。ヌルでない場合は exp が返されます。value に指定するデータ型は、exp のデータ型と互換性がなければなりません。
NULLIF (exp1, exp2)
2 つの式が等しくない場合は、exp1 を返します。式が等しい場合、NULLIF はヌル値を返します。
論理関数の例
COALESCE スカラー関数は 2 つ以上の引数を取り、その式リストを左から調べて最初の非ヌル引数を返します。
select COALESCE(10, 'abc' + 'def')
10 は SMALLINT として扱われ、ResultType (SMALLINT, VARCHAR) は SMALLINT になります。したがって、結果の型は SMALLINT になります。
最初のパラメーターは 10 で、この値は結果の型の SMALLINT へ変換できます。そのため、この例の戻り値は 10 になります。
============ 
システム スカラー関数の IFNULL は、SQL の拡張機能です。
IF を使用すると、条件が真か偽かによって異なる値を入力できます。たとえば、論理値を含む列をバイナリ表記ではなく "True" または "False" で表示するには、次の SQL ステートメントを使用します。
SELECT IF(logicalcol=1, 'True', 'False')
============ 
システム スカラー関数の NULL を使用すると、列をヌル値として設定できます。構文は次のとおりです。
NULL()
たとえば、次の SQL ステートメントは、Capacity をヌル値とする行を Room テーブルに挿入します。
INSERT INTO Room VALUES ('Young Building', 222, NULL(), 'Lab')
============ 
次の例は、ISNULL の値の返し方を示します。
CREATE TABLE t8 (c1 INT, c2 CHAR(10));
INSERT INTO t8 VALUES (100, 'string1');
SELECT c1, c2, ISNULL(c1, 1000), ISNULL(C2, 'a string') from t8;
SELECT は 100 と 'string1' を返します。これは、c1 と c2 のどちらにも値が入っており、ヌルではないからです。
INSERT INTO t8 VALUES (NULL, NULL);
SELECT c1, c2, ISNULL(c1, 1000), ISNULL(C2, 'a string') from t8
SELECT は 1000 と 'a string' を返します。これは、c1 と c2 のどちらにもヌルが入っているからです。
============ 
次のステートメントは、IFNULL および NULLIF スカラー関数の使い方を示します。これらの関数はそれぞれ、ヌルが存在するかしないか、等しいかどうかに従って値の代入を行う場合に使用します。
CREATE TABLE Demo (col1 CHAR(3));
INSERT INTO Demo VALUES ('abc');
INSERT INTO Demo VALUES (NULL);
INSERT INTO Demo VALUES ('xyz');
2 番目の行がヌル値を含んでいるので、その場所に 'foo' が代入されます。
SELECT IFNULL(col1, 'foo') FROM Demo
この結果、1 つの列から 3 行がフェッチされます。
"abc"
"foo"
"xyz"
1 列から 3 行フェッチされました。
最初の行に "abc" が含まれており、これは、次の NULLIF 呼び出しの第 2 引数と合致します。
SELECT NULLIF(col1, 'abc') FROM Demo
その場所にヌルが返されます。
<Null>
<Null>
"xyz"
1 列から 3 行フェッチされました。
変換関数
変換関数は、式を特定のデータ型に変換します。CONVERT 関数は、値とそのテキスト表現の間の変換で使用するのに最も適しています。CAST 関数は、データ型をより細かく制御できますが、文字書式の制御性は低下します。CONVERT 関数は、リレーショナル型のサブセットのみをサポートすることに注意してください。
CAST 関数は(変換できる場合に)式を Zen リレーショナル データ型へ変換します。CAST 関数は文字列内のバイナリ ゼロを変換できます。たとえば、CAST(c1 AS BINARY(10)) となります。ここで、c1 はバイナリ ゼロ(NULL)を含んでいる文字型の列です。
入力と出力が共に文字列の場合、CAST または CONVERT の出力は入力文字列と同じ照合順序になります。
CHAR、VARCHAR、または LONGVARCHAR と、NCHAR、NVARCHAR、または NLONGVARCHAR とにおける変換では、CHAR 値はデータベース コード ページを使用してエンコードされていることを前提とします。
TRY_CAST および TRY_CONVERT は、変換できないデータ値の扱いが異なることを除けば、それぞれ CAST および CONVERT と同じです。CAST および CONVERT の場合はクエリ全体が失敗しますが、TRY_CAST および TRY_CONVERT では、クエリ結果のうちクエリに失敗した列にヌル値が入ります。以下の変換関数の例を参照してください。
表 51 変換関数
関数
説明
CAST (exp AS type)
TRY_CAST (exp AS type)
exp(式)を type へ変換します。この typeZen トランザクショナルおよびリレーショナル データ型に表示されるいずれかのデーター型です。桁数と小数位パラメーターも含めます。
CONVERT (exp, type[, style ])
TRY_CONVERT (exp, type [, style ])
以下の型の引数を使用して、exp を、指定された type に 変換します。
SQL_BIGINT
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DECIMAL
SQL_DOUBLE
SQL_FLOAT
SQL_GUID
SQL_INTEGER
SQL_LONGVARBINARY
SQL_LONGVARCHAR
SQL_NUMERIC
SQL_REAL
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARCHAR
SQL_WCHAR
SQL_WLONGVARCHAR
SQL_WVARCHAR
CONVERT の引数は、データ型のプレフィックスとして SQL_ を使用します。Zen リレーショナル データ型には SQL_ プレフィックスが含まれていません。桁数と小数位はデフォルト値を取ります。
オプション パラメーターの style は、DATETIME データ型のみに適用されます。このパラメーターを使用すると、DATETIME データ型のミリ秒部分が切り捨てられます。style の値は 20 または 120 です。どちらの値も正規の形式である yyyy-mm-dd hh:mm:ss を指定します。以下の変換関数の例を参照してください。
変換関数の例
次の例では、DATE を CHAR にキャストしています。
CREATE TABLE u1(cdata DATE);
INSERT INTO u1 VALUES(curdate());
SELECT CAST(cdate as (CHAR20)) FROM u1;
現在の日付が 2004 年 1 月 1 日の場合、SELECT は 2004-01-01 を返します。
============ 
次の例は、それぞれ UBIGINT を CHAR へ、文字列データを DATE、TIME、および TIMESTAMP へ変換します。
SELECT CONVERT(id, SQL_CHAR), CONVERT('1995-06-05', SQL_DATE), CONVERT('10:10:10', SQL_TIME), CONVERT('1990-10-10 10:10:10', SQL_TIMESTAMP) FROM Faculty
============ 
次の例は、文字列を DATE へ変換した後、DATE に 31 を加算します。
SELECT Name FROM Class WHERE Start_date > CONVERT ('1995-05-07', SQL_DATE) + 31
============ 
以下の例で、UNIQUEIDENTIFIER データ型をキャストおよび変換する方法を示します。
CREATE TABLE table1(col1 CHAR(36), col2 UNIQUEIDENTIFIER DEFAULT NEWID());
 
INSERT INTO table1 (col1) VALUES ('1129619D-772C-AAAB-B221-00FF00FF0099');
 
SELECT CAST(col1 AS UNIQUEIDENTIFIER) FROM table1;
 
SELECT CAST(col2 AS LONGVARCHAR) FROM table1;
 
SELECT CONVERT(col2 , SQL_CHAR) FROM table1;
 
SELECT CONVERT('1129619D-772C-AAAB-B221-00FF00FF0099' , SQL_GUID) FROM table1;
============ 
以下の例では、DATETIME データ型を style パラメーターを使用して、または使用しないで変換する方法を示します。
CREATE TABLE table2(col1 DATETIME);
 
INSERT INTO table2 (col1) VALUES ('2006-12-25 10:10:10.987');
 
SELECT CONVERT(col1 , SQL_CHAR, 20) FROM table2;
これは、2006-12-25 10:10:10 を返します。
SELECT CONVERT(col1, SQL_CHAR, 120) FROM table2
これは、2006-12-25 10:10:10 を返します。
SELECT CONVERT(col1, SQL_CHAR) FROM table2
これは、2006-12-25 10:10:10.987 を返します。
DATETIME にミリ秒を含めたい場合は、style パラメーターを省略します。
style パラメーターを使用する場合は、以下の要件に注意してください。
type パラメーターは SQL_CHAR である必要があります。それ以外のデータ型は無視されます。
式の列データ型は DATETIME である必要があります。
許可される style 値は 20 と 120 だけです。それ以外の値ではエラーを返します。値は 20 でも 120 でも正規の形式である yyyy-mm-dd hh:mm:ss を指定します。
============ 
次の例では、CAST と TRY_CAST を使用した場合の結果の違いを示しています。CONVERT と TRY_CONVERT でも同様の違いが発生します。
SELECT CAST ( '10' AS numeric(10,2)); – 成功:10.00 を返します
SELECT CAST( 'test' AS float ); – エラー:式の評価エラーを返します
SELECT TRY_CAST ( '10' AS numeric(10,2)); – 成功:10.00 を返します
SELECT TRY_CAST ( 'test' AS float ); – 成功:ヌルを返します