文字列値のキャスト
文字列をさまざまな数値、日付、時刻、文字列の値にキャストできます。
文字列間のキャスト
文字列を他の文字データ型にキャストすると、1 文字、先頭の length 文字、または文字列全体が返されます。
SELECT
CAST('Hello World' AS CHAR) AS StringToChar, -- H
CAST('Hello World' AS CHAR(5)) AS StringToCharLength, -- Hello
CAST('Hello World' AS CHAR VARYING) AS StringToCharVary -- Hello World
キャストの前に、InterSystems SQL によって埋め込み引用符文字および文字列連結が解決されます。先頭の空白や末尾の空白は削除されます。
SELECT
CAST('Can''t' AS VARCHAR) AS EmbeddedQuote, -- Can't
CAST('Can'||'not' AS VARCHAR) AS StringConcatenation -- Cannot
数値型への文字列のキャスト
文字列を数値型にキャストすると、InterSystems SQL は 1 桁のゼロ (0) を返します。
SELECT CAST('Hello World' AS DOUBLE) AS StringToNumeric -- 0
以下の例では、CAST 関数を使用して Name (文字列) をさまざまな数値データ型に変換した結果を示します。どの場合でも、返される値は 0 (ゼロ) です。
SELECT DISTINCT
CAST(Name As INT) As IntName,
CAST(Name As SMALLINT) As SmallIntName,
CAST(Name As DEC) As DecName,
CAST(Name As NUMERIC) As NumericName
FROM Sample.Person
フォーマットされた文字列の日付へのキャスト
'yyyy-mm-dd' 形式の文字列を DATE データ型にキャストできます。これは、ODBC 日付形式に対応した文字列形式です。InterSystems SQL では、入力した式に対して値と範囲が確認されます。各要素の内容を以下に示します。
-
年 (yyyy) には、00001 以上 9999 以下の数値を指定する必要があります。
-
月 (mm) には、01 以上 12 以下の数値を指定する必要があります。
-
日 (dd) には、該当する月で有効な数値を指定する必要があります。
InterSystems SQL は欠落している先頭のゼロを挿入します。以下に例を示します。
SELECT CAST('2022-3-1' AS DATE) AS DateValue -- 03/01/2022 (Display Mode)
日付が無効な場合は 1840-12-31 (論理日付 0) を返します。例えば、2/29 はうるう年の場合にのみ有効です。
SELECT CAST('2021-02-29' AS DATE) AS InvalidDate -- 12/31/1840 (Display Mode)
表示モードおよびロケールの日付表示形式によってキャストの表示が決まります。例えば、'2004-11-23' が '11/23/2004' と表示されます。
埋め込み SQL は、対応する $HOROLOG 日付整数としたキャストを返します。無効な ODBC 日付や数値ではない文字列を DATE にキャストすると、論理モードでは 0 とされます。日付 0 は 1840–12–31 として表示されます。
フォーマットされた文字列の時間へのキャスト
'hh:mm'、'hh:mm:ss'、'hh:mm:ss.nn' (length 秒の小数点以下桁数は任意) 形式の文字列は TIME データ型にキャストできます。これは、ODBC 時刻形式に対応した文字列形式です。InterSystems SQL では、入力した式に対して値と範囲が確認されます。各要素の内容を以下に示します。
-
時間 (hh) には、00 以上 23 以下の数値を指定する必要があります。
-
分 (mm) には、00 以上 59 以下の数値を指定する必要があります。
-
秒 (ss) には、00 以上 60 未満の数値を指定する必要があります。秒に小数部は使用できますが、切り捨てられます。
InterSystems SQL は欠落しているゼロを追加します。以下に例を示します。
SELECT
CAST('2:45' AS TIME) AS StringToTime1, -- 02:45:00 (Display Mode)
CAST('2:45:59' AS TIME) AS StringToTime2, -- 02:45:59 (Display Mode)
CAST('2:45:59.98' AS TIME) AS StringToTime3 -- 02:45:59.98 (Display Mode)
時刻が無効な場合は 00:00:00 を返します (論理時刻 0)。
SELECT CAST('11:52:60' AS TIME) AS InvalidTime -- 00:00:00 (Display Mode)
埋め込み SQL は、対応する $HOROLOG 時刻整数としてキャストを返します。無効な ODBC 時刻や数値ではない文字列を TIME にキャストすると、論理モードでは 0 とされます。時刻 0 は 00:00:00 として表示されます。
フォーマットされた文字列のタイムスタンプへのキャスト
有効な日付と時刻、有効な日付、または有効な時刻で構成した文字列は TIMESTAMP データ型にキャストできます。日付部分はさまざまな形式で指定できます (TO_TIMESTAMP 関数の説明を参照)。ここで得られるタイムスタンプは、YYYY-MM-DD hh:mm:ss 形式で表されます。
SELECT
CAST('1 MAR 2022 1:33pm' AS TIMESTAMP) As DateToTS1, -- 2022-03-01 13:33:00
CAST('3/1/2022 13:33:00' AS TIMESTAMP) As DateToTS2 -- 2022-03-01 13:33:00
CAST はフォーマットされた日付を以下のように解決します。
-
省略されている日付部分を 1841-01-01 (論理日付1) に設定します。
-
省略されている時刻部分を 00:00:00 に設定します。
-
月および日の先頭のゼロ (省略されている場合) を挿入します。
秒の小数部を指定している場合は、それをピリオド (.) またはコロン (:) で始めることができます。
ある時刻データ型の文字列を別の時刻データ型にキャストすることもできます。以下の例では、文字列を TIME データ型にキャストし、その結果を TIMESTAMP データ型にキャストします。日付は現在のシステム日付に設定されます。
SELECT CAST(CAST('14:33:45.78' AS TIME) As TIMESTAMP) AS TimeToTstamp
日付値のキャスト
日付は、文字列データ型、数値データ型、または別の日付データ型にキャストできます。
文字列への日付のキャスト
日付を文字列データ型にキャストすると、日付全体、またはキャスト先のデータ型で決まる長さの日付が返されます。例えば、以下のクエリでは、現在の日付が "yyyy-mm-dd" として返されず、"yyyy-" のみが返されます。
SELECT CAST(CURRENT_DATE AS CHAR(5)) AS TruncatedDate
CHAR VARYING および CHARACTER VARYING の両データ型では、完全な表示形式が返されます。
SELECT CAST(CURRENT_TIME AS CHAR VARYING) AS FullDate
日付が mm/dd/yyyy などの異なる形式で表示される場合、文字列データ型は ODBC 日付形式 (yyyy-mm-dd) で日付を返します。以下に例を示します。
SELECT CAST(TO_DATE('03/01/2022','MM/DD/YYYY') AS VARCHAR) AS DateFormat -- 2022-03-01
数値型への日付のキャスト
日付を数値データ型にキャストすると、その日付の $HOROLOG 値が返されます。これは、1840 年 12 月 31 日を 0 とし、そこから起算した日数を表す整数値です。以下に例を示します。
SELECT CAST(TO_DATE('01 MAR 2022') AS DECIMAL) AS DateToNumeric -- 66169
POSIXTIME への日付のキャスト
日付を POSIXTIME データ型にキャストすると、エンコードされた 64 ビットの符号付き整数としてタイムスタンプが返されます。日付には時刻部分がないため、00:00:00 としてエンコードされたタイムスタンプに時刻部分が指定されます。
SELECT CAST(CURRENT_DATE AS POSIXTIME) As PosixDate
CAST は日付を検証します。expression の値が有効な日付でない場合は、SQLCODE -400 エラーが発行されます。
TIMESTAMP、DATETIME、または SMALLDATETIME への日付のキャスト
日付を TIMESTAMP、DATETIME、または SMALLDATETIME のいずれかのデータ型にキャストすると、YYYY-MM-DD hh:mm:ss 形式のタイムスタンプが返されます。日付には時刻部分がないため、返されるタイムスタンプの時刻部分は常に 00:00:00 です。CAST は日付を検証します。expression の値が有効な日付でない場合は、SQLCODE -400 エラーが発行されます。
以下の例では、DATE データ型の列を TIMESTAMP にキャストします。比較のために POSIXTIME データ型も取り上げています。
SELECT TOP 5
DOB,
CAST(DOB AS TIMESTAMP) AS TStamp,
CAST(DOB AS POSIXTIME) AS Posix
FROM Sample.Person
数値のキャスト
数値は、数値データ型または文字データ型にキャストできます。少ない桁数の値に数値をキャストすると、その数値は四捨五入ではなく、切り捨てられます。
SELECT
CAST(98.765 AS INT) AS TruncatedInt, -- 98
CAST(98.765 AS CHAR) AS TruncatedChar1, -- 9
CAST(98.765 AS CHAR(4)) AS TruncatedChar2 --98.7
負数を CHAR にキャストすると、負の符号だけが返されます。分数を CHAR にキャストすると、小数点だけが返されます。
SELECT
CAST(-50 AS CHAR) AS Negative, -- negative sign: -
CAST(1/4 AS CHAR) AS Fraction -- decimal point: .
数値には以下の値を指定できます。
キャストを実行する前に、指数演算の実行、複数の符号の解決、先頭の正符号、末尾の小数点、先頭または末尾のゼロの削除によって、数値がキャノニック形式に解決されます。以下に例を示します。
SELECT
CAST(1e2 AS DECIMAL(6,2)) AS PositiveExponent, -- 100.000
CAST(1e-2 AS DECIMAL(6,2)) AS NegativeExponent, -- 0.01
CAST(+1000 AS DECIMAL(6,2)) AS LeadingSign, -- 1000.00
CAST(-+1000 AS DECIMAL(6,2)) AS MultipleSigns, -- -1000.00
CAST(00.100 AS DECIMAL(6,2)) AS LeadingTrailingZeros -- 0.10
2 つ続く負の符号はコメント文字として扱われます。数値の中に負の符号を 2 つ続けて記述すると、そのコード行の以降の部分はコメントとして扱われます。数値に桁区切り文字 (コンマ) を入れることはできません。詳細は、"リテラル" を参照してください。
数値はさまざまな数値型に変換できます。以下の例では、CAST で浮動小数点数のπをさまざまな数値データ型に変換しています。整数データ型には切り捨てが適用されます。
SELECT
CAST({fn PI()} As INTEGER) As IntegerPi, -- 3
CAST({fn PI()} As SMALLINT) As SmallIntPi, -- 3
CAST({fn PI()} As DECIMAL) As DecimalPi, -- 3.141592653589793
CAST({fn PI()} As NUMERIC) As NumericPi, -- 3.141592653589793
CAST({fn PI()} As DOUBLE) As DoublePi -- 3.1415926535897931159
この例では、precision と scale の値が解析され、CAST によって返される値が変更されます。
SELECT
CAST({fn PI()} As DECIMAL) As DecimalPi, -- 3.141592653589793
CAST({fn PI()} As DECIMAL(6,3)) As DecimalPiPS -- 3.142
数値を日付データ型または時刻データ型にキャストすると、SQL ではゼロ (0) として表示されます。日付または時刻としてキャストした数値は、埋め込み SQL から ObjectScript に渡すと、対応する $HOROLOG 値として表示されます。
ビット値のキャスト
expression を 0 または 1 として返すには、それをビット値にキャストします。
expression が以下のいずれかの値であると、CAST から 1 (真) が返されます。
以下の CAST 演算からはすべて 1 が返されます。
SELECT CAST(1 AS BIT) AS One,
CAST(7 AS BIT) AS Num,
CAST(743.6 AS BIT) AS Frac,
CAST(0.3 AS BIT) AS Zerofrac,
CAST('tRuE' AS BIT) AS TrueWord
expression が以下のいずれかの値であると、CAST から 0 (偽) が返されます。
以下の CAST 演算からはすべて 0 が返されます。
SELECT CAST(0 AS BIT) AS Zero,
CAST('FALSE' AS BIT) AS FalseWord,
CAST('T' AS BIT) AS T,
CAST('F' AS BIT) AS F,
CAST(0.0 AS BIT) AS Zerodot,
CAST('' AS BIT) AS EmptyString