スカラー関数
 
このページをシェアする                  
スカラー関数
Pervasive PSQL スカラー関数のリファレンス
この章では、以下の項目について説明します。
文字列関数
数値関数
時刻と日付の関数
システム関数
論理関数
変換関数
Pervasive PSQL は ODBC スカラー関数をサポートしており、このようなスカラー関数を SQL ステートメントに一次式として含むことができます。
文字列関数
文字列関数は、CHAR または LONGVARCHAR データ型のようなテキスト情報から成る列の処理および操作に使用されます。
文字列関数ではマルチバイトの文字列がサポートされます(ただし、CASE(文字列はマルチバイト文字列をサポートしないことに注意してください。CASE(文字列キーワードは、文字列データがシングルバイトの ASCII であることを前提としています。CASE(文字列) を参照してください)。
string と示される引数には、列の名前、文字列リテラル、または別のスカラー関数の結果を指定できます。
表 55 文字列関数
関数
説明
ASCII (string)
string の一番左の文字の ASCII コードを整数で返します。
BIT_LENGTH (string)
string の長さをビット数で返します。
CHAR (code)
code で指定された ASCII コードを持つ ASCII 文字を返します。引数は整数値でなければなりません。
CHAR_LENGTH (string)
列に対して定義された 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 または LONGVARCHAR の string の場合、後続の空白はカウントされます。CHAR または LONGVARCHAR の string の場合、後続のヌルはカウントされます。string の終端文字はカウントされません。
LOCATE (string1, string2[, start])
string2 の中で string1 が最初に現れる位置を返します。string2 内での検索は、開始位置(start)が指定されていなければ、先頭の文字位置から始めます。検索は指定された開始位置から始まります。string2 の先頭文字位置は 1 です。string1 が見つからない場合は値 0 が返されます。
LTRIM (string)
string から先頭の空白を除いた文字を返します。
OCTET_LENGTH (string)
string の長さを 8 進数(バイト数)で返します。
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 から後続の空白を除いた文字列を返します。
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 で指定された文字数を取り出し、その文字列を返します。
UCASE または UPPER (string)
string の小文字すべて大文字に変換された文字列を返します。
スカラー関数の 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 は、名前の 2 番目の文字から最高 3 文字までをリストしており、"oos" という結果が出ます。
SELECT SUBSTRING(First_name, 2, 3) FROM Person WHERE First_name = 'Roosevelt'
============ 
"Smith" と "Smythe" の文字列に 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 値のような数値情報だけから成る列の処理および操作に使用されます。
表 56 数値関数
関数
説明
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 のような日付または時刻のデータ型から成るデータの処理および操作に使用されます。
時刻と日付関数の値の挿入
関数の値をテーブルに挿入する場合、すべての日付/時刻関数でサポートされている 1 つの方法は、次に示すような INSERT ステートメント内で SELECT サブクエリを使用する方法です。
INSERT INTO t1 (c1, c2) SELECT CURRENT_DATE(), CURRENT_TIME()
CURDATE()、CURTIME()、NOW() などのいくつかの関数では、次に示すような直接の INSERT もサポートされます。
INSERT INTO t1 (c1) VALUES (CURDATE())
 
表 57 時刻と日付の関数
関数
説明
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 が減算されます。戻り値が整数値の範囲外の場合はエラーが返されます。データ型の範囲を参照してください。
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 の範囲の整数値で返します。
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
現在の日付と時刻に加えて、Pervasive PSQL データベース エンジンが起動しているコンピューターの現在のタイム ゾーンと UTC の間の時間と分のオフセットを返します。サマー タイム(DST)が考慮されます。
返されるデフォルトの書式は、YYYY-MM-DD hh:mm:ss[.nnnnnnn] [<+ | ->hh:mm] です。"+" は、現在のタイム ゾーンが UTC より進んでいることを示します。"-" は、現在のタイム ゾーンが UTC より遅れていることを示します。
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 データが格納されている列を指定できます。
次の例は、日付/時刻関数を基に値を挿入する方法を示します。CURDATE() などのいくつかの関数は、INSERT ステートメントの中で直接使うことができます。しかし、それ以外の関数では、このような方法はサポートされていません。広範囲にわたってサポートされている方法は、SELECT を含む INSERT を使用するものです。以下の例では、CURRENT_TIME() によって返される UTC 時刻値がテーブル T1 に挿入されます。
INSERT INTO T1 (C1) SELECT CURRENT_TIME()
============ 
次は 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')
システム関数
システム関数は、システム レベルの情報を提供します。
表 58 システム関数
関数
説明
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)
論理関数
論理関数は、一定の条件に基づいたデータの操作に使用されます。
表 59 論理関数
関数
説明
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 (SQL_SMALLINT, SQL_VARCHAR) は SQL_SMALLINT になります。したがって、結果の型は SQL_SMALLINT になります。
最初のパラメーターは 10 で、この値は結果の型の SQL_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 関数はデータを ODBC データ型へのみ変換できます。複数の Pervasive PSQL データ型が 1 つの ODBC データ型にマップされていることがあるので注意してください。たとえば、DECIMAL、CURRENCY、および BIGINT はすべて ODBC データ型の SQL_DECIMAL にマップされています。
CAST 関数は式を Pervasive PSQL リレーショナル データ型へ変換します(式を当該のデータ型へ変換できる場合)。CAST 関数は文字列内のバイナリ ゼロを変換できます。たとえば、CAST(c1 AS BINARY(10)) となります。ここで、c1 はバイナリ ゼロ(NULL)を含んでいる文字型の列です。
ユーザー定義データ型は CAST も CONVERT もできません。
入力と出力が共に文字列の場合、CAST または CONVERT の出力は入力文字列と同じ照合順序になります。
表 60 変換関数
関数
説明
CAST(exp AS type)
指定された type に変換された exp の値を返します。
type は、表 Pervasive PSQL データ型と対応する ODBC データ型に示されている Pervasive PSQL リレーショナル データ型のいずれかになります。
CONVERT(exp, type[, style])
指定された type に変換された exp の値を返します。type は、次のキーワードのいずれかになります。
SQL_BIGINT
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DATETIME
SQL_DECIMAL
SQL_DOUBLE
SQL_FLOAT
SQL_GUID
SQL_INTEGER
SQL_LONGVARCHAR
SQL_NUMERIC
SQL_REAL
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARCHAR
SQL_LONGVARBINARY
オプション パラメーターの style は、DATETIME データ型のみに適用されます。このパラメーターを使用すると、DATETIME データ型のミリ秒部分が切り捨てられます。style の値は 20 または 120 です。どちらの値も ODBC の正規形式である 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 を SQL_CHAR へ、文字列データを SQL_DATE、SQL_TIME、SQL_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
============ 
次の例は、文字列を SQL_DATE へ変換した後、SQL_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 でも ODBC の正規形式である yyyy-mm-dd hh:mm:ss を指定します。