Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CAST

与えられた式を、特定のデータ型に変換する関数です。

Synopsis

CAST(expr AS CHAR | CHARACTER | VARCHAR | NCHAR | NVARCHAR)
CAST(expr AS CHAR(n) | CHARACTER(n) | VARCHAR(n))
CAST(expr AS CHAR VARYING | CHARACTER VARYING)
CAST(expr AS INT | INTEGER | BIGINT | SMALLINT | TINYINT)
CAST(expr AS DEC | DECIMAL | NUMERIC)
CAST(expr AS DEC(p[,s]) | DECIMAL(p[,s]) | NUMERIC(p[,s])
CAST(expr AS FLOAT | REAL)
CAST(expr AS DOUBLE)
CAST(expr AS MONEY | SMALLMONEY)
CAST(expr AS DATE)
CAST(expr AS TIME)
CAST(expr AS TIMESTAMP | DATETIME | SMALLDATETIME)
CAST(expr AS BIT)
CAST(expr AS BINARY | BINARY VARYING | VARBINARY)
CAST(expr AS BINARY(n) | BINARY VARYING(n) | VARBINARY(n))
CAST(expr AS GUID)

引数

expr SQL 式
n 最大文字数を示す整数。
p,s オプションp=Precision (合計桁数の最大数)、整数で表します。s=Scale (小数桁数の最大数)、整数で表します。scale が指定されていない場合、既定値は 15 です。

概要

SQL の CAST 関数は、式のデータ型を別のデータ型に変換します。

以下のタイプのいずれにでも式のキャストが可能です。

  • CHAR または CHARACTER : 数値または文字列を、その先頭文字で表します。n が指定されない VARCHAR は、CAST または CONVERT に指定される場合は、既定で 30 文字になります。または、データ型テーブルに示すように、VARCHAR データ型 (指定されたサイズがない) は MAXLEN が 1 の文字にマップされます。NCHAR は CHAR と同等で、NVARCHAR は VARCHAR と同等です。

  • CHAR(n)、CHARACTER(n)、または VARCHAR(n) : 数値または文字列を、n で指定された文字数で表します。

  • CHAR VARYING または CHARACTER VARYING : 数値または文字列を、元の値の文字数で表します。

  • INT、INTEGER、BIGINT、SMALLINT、および TINYINT : 数値を、その整数部で表します。小数部は切り捨てられます。

  • DEC、DECIMAL、および NUMERIC : 数値を、元の値の桁数で表します。Caché の $DECIMAL 関数を使用して変換します。この関数は $DOUBLE 値を $DECIMAL 値に変換する機能を持ちます。p (精度) が指定されている場合、定義されたデータ型の一部として保持されますが、CAST で返された値には影響しません。正の整数で s (スケール) の値を指定する場合、10 進数値は指定された桁数に丸められます (表示モードでは適切な桁数で末尾のゼロが組み込まれますが、論理モードおよび ODBC モードでは切り捨てられます)。s=0 を指定する場合、数値が整数に丸められます。s=-1 を指定する場合、数値が整数に切り捨てられます。

  • FLOAT および REAL : 数値を、元の値の桁数 (有効桁数が 18 で小数桁数が 9) で表します。

  • DOUBLE は IEEE 浮動小数点標準を表します。詳細は、ObjectScript の "$DOUBLE" 関数を参照してください。

  • MONEY および SMALLMONEY は通貨数値データ型です。通貨データ型の小数点以下桁数は必ず 4 です。

  • DATE : 日付を表します。日付は、コンテキストに応じて、現在のロケールでの日付表示形式 (MM/DD/YYYY など)、ODBC 日付形式 (YYYY-MM-DD)、または整数で日付を保存する $HOROLOG 形式 (nnnnn) のいずれかで記述できます。

  • TIME : 時刻を表します。時刻は、コンテキストに応じて、ユーザのロケールでの時刻表示形式 (hh:mm:ss など)、ODBC 日付形式 (hh:mm:ss)、整数で時刻を保存する $HOROLOG 形式 (nnnnn) のいずれかで表すことができます。

  • TIMESTAMP、DATETIME、および SMALLDATETIME : 日付と時刻のスタンプを、YYYY-MM-DD hh:mm:ss 形式で表します。これは、ObjectScript の $ZTIMESTAMP 特殊変数に対応します。

  • BIT は単一のバイナリ値を表します。

  • BINARY、BINARY VARYING、および VARBINARY : データ型 %Library.Binary (xDBC データ型 BINARY) の値を表します。オプションの n の長さは、既定では BINARY は 1、BINARY VARYING と VARBINARY は 30 になります。バイナリ値にキャストする際、データの変換は実際には実行されません。Caché は、指定された n の長さで値の長さを切り捨てます。

  • GUID は、データ型 %Library.UniqueIdentifier の 36 文字の値を表します。37 文字以上の expr を指定した場合、CASTexpr の最初の 36 文字を返します。

Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照してください。他のデータ型変換については、"CONVERT" 関数を参照してください。サポートされていないデータ型で CAST を指定すると、Caché は SQLCODE -376 を生成します。

数値のキャスト

数値は、数値データ型または文字列データ型にキャストできます。

少ない桁数の値に数値をキャストすると、その数値は四捨五入ではなく、切り捨てられます。例えば、98.765 を INT にキャストすると 98 が返され、CHAR にキャストすると 9 が返されます。また、CHAR(4) にキャストすると 98.7 が返されます。負数を CHAR にキャストすると負符号のみが返され、小数を CHAR にキャストすると小数点のみが返される点に注意してください。

数値は、0 ~ 9 の数字の桁、小数点、先頭にある 1 つまたは複数の記号 (+ または –)、および指数記号 (文字 E または e) とそれに続く 1 つ以下の + 記号または – 記号で構成できます。数値に桁区切り文字 (コンマ) を入れることはできません。詳細は、"Caché SQL の使用法" の “言語要素” にある "リテラル" のセクションを参照してください。

数値は、キャストされる前に Caché SQL によって以下のようにその数値のキャノニック形式に変換されます。指数演算が実行されます。Caché によって、先頭と末尾にあるゼロ、先頭にある + 記号、および末尾にある小数点が取り除かれます。数値がキャストされる前に、複数の記号が変換されます。ただし、SQL では 2 つ続いたマイナス記号はコメントを示す記号として扱われます。したがって、数値の中にマイナス記号を 2 つ続けて記述すると、Caché ではそのコード行のそれ以降の部分はコメントとして扱われます。

Caché 浮動小数点は、DEC、DECIMAL、NUMERIC、または FLOAT データ型をとることができます。DOUBLE データ型は IEEE 浮動小数点標準に従って浮動小数点を表します。Caché 浮動小数点データ型は DOUBLE データ型より精度が高く、ほとんどのアプリケーションに推奨されます。CAST を使用して浮動小数点を DOUBLE データ型にキャストすることはできません。代わりに、ObjectScript の $DOUBLE 関数を使用します。

数値を日付データ型または時刻データ型にキャストすると、SQL ではゼロ (0) として表示されます。ただし、日付または時刻にキャストした数値を埋め込み SQL から ObjectScript に渡すと、対応する $HOROLOG 値として表示されます。

文字列のキャスト

文字列は他の文字データ型にキャストできます。得られる返り値は、1 文字、先頭の n 文字、または文字列全体です。

キャストの前に、Caché SQL によって埋め込み引用符文字 ('can''t'=can't) および文字列連結 ('can'||'not'=cannot) が変換されます。先頭の空白や末尾の空白は削除されます。

文字列を数値型にキャストすると、必ず 1 桁のゼロ (0) が返されます。

文字列は、DATE、TIME、TIMESTAMP のいずれかのデータ型にキャストできます。以下の演算では、有効な数値が得られます。

  • DATE : 'yyyy-mm-dd' 形式の文字列は DATE にキャストできます。これは、ODBC 日付形式に対応した文字列形式です。値とその範囲の確認が行われます。入力された日付値は、有効な日付であることが必要です。月および日のフィールドに先頭のゼロが不足している場合は、追加されます。SQL では、キャストされたこの値はロケールの日付表示形式で表示されます。例えば、'2004-11-23' が '11/23/2004' と表示されます。埋め込み SQL では、このキャストにより、対応する $HOROLOG 日付整数が返されます。無効な ODBC 日付や非数値文字列を DATE にキャストすると、論理モードでは 0 として表され、日付 0 は 1840–12–31 として表示されます。

  • TIME : 'hh:mm:ss' または 'hh:mm:ss.nn' 形式の文字列は TIME にキャストできます。これは、ODBC 時刻形式に対応した文字列形式です。値とその範囲の確認が行われます。先頭のゼロが不足している場合は追加されます。埋め込み SQL では、このキャストにより、対応する $HOROLOG 時刻整数が返されます。無効な ODBC 時刻や非数値文字列を TIME にキャストすると、論理モードでは 0 として表され、時刻 0 は 00:00:00 として表示されます。

  • TIMESTAMP : 有効な日付と時刻、有効な日付、または有効な時刻で構成される文字列は TIMESTAMP にキャストできます。日付部分はさまざまな形式で指定できます。不足する日付部分の既定値は 1841–01–01 です。不足する時刻部分の既定値は 00:00:00 です。00 ~ 49 の 2 桁の年は 21 世紀の年に変換され、50 ~ 99 の 2 桁の年は 20 世紀の年に変換されます。先頭のゼロが不足している場合は追加されます。秒の小数部 (指定されている場合) の前には、ピリオド (.) とコロン (:) のいずれかを付けることができます。これらの記号は、意味が異なります。ピリオドは標準的な小数を示すため、12:00:00.4 は 10 分の 4 秒を示し、12:00:00.004 は 1000 分の 4 秒を示します。コロンは、それに続く値が 1000 分の 1 秒単位であることを示すため、12:00:00:4 は 1000 分の 4 秒を示します。コロンの後に続けることができる桁数は 3 に制限されています。

NULL および空文字列のキャスト

NULL はあらゆるデータ型にキャストできますが、返り値は NULL です。

空文字列 ('') は以下のようにキャストします。

  • すべての文字データ型からは NULL が返されます。

  • すべての数値データ型からは 0 (ゼロ) が返されます。末尾には小数部のゼロが適切な数だけ表示されます。DOUBLE データ型からは 0 (ゼロ) が返されます。小数部のゼロは末尾に表示されません。

  • DATE データ型からは 12/31/1840 が返されます。

  • TIME データ型からは 00:00:00 が返されます。

  • TIMESTAMP、DATETIME、および SMALLDATETIME データ型からは NULL が返されます。

  • BIT データ型からは 0 が返されます。

  • すべてのバイナリ・データ型からは NULL が返されます。

日付のキャスト

日付は、日付データ型、数値データ型、または文字データ型にキャストできます。

日付を TIMESTAMP、DATETIME、または SMALLDATETIME のいずれかのデータ型にキャストすると、YYYY-MM-DD hh:mm:ss 形式のタイムスタンプが返されます。日付には時刻部分がないため、返されるタイムスタンプの時刻部分は常に 00:00:00 です。expr 値がロケールの日付表示形式において有効な日付ではない場合、CAST は NULL を返します。

以下のダイナミック SQL の例では、DATE データ型のフィールドを TIMESTAMP にキャストしています。

  ZNSPACE "SAMPLES"
  SET myquery=2
  SET myquery(1)="SELECT TOP 5 DOB,CAST(DOB AS TIMESTAMP) AS TStamp,"
  SET myquery(2)="FROM Sample.Person"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(.myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

以下のダイナミック SQL の例では、TIMESTAMP データ型のフィールドを DATE にキャストしています。

  ZNSPACE "SAMPLES"
  SET myquery=2
  SET myquery(1)="SELECT TOP 5 EventDate,CAST(EventDate AS DATE) AS Horolog,"
  SET myquery(2)="FROM Aviation.Event"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(.myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

日付を数値データ型にキャストすると、その日付の $HOROLOG 値が返されます。これは、1840 年 12 月 31 日を 0 とし、そこから起算した日数を表す整数値です。

日付を文字列データ型にキャストすると、日付全体、またはキャスト先のデータ型で決まる長さの日付が返されます。ただし、表示形式はキャスト先の文字列データ型で異なります。CHAR VARYING および CHARACTER VARYING の両データ型では、日付全体が返されます。例えば、MM/DD/YYYY 形式で日付を表現している場合は、その日付が同じ形式の文字列として返されます。他のデータ型では、日付 (またはその一部) が ODBC 日付形式の文字列として返されます。例えば、日付を mm/dd/yyyy 形式で表現している場合は、その日付が YYYY-MM-DD という形式の文字列として返されます。したがって、日付 04/24/2004 に対して、CHAR データ型では暦年の先頭文字である '2' が返され、CHAR(8) データ型では '2004–04–' が返されます。

ビット値のキャスト

expr 値 AS BIT では、0 または 1 が返されるようにキャストすることができます。expr が 1 など、ゼロ以外の数値の場合は、1 が返されます。expr が “TRUE”、“True”、または “true” の場合は、1 が返されます(“True” という語は大文字と小文字の任意の組み合わせで示してもかまいませんが、“T” と短縮することはできません)。expr がその他の非数値の場合は、0 が返されます。expr が 0 の場合は、0 が返されます。

次の例では、最初の 5 つの CAST 演算では 1 が返され、次の 5 つでは 0 が返されます。

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,
       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 関数を使用して、平均値を浮動小数点ではなく整数として表示します。CAST によって数値が四捨五入ではなく、切り捨てられる点に注意してください。

SELECT DISTINCT AVG(Age) AS AvgAge,
   CAST(AVG(Age) AS INTEGER) AS IntAvgAge
      FROM Sample.Person

以下の例では、CAST 関数を使用して、円周率 (浮動小数点値) をさまざまな数値データ型に変換します。

SELECT 
   CAST({fn PI()} As INTEGER) As IntegerPi,
   CAST({fn PI()} As SMALLINT) As SmallIntPi,
   CAST({fn PI()} As DECIMAL) As DecimalPi,
   CAST({fn PI()} As NUMERIC) As NumericPi,
   CAST({fn PI()} As FLOAT) As FloatPi,
   CAST({fn PI()} As DOUBLE) As DoublePi

以下の例は、精度とスケールの値は解析されますが、CAST で返される値は変更しません。

SELECT 
   CAST({fn PI()} As DECIMAL) As DecimalPi,
   CAST({fn PI()} As DECIMAL(6,3)) As DecimalPSPi

以下の例では、CAST 関数を使用して、円周率 (浮動小数点値) をさまざまな文字列データ型に変換します。

SELECT 
   CAST({fn PI()} As CHAR) As CharPi,
   CAST({fn PI()} As CHAR(4)) As CharNPi,
   CAST({fn PI()} As CHAR VARYING) As CharVaryingPi,
   CAST({fn PI()} As VARCHAR(4)) As VarCharNPi

以下の例では、CAST 関数を使用して、Name (文字列) をさまざまな文字列データ型に変換します。

SELECT DISTINCT 
   CAST(Name As CHAR) As CharName,
   CAST(Name As CHAR(4)) As CharNName,
   CAST(Name As CHAR VARYING) As CharVaryingName,
   CAST(Name As VARCHAR(4)) As VarCharNName
      FROM Sample.Person

以下の例では、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,
   CAST(Name As FLOAT) As FloatName
      FROM Sample.Person

以下の例では、日付フィールド (DOB) を数値データ型、およびいくつかの文字列データ型にキャストします。日付を数値データ型にキャストすると、その日付に相当する $HOROLOG 整数値が返されます。日付を文字列データ型にキャストすると、CHAR VARYING データ型または CHARACTER VARYING データ型の場合は、入力した形式のままでその日付が返されます。それ以外のデータ型では、日付全体またはその一部が ODBC 日付文字列形式で返されます。

SELECT DISTINCT DOB,
   CAST(DOB As INT) AS IntDate,
   CAST(DOB As CHAR) AS CharDate,
   CAST(DOB As CHAR(6)) AS CharNDate,
   CAST(DOB As CHAR VARYING) AS CharVaryDate,
   CAST(DOB As VARCHAR(10)) AS VarCharNDate
      FROM Sample.Person

以下の例では、文字列を DATE データ型および TIME データ型にキャストします。

SELECT CAST('1936-11-26' As DATE) AS StringToDate,
       CAST('14:33:45.78' AS TIME) AS StringToTime

日付に変換できるのは、YYYY-MM-DD 形式の文字列のみです。他の形式の文字列は、0 が返されます。文字列を TIME データ型に変換すると、秒の小数部は四捨五入ではなく、切り捨てられる点に注意してください。

以下の例では、日付を TIMESTAMP データ型にキャストします。

SELECT DISTINCT DOB,
   CAST(DOB As TIMESTAMP) AS DateToTstamp
      FROM Sample.Person

ここで得られるタイムスタンプは、YYYY-MM-DD hh:mm:ss 形式で表されます。

以下の例では、文字列を TIME データ型にキャストし、その結果を TIMESTAMP データ型にキャストします。

SELECT CAST(CAST('14:33:45.78' AS TIME) As TIMESTAMP) AS TimeToTstamp

ここで得られるタイムスタンプは、YYYY-MM-DD hh:mm:ss 形式で表されます。時刻の部分は入れ子になっている CAST で指定されています。また、日付の部分は現在のシステム日付です。

関連項目

FeedbackOpens in a new tab