SQL 関数、演算子、式および述部 - Teradata

What would you do if you knew?™
Teradata Database
SQL 関数、演算子、式および述部
リリース 15.10
B035-1145-151K-JPN
2015 年 6 月
本書に記載されている製品は、Teradata Corporation またはその関連会社がライセンスを有する製品です。
Teradata、Active Data Warehousing、Active Enterprise Intelligence、Applications-Within、Aprimo Marketing Studio、Aster、BYNET、
Claraview、DecisionCast、Gridscale、MyCommerce、QueryGrid、SQL-MapReduce、Teradata Decision Experts、Teradata Labs ロゴ、
Teradata ServiceConnect、Teradata Source Experts、WebAnalyst、および Xkoto は、Teradata Corporation またはその関連会社の米国および
その他の国における商標または登録商標です。
Adaptec および SCSISelect は、Adaptec, Inc.の商標または登録商標です。
AMD Opteron および Opteron は、Advanced Micro Devices, Inc.の商標です。
Apache、Apache Avro、Apache Hadoop、Apache Hive、Hadoop、および黄色い象のロゴは、Apache Software Foundation の米国およびその
他の国における登録商標または商標です。
Apple、Mac、および OS X すべては、Apple Inc.の登録商標です。
Axeda は、Axeda Corporation の登録商標です。Axeda Agents、Axeda Applications、Axeda Policy Manager、Axeda Enterprise、Axeda
Access、Axeda Software Management、Axeda Service、Axeda ServiceLink、および Firewall-Friendly は、Axeda Corporation の商標であり、
Maximum Results および Maximum Support は、Axeda Corporation の役務商標です。
Data Domain、EMC、PowerPath、SRDF、および Symmetrix は、EMC Corporation の登録商標です。
GoldenGate は、Oracle の商標です。
Hewlett-Packard および HP は、Hewlett-Packard Company の登録商標です。
Hortonworks、Hortonworks ロゴおよびその他の Hortonworks 商標は、Hortonworks Inc.の米国およびその他の国における商標です。
Intel、Pentium、および XEON は、Intel Corporation の登録商標です。
IBM、CICS、RACF、Tivoli、および z/OS は、International Business Machines Corporation の登録商標です。
Linux は、Linus Torvalds の登録商標です。
LSI は、LSI Corporation の登録商標です。
Microsoft、Active Directory、Windows、Windows NT、および Windows Server は、Microsoft Corporation の米国およびその他の国における
登録商標です。
NetVault は、Dell Inc.の米国またはその他の国における商標または登録商標です。
Novell および SUSE は、Novell, Inc.の米国およびその他の国における登録商標です。
Oracle、Java、および Solaris は、Oracle またはその関連会社の登録商標です。
QLogic および SANbox は、QLogic Corporation の商標または登録商標です。
Quantum および Quantum ロゴは、Quantum Corporation の商標であり、米国およびその他の国で登録されています。
Red Hat は、Red Hat, Inc.の商標であり、米国およびその他の国で登録されています。ライセンスに基づいて使用されます。
SAP は、SAP AG のドイツおよびその他のいくつかの国における商標 または登録商標です。
SAS および SAS/C は、SAS Institute Inc.の商標または登録商標です。
SPARC は、SPARC International, Inc.の登録商標です。
Symantec、NetBackup、および VERITAS は、Symantec Corporation またはその関連会社の米国およびその他の国における商標または登録商標
です。
Unicode は、Unicode, Inc.の米国およびその他の国における登録商標です。
UNIX は、The Open Group の米国およびその他の国における登録商標です。
その他記載されている製品名および企業名は、各社の商標です。
本書に記載されている情報は、「現状のまま」提供され、商用および特定の用途での使用に対する適合性、または権利侵害がないことに関す
る暗黙的な保証を含め、明示的または暗黙的なすべての保証は一切ありません。 一部の法域では暗黙的保証の除外を許可しないため、上記制
限が適用されないことがあります。いかなる場合も Teradata Corporation は、逸失利益または逸失財産を含む、あらゆる間接的、直接的、特
殊、付随的、または必然的な損害に対し、たとえそのような損害の可能性を明示的に通知されていたとしても、責任を負うことはありません。
本書に記載されている情報は、日本では発表されていないかもしくは利用できない機能、製品やサービスを参照または相互参照している場合
があります。これらの参照は、必ずしも Teradata Corporation が日本でこれらの機能、製品やサービスを発表する意図があることを意味する
ものではありません。日本で利用可能な機能、製品やサービスについては、日本テラデータ株式会社の担当者に確認ください。
本書に記載されている情報には、技術的に不正確な記述または誤植が含まれている可能性があります。本書の情報は、予告なしに変更または
更新される場合があります。また、Teradata Corporation は、本書に記載されている製品やサービスを随時予告なしに改良または変更すること
ができます。
製品およびサービスの品質を維持するため、本書の正確性、明瞭性、構成、有用性についてコメントを頂けると幸いです。次のアドレスに E
メールで連絡ください。[email protected]
Teradata Corporation に送られたコメントや資料(「フィードバック」と総称する)は、機密情報とは見なされません。Teradata Corporation は、
フィードバックに関していかなる種類の義務も負わず、フィードバックとその派生物を無償で制限なしに使用、複製、開示、公開、表示、変
換、派生物の作成、および配布できるものとします。さらに、Teradata Corporation は、そのようなフィードバックに含まれる、あらゆる考
え、概念、ノウハウや技術を、フィードバックを組み込んだ製品やサービスの開発、製造、または販売を含め、どのような目的にでも自由に
使用できるものとします。
Copyright © 2000 - 2015 by Teradata. All Rights Reserved.
SQL 関数、演算子、式および述部
Release 15.10
B035-1145-151K
2015 年 6 月
序文
目的
このマニュアルでは、Teradata SQL の関数、演算子、式、および述部について解説
しています。
このマニュアルは、SQL マニュアル セットに含まれる他のマニュアル類と一緒に使
用してください。
対象読者
このマニュアルは Teradata Database を使用するデータベース管理者およびその他
の技術担当者を対象としています。
サポートされるソフトウェア リリースとオペレーティング シ
ステム
このマニュアルは、Teradata Database 15.10 用です。
®
Teradata Database 15.10 は、以下のオペレーティング システムでサポートされて
います。
• SUSE Linux Enterprise Server (SLES) 10 SP3
• SUSE Linux Enterprise Server (SLES) 11 SP1
Teradata Database クライアント アプリケーションは他のオペレーティング システ
ムに対応しています。
前提条件
基本的なリレーショナル データベース管理の理論と技術について精通している必要
があります。
Teradata Database 固有の概念については、<Teradata 概要、B035-1091>および
<SQL 基礎、B035-1141>をお読みください。
組み込み SQL を使用するアプリケーションの開発の詳細については、<Teradata
PreProcessor2 埋め込み SQL プログラマ ガイド, B035-2446>を参照してください。
SQL 関数、演算子、式および述部
3
序文
このマニュアルの改訂内容
このマニュアルの改訂内容
リリース
説明
Teradata Database 15.10
「集約関数」の章の「結果のタイプと属性」
セクションを更新し、COUNT 集約関数を含
めました。
2015 年 6 月
TRYCAST 関数について解説しました。
Right、Left、および Reverse システム関数を
追加しました。
CreateFsysInfoTable セクションと
PopulateFsysInfoTable セクションを更新し
て、Ferret SHOWWHERE コマンドへの SQL
インターフェースを含めました。構文図を更
新して、SHOWWHERE を含めました。また、
SHOWWHERE 出力の新しい例を
CreateFsysInfoTable セクションと
PopulateFsysInfoTable セクションに追加しま
した。
「テーブル演算子」の章の「SCRIPT」セク
ションに「メモリ制限の設定」を追加しまし
た。
R テーブル演算子について説明しました。
追加情報
URL
説明
www.info.teradata.com 「Teradata Information Products Publishing Library」サイトでは、
英語版について以下が可能です。
• マニュアルを表示またはダウンロードします。
• Downloadable Publications で General Search を選択しま
す。
• 検索基準を入力して Search をクリックします。
• マニュアル CD-ROM をダウンロードします。
• Downloadable Publications で General Search を選択しま
す。
• Title or Keyword フィールドで、「CD-ROM」と入力し、
Search をクリックします。
www.teradata.com
4
Teradata ホームページには、Teradata に関する情報を得るため
の次のようなリンクが多数用意されています。
• エグゼクティブ レポート、ホワイト ペーパー、Teradata 導入
企業の事例研究、およびソート リーダーシップ
• 技術情報、ソリューション、および専門的アドバイス
SQL 関数、演算子、式および述部
序文
製品の安全情報
URL
説明
• プレス リリース、関連記事、およびメディア リソース
www.teradata.com/TEN Teradata Customer Education では、ユーザーによる Teradata へ
/
の投資を最大限まで活かすことができるようにするため、ユー
ザーの技術と能力を確立するためのトレーニングを行なっていま
す。
https://
tays.teradata.com
Teradata @ Your Service を利用すれば、オレンジ ブック、テク
ニカル アラート、ナレッジ リポジトリの参照、フォーラムの閲
覧と参加、ソフトウェア パッチのダウンロードを行なうことがで
きます。
Teradata Developer
Exchange
Teradata Developer Exchange では、Teradata 製品の使い方、技
術検討フォーラム、コードのダウンロードなどのコーナーを提供
しています。
製品およびサービスの品質を維持するため、本書の正確性、明瞭性、構成、有用性
についてコメントを頂けると幸いです。次のアドレスに E メールで連絡ください。
[email protected]
製品の安全情報
このドキュメントには、データまたは所有物の損害に関連する製品の安全ポリシー
を扱った情報が含まれている場合があり、これらは注記という言葉で識別できます。
この注記書きは、その状況が避けられない場合、機器またはデータなどの所有物が、
人身傷害を除く損害を受ける可能性があることを示します。
例
注記: 再構成ユーティリティを不適切に使用すると、データが失われる可能性があります。
Teradata Database のオプション機能
このマニュアルには、Teradata Database の以下のオプション機能と製品に関する説
明が含まれている場合があります。
• メモリ内最適化
• セキュア ゾーン
• Teradata Columnar
• Teradata QueryGrid:Teradata Database-to-Hadoop
• Teradata QueryGrid:Teradata Database-to-Oracle Database
• Teradata QueryGrid: Teradata Database-to-Teradata Database
• Teradata 行レベル セキュリティ
• Teradata Temporal
• Teradata Virtual Storage (VS)
SQL 関数、演算子、式および述部
5
序文
Teradata Database のオプション機能
これらの機能は適切なライセンスがないと使用できません。これらの機能が製品メ
ディアやダウンロードに含まれていたり、または入手した資料で説明されていたと
しても、適切なライセンスがないとそれらの機能を使用することはできません。
オプション機能の購入および有効化については、Teradata 営業担当者までご連絡く
ださい。
6
SQL 関数、演算子、式および述部
第1章
序
概要
この章では、SQL 関数、演算子、式、および述部について説明します。
地理空間データを対象とする特殊な関数、演算子、述部、およびメソッドの詳細は、
<SQL 地理空間タイプ、B035-1181>を参照してください。
XML データ型および XML 操作、関数、およびメソッドの詳細は、<Teradata XML、
B035-1140>を参照してください。
JSON についての詳細は、<Teradata JSON、B035-1150>を参照してください。
SQL 関数
SQL 関数は、関数が呼び出されたときに指定される引数に応じてデータベースの局
面についての情報を戻します。
関数は入力引数を受け入れて出力値を戻すことにより、1 つの結果を生じます。一
部の SQL 関数には引数がありませんが、値を戻します。たとえば、そのような SQL
関数として CURRENT_DATE があります。
SQL 関数のタイプ
関数のタイプ
定義
スカラー
引数は、同一タイプまたは混合タイプの個々のスカラー値で、それぞれ異
なる意味を持つことができます。
結果は単一の値または null です。
スカラー関数は、式を使用できるどの SQL 文にも使用できます。
集約
引数は行のグループです。
結果は単一の値または null です。
集約関数は通常、SELECT 文の式リスト内と、WITH 句の要約リスト内で
使用されます。
SQL 関数、演算子、式および述部
7
第1章序
SQL 関数
関数のタイプ
定義
テーブル
引数は、同一タイプまたは混合タイプの個々のスカラー値で、それぞれ異
なる意味を持つことができます。
結果はテーブルです。
テーブル関数は、SELECT 文の FROM 句内でのみ使用できます。
テーブル関数はユーザー定義関数の形式です。これについては、<SQL 外
部ルーチン プログラミング、B035-1147>で説明されています。
順序付き分析
引数は、任意の標準 SQL 式です。
結果は、その他の SQL 式と同じように処理されます。結果列として示すこ
ともできれば、さらに複雑な計算式の一部として組み込むこともできます。
順序付き分析関数は、並べ替え済みの結果行セットを必要とする操作や、
直前の行の値に基づく操作で使用されます。
関数の例
関数
説明
SELECT CHARACTER_LENGTH(Details)
スカラー関数は Details 列の文字または CLOB の
値を取り、Orders テーブルの各行に対して数値
を返します。
FROM Orders;
SELECT AVG(Salary)
FROM Employee;
集約関数は、Employee テーブルの Salary 列に
よって指定される数値のグループに対して、単
一の値を返します。
埋め込みサービス システム関数
Teradata Database には、文字列処理、DateTime 演算、バイト/ビット操作など、さ
まざまな機能をサポートする一連のシステム関数が用意されています 。
埋め込みサービス システム関数の有効化
埋め込みサービス関数を使用する前に、データベース初期化プログラム(DIP)ユーティ
リティを実行し、DIPALL または DIPSYSFNC スクリプトを実行する必要があります。
DIPALL はシステム インストールの一部として実行されます。
DIP スクリプトは TD_SYSFNLIB データベースを作成します。このデータベースは、
埋め込みサービス関数をサポートするために、システムだけが使用します。このデー
タベースには、どんなデータベース オブジェクトも格納してはいけません 。格納す
ると、埋め込みサービス関数を正しく操作できなくなる場合があります。
TD_SYSFNLIB データベースまたは DBC ディクショナリ テーブルが関与する BAR 操
作を実行する場合は、DIPALL または DIPSYSFNC スクリプトを再実行して、埋め込
みサービス関数を再始動させる必要があります。
8
SQL 関数、演算子、式および述部
第1章序
SQL 演算子
埋め込みサービス システム関数の呼び出し
埋め込みサービス関数は、関数名だけを使用して呼び出すことができます。例えば、
CEILING (arg)のようにします。
TD_SYSFNLIB データベース名を追加することにより、関数の名前を修飾することも
できます。例えば、完全修飾した構文、TD_SYSFNLIB.CEILING(arg)を使用して、
CEILING 関数を呼び出すことができます。
注: 埋め込みサービス関数を、関数名だけを使用して呼び出そうとしたときに、同名
のユーザーが開発した UDF が現在のデータベースまたは SYSLIB データベースに存
在すると、Teradata Database は埋め込みサービス関数の代わりに、ユーザーが開発
した UDF を実行します。
そのため、確実に埋め込みサービス関数を呼び出すためには、次のいずれかの操作
を行ないます。
• ユーザーが開発した同名の UDF を通常の UDF 検索パス、つまり現在のデータ
ベースおよび SYSLIB データベースから削除します。詳細については、<SQL 外部
ルーチン プログラミング、B035-1147>の「UDF の位置」を参照してください。
• 完全修飾した構文を使用して、埋め込みサービス関数を呼び出します。
暗黙のデータ タイプ変換規則
埋め込みサービス関数は、UDF に適用される暗黙のデータ タイプ変換規則に従いま
す。UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変
換規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タ
イプに変換できない関数の引数は、明示的にキャストする必要があります。詳細に
ついては、<SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」
を参照してください。
関連トピック
詳細は、以下を参照してください。
• テーブル関数の例については、<SQL 外部ルーチン プログラミング、B035-1147>
を参照してください。
• たとえば、TD_SYSFNLIB.embedded_services_function のようにします。
SQL 演算子
SQL 演算子は、その引数に基づいて演算を実行するシンボルおよびキーワードです。
SQL では次の種類の演算子を使用することができます。
• 数値に対して実行される+、-などの算術演算子、日時、および間隔データ タイプ
です。
• 連結演算子||は、文字およびバイト タイプに対して実行されます。
SQL 関数、演算子、式および述部
9
第1章序
SQL 式
• =、>などの比較演算子は、引数の関係の真偽をテストします。比較演算子の詳細
については、「比較演算子と関数の概要」を参照してください。
比較演算子は、結果が TRUE、FALSE、不明(NULL)のいずれかの値になるため、
条件式とも呼ばれます。
• INTERSECT および UNION などの集合演算子または関係演算子は、複数のソース
からの結果の集合を単一の結果の集合に結合します。
SQL 式
SQL 式に値を指定すると、算術演算と論理演算を実行したり、リテラルと格納され
た値から新しい値や論理結果を生成したりできます。式は、次のものから構成する
ことができます。
•
•
•
•
•
•
•
列名
リテラル(定数とも呼ばれます)
関数
USING 変数
パラメータ
パラメータ マーカー(疑問符(?)プレースホルダー)
演算子で結合された列名、リテラル、および関数の組み合わせ
式の種類
SQL 式は通常、次のカテゴリに分類されます。
タイプ
説明
数値式
式は、通常、算出する結果の種類によって分類されます。
文字列式
たとえば、数値式は、列名、リテラル、関数で構成されているか、結
果が数値タイプの場合に算術演算子で結合された列名、リテラル定
数、および関数の組み合わせで構成されています。
日時式
間隔式
派生 PERIOD などの
期間式
CASE 式
CASE 式は、一連の WHEN/THEN 句とオプションの ELSE 句で構成さ
れています。
値形式の CASE 式は、テスト式と同等の最初の WHEN 式のテストを
行ない、一致する THEN 式の値を戻します。どの WHEN 式もテスト
式と同等でない場合、CASE は ELSE 式を返します。省略されている
場合には NULL を返します。
10
SQL 関数、演算子、式および述部
第1章序
SQL 述部
タイプ
説明
検索形式の CASE 式は、TRUE と評価される最初の WHEN 式のテスト
を行ない、一致する THEN 式の値を返します。どの WHEN 式も TRUE
と評価されない場合、CASE は ELSE 式を返します。省略されている
場合には NULL を返します。
式の例
式
説明
'Test Tech'
文字列リテラル
1024
数値リテラル
Employee.FirstName
列名
Salary * 12 + 100
数値を算出する算術式
INTERVAL '10' MONTH * 4
間隔値を算出する間隔式
CURRENT_DATE + INTERVAL '2' DAY
DATE 値を算出する日時式
CURRENT_TIME - INTERVAL '1' HOUR
TIME 値を算出する日時式
'Last' || ' Order'
文字列値を算出する文字列式
CASE x
数値を算出する値形式の CASE 条件式
WHEN 1
THEN 1001
ELSE 1002
END
SQL 述部
SQL 述部は論理述部とも呼ばれ、条件式の一種です。行またはグループの条件とし
て、次の 3 つのいずれかの状態を指定します。
• TRUE
• FALSE
• NULL(または不明)
述部は次のように表わされます。
• SELECT 文中の行を修飾または修飾解除するための WHERE、ON、または HAVING
句。
• 検索形式 CASE 式の WHEN 句検索条件。
SQL 関数、演算子、式および述部
11
第1章序
SQL 述部
• CASE_N 関数。
• ストアド プロシージャ内の IF、WHILE、REPEAT、および CASE 文。
論理述部の種類
SQL には次の論理述部があります。
•
•
•
•
•
•
•
比較演算子
[NOT] BETWEEN
LIKE
[NOT] IN
[NOT] EXISTS
OVERLAPS
IS [NOT] NULL
述部に対して操作を行なう論理演算子
• NOT
• AND
• OR
述部数量詞
• SOME
• ANY
• ALL
述部の例
述部
説明
SELECT *
Employee テーブルから行を選択するための条件
を指定する WHERE 句の述部。
FROM Employee
WHERE Salary < 40000;
SELECT SUM(CASE
WHEN part BETWEEN 100 AND 199
THEN 0
Orders テーブルの特定の行について、SUM 関数
に渡される値を決定する条件を指定する CASE 式
の述部。
ELSE cost
END)
FROM Orders;
12
SQL 関数、演算子、式および述部
第2章
集約関数
概要
この章では、SQL 集約関数について説明します。
詳細情報
• ウィンドウ集約関数とそれに相当する Teradata 固有の関数については、ウィン
ドウ集約関数を参照してください。
• 集約ユーザー定義関数(UDF)、集約 UDF を参照してください。
• ウィンドウ集約 UDF、ウィンドウ集約 UDF を参照してください。
集約関数について
集約関数は通常、算術式の中で使用されます。集約関数は、行のグループに対して
動作し、グループごとの結果テーブルに単一の値を返します。
次の文では、SUM 集約関数は Sales_Table テーブルによって定義された行のグルー
プに対して動作します。
SELECT SUM(Total_Sales)
FROM Sales_Table;
Sum(Total_Sales)
---------------5192.40
複数の結果値としてより複雑で精巧な結果を出すために、GROUP BY 句を使用する
ことができます。次の文では、SUM 集約関数は Sales_Table テーブルの Product_ID
列によって定義された行のグループに対して動作します。
SELECT Product_ID, SUM(Total_Sales)
FROM Sales_Table
GROUP BY Product_ID;
Product_ID Sum(Total_Sales)
---------- ---------------101
2100.00
107
1000.40
102
2092.00
集約と選択リスト
集約関数は通常、SELECT 文の式リスト内と、WITH 句の要約リスト内で使用され
ます。
SQL 関数、演算子、式および述部
13
第 2 章 集約関数
概要
集約と GROUP BY
SQL 文の選択リストで集約関数を使用する場合には、選択リストに含まれる他のす
べての列も、集約関数によって参照されなければなりません。または、その列名が
GROUP BY 句に入っていなければなりません。たとえば、以下の文では集約関数と
選択リストに含まれる列を使用しており、列名を GROUP BY 句で参照しています。
SELECT COUNT(*), Product_ID
FROM Sales_Table
GROUP BY Product_ID;
それは、非 GROUP BY の列参照は複数の値を戻すことができますが、集約は値を 1
つしか戻さないためです。
集約と日付
日付に AVG、MIN、MAX、COUNT を適用する操作は有効ですが、SUM(date)の指定
は無効です。
集約と選択リスト内のリテラル式
オプションで、選択リスト内のリテラル式を GROUP BY 句に入れることもできま
す。たとえば、以下の文では集約関数と選択リストに含まれるリテラル式を使用し
ていますが、GROUP BY 句を使用していません。
SELECT COUNT(*),
SUBSTRING( CAST( CURRENT_TIME(0) AS CHAR(14) ) FROM 1 FOR 8 )
FROM Sales_Table;
テーブルに行がない場合、このような文の結果は、リテラル式のタイプに応じて異
なります。
リテラル式
問合わせ結果内のリテラル式の結果
列参照が含まれていな リテラル式の値。
い場合
RANDOM などの関数は、集約ステップではなく、要求の即時検索
確定的な関数ではない ステップで計算されます。
場合(RANDOM など)
例を挙げます。
SELECT COUNT(*),
SUBSTRING(CAST(CURRENT_TIME(0) AS CHAR(14))
FROM 1 FOR 8)
FROM Sales_Table;
Count(*) Substring(Current Time(0) From 1 For 8)
-------- --------------------------------------0 09:01:43
14
SQL 関数、演算子、式および述部
第 2 章 集約関数
概要
リテラル式
問合わせ結果内のリテラル式の結果
列参照が含まれている NULL
場合
例を挙げます。
UDF の場合
SELECT COUNT(*), UDF_CALC(1,2)
FROM Sales_Table;
Count(*) UDF_CALC(1,2)
----------- ------------0
?
集約の入れ子
集約演算を入れ子にすることはできません。以下の集約は無効であり、エラーが返
されます。
AVG(MAXIMUM (Salary))
しかし、集約関数を集約ウィンドウ関数の入れ子にすることは可能です。次の文で
は SUM 集約関数が RANK ウィンドウ関数の入れ子になっており、有効です。
SELECT region
,product
,SUM(amount)
,RANK() OVER (PARTITION BY region ORDER by SUM (amount))
FROM table;
ゼロ行に対する集約の結果
ゼロ行に対して集約を実行すると、動作は次の表のようになります。
集約関数の形式
ゼロ行しかない場合に戻される
結果
COUNT(expression) WHERE …
0
他のすべての形式の aggregate_operator (expression)
WHERE …
Null
aggregate_operator (expression) … GROUP BY …
レコードが見つからない
aggregate_operator (expression) … HAVING …
集約と NULL
COUNT(*)以外の集約は、すべての計算で null を無視します。
SQL 関数、演算子、式および述部
15
第 2 章 集約関数
概要
注: UDT 列の値が NULL になるのは、NULL に設定された属性を UDT インスタンス
が持っている場合ではなく、列に明示的に NULL を入れた場合だけです。
null を無視すると、明らかに過渡的ではない異常な結果になることがあります。た
とえば、列 A または列 B (あるいはその両方)に NULL があると、実際に、次の式は、
必ず真になります。
SUM(A) + SUM(B) <> SUM(A+B)
ただし、列 A と B の両方の値が同じ行にあって NULL である場合は、例外です。そ
の場合には、行の全体が集約において無視されるからです。これは、一般規則に違
反しないようなささいな例です。
より正式にいえば、フィールド A とフィールド B の両方が null である場合にだけ、
いずれかのフィールドに null が現われるたびに上記の不等条件が false になります。
この動作を示す例については、結果のタイプと属性の「例: Null として返される社
員」および「例: 部署に割り当てられていない社員のカウント」を参照してくださ
い。集約は確実に所定どおりに動作していて、結果は算術的に異常にならないこと
に注意する必要があります。
この明らかに過渡的ではない問題が現われた場合には、解決する手段がいくつかあ
ります。次のいずれかの解決方法では、一定の同じ結果が得られます。
• 必ず、数値列を NOT NULL DEFAULT 0 として定義します。
• 集約関数の中で ZEROIFNULL 関数を使用して、計算のために NULL をゼロに変換
します。たとえば、SUM(ZEROIFNULL(x) + ZEROIFNULL(y))は、
SUM(ZEROIFNULL(x) + ZEROIFNULL(y))と同じ結果を出します。
浮動小数点データに対する集約演算
次のように、浮動小数点数を使った演算は、概算および四捨五入のエラーのせいで
常にそれぞれが相互に関連しあっているとは限りません。((A+B)+C)は必ずしも(A+(B
+C))に等しいわけではありません。
また、まだ明白ではありませんが、浮動小数点値の算術の非結合性が集計操作に影
響を与える可能性もあります。 所定の浮動小数データで集計関数を使うたびに、異
なる結果になることがあります。Teradata Database が集約を実行する場合、最終的
な結果を生成するために、計算に含まれた各 AMP から個々の条件を累積して条件を
評価します。 評価の順序によって、結果が多少異なる場合があり、また個々の AMP
がそれらの作業を終了する順序が予想できないため、同じシステム上の同じデータ
の集計関数の結果が異なることがあります。
集約と LOB
集約は CLOB または BLOB データ タイプをサポートしていません。
16
SQL 関数、演算子、式および述部
第 2 章 集約関数
概要
集約および Period データ タイプ
集約(COUNT を除く)は、Period データ タイプをサポートしていません。
集約と SELECT AND CONSUME 文
集約は、SELECT AND CONSUME 文では使用できません。
集約と再帰的問合わせ
集約関数は、再帰的問合わせの再帰文では使用できません。ただし、再帰的問合わ
せの中の非再帰シード文で集約関数を指定することができます。
WHERE および HAVING 句で使用される集約
集約は、以下のタイプの句で使用することができます。
• アボート条件を指定するための ABORT 文の WHERE 句。
ただし、集約関数を SELECT 文の WHERE 句で使用することはできません。
• グループ条件を指定するための HAVING 句。
DISTINCT オプション
DISTINCT オプションは、式が処理される時に重複した値が使用されないように指
定します。
次の SELECT はテーブルの中の固有のジョブ タイトルの数を戻します。
SELECT COUNT(DISTINCT JobTitle) FROM Employee;
以下の例に示すとおり、1 つの問合わせで、同一式をもった DISTINCT を使用する
複数の集約関数をもつことができます。
SELECT SUM(DISTINCT x), AVG(DISTINCT x) FROM XTable;
また、次の例のように、1 つの問合わせで、さまざまな式をもつ DISTINCT を使用
する複数の集約関数をもつこともできます。
SELECT SUM(DISTINCT x), SUM(DISTINCT y) FROM XYTable;
集約および行レベル セキュリティ テーブル
行レベル セキュリティで保護されたテーブルを参照する集約関数(SUM、COUNT、
MAX、MIN または AVG など)が要求に含まれている場合、その集約は要求を発行し
たユーザーがアクセスできる行にのみ基づいたものになります。この集約をテーブ
ルに含まれるすべての行に適用するには、ユーザーには次のいずれかが必要になり
ます。
SQL 関数、演算子、式および述部
17
第 2 章 集約関数
AVG
• テーブルのすべての行にアクセスするために必要なセキュリティ クレデンシャル。
• テーブルのセキュリティ制約に対して必要な OVERRIDE 権限。
関連トピック
計算での浮動小数点値に関連する潜在的な問題の詳細は、< SQL データ型とリテラ
ル、B035-1143>を参照してください。
詳細:
• ウィンドウ集約関数とそれに相当する Teradata 固有の関数については、ウィンド
ウ集約関数を参照してください。
• 集約ユーザー定義関数(UDF)、集約 UDF を参照してください。
• ウィンドウ集約 UDF、ウィンドウ集約 UDF を参照してください。
• 行レベル セキュリティについては、<セキュリティ管理ガイド 、B035-1100>を
参照してください。
AVG
目的
value_expression のすべての値の算術平均値を返します。
構文
AVERAGE
(
value_expression )
AVG
DISTINCT
AVE
ALL
構文要素
ALL
value_expression の null でないすべての値が、重複を含めて、計算に含まれます。
DISTINCT
value_expression によって指定された重複を計算から除外します。
value_expression
平均値が計算されるリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
18
SQL 関数、演算子、式および述部
第 2 章 集約関数
AVG
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
AVERAGE と AVE は、ANSI 標準の Teradata 拡張機能です。
結果のタイプと属性
次の表に、AVG の結果のデフォルト属性をリストしています。
属性
値
データ タ REAL
イプ
タイトル
Average(x)
書式
オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプ
の書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。
AVG を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。
INTEGER 値または DECIMAL 値の計算
DECIMAL または INTEGER 値の AVG は、個々の値が非常に大きい場合、または値の
数が多い場合には、オーバーフローになる可能性があります。
オーバーフローが発生した場合には、次のように、DECIMAL または INTEGER 値を
REAL に変換する CAST 関数を入れて AVG の呼出しを変更します。
AVG(CAST(value AS REAL) )
平均をとる前に値を REAL としてキャストすると、多少精度を欠くことになります。
結果のタイプは、どちらの場合も REAL になるため、CAST を行なっても多少精度
が悪くなるだけでその他の点においては結果は変わりません。
SQL 関数、演算子、式および述部
19
第 2 章 集約関数
AVG
x が整数である場合には、AVG は小数値を表示しません。小数値は、値を DECIMAL
としてキャストすることによって得られます。たとえば、次の DECIMAL への CAST
を使用します。
CAST(AVG(value) AS DECIMAL(9,2))
制約事項
value_expression は、関数によって得られたビュー列に対する列参照であってはな
りません。
AVG は数値データに対してのみ有効です。
結果の計算には NULL は含められません。
例: 地域ごとの平均売上の売上テーブルの問合わせ
この例では、地域ごとの平均の売上を問合わせ、次の結果を戻します。
SELECT Region, AVG(sales)
FROM sales_tbl
GROUP BY Region
ORDER BY Region;
Region Average (sales)
------ --------------North
21840.17
East
55061.32
Midwest
15535.73
AVG ウィンドウ関数
グループ、累計、および移動平均を計算する AVG ウィンドウ関数については、ウィ
ンドウ集約関数を参照してください。
関連トピック
詳細は、以下を参照してください。
• 計算での浮動小数点値に関連する潜在的な問題の詳細は、< SQL データ型とリテ
ラル、B035-1143>を参照してください。
• 書式における書式設定文字についての説明は、 < SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
• セキュリティ管理ガイド 、B035-1100
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• AVG 拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、
<ユーティリティ 、B035-1102>を参照してください。
20
SQL 関数、演算子、式および述部
第 2 章 集約関数
CORR
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• null の詳細については、<SQL 基礎、B035-1141>および集約と NULL を参照し
てください。
• 集約ユーザー定義関数(UDF)、集約 UDF を参照してください。
• ウィンドウ集約 UDF、ウィンドウ集約 UDF を参照してください。
CORR
目的
すべての非 null データ点の対について、引数のサンプル ピアソン積モーメントの相
関係数を返します。
構文
CORR
( value_expression_1, value_expression_2 )
構文要素
value_expression_2/value_expression_1
第 2 の数値式との相関をとる数値式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
サンプル ピアソン積モーメント相関係数は、変数間の線形関連の尺度です。算出さ
れる係数の範囲は -1.00 ~ +1.00 です。
相関が高いからといって、変数間に因果関係があることを暗示してはいないことに
注意する必要があります。
次の表は、2 つの変数間の相関係数の 4 つの極限値の意味を示しています。
相関係数の値
変数間の関連
-1.00
完全に線形で逆向き
y の値の変化につれて、x も逆方向に等量変化する。
0
関連はなく、いわゆる「相関なし」。
+1.00
完全に線形。
y の値の変化につれて、x も同方向に等量変化する。
SQL 関数、演算子、式および述部
21
第 2 章 集約関数
CORR
相関係数の値
変数間の関連
NULL
計算に使用される非 NULL データ点の対がデータに存在しない
ため、測定不能。
計算
CORR の計算の公式は次のように定義されます。
変数
内容
x
value_expression_2
y
value_expression_1
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
CORR(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
REAL
DECIMAL(7,6)のデフォルト書式
CORR(y,x)
書式における書式設定文字についての説明は、 < SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
CORR を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
他の関数との組み合わせ
CORR は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付き分
析関数と組み合わせることができます。 順序付き分析関数の詳細は、順序付き分析
関数を参照してください。
22
SQL 関数、演算子、式および述部
第 2 章 集約関数
COUNT
CORR は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約関数
と組み合わせることはできません。
例: HomeSales テーブルのデータの問合わせ
この例では、次の HomeSales テーブルのデータを使用します。
SalesPrice
---------160000
180000
200000
220000
240000
260000
280000
NbrSold
------126
103
82
75
82
40
20
Area
--------358711030
358711030
358711030
358711030
358711030
358711030
358711030
次の問合わせについて説明します。
SELECT CAST (CORR(NbrSold,SalesPrice) AS DECIMAL (6,4))
FROM HomeSales
WHERE area = 358711030
AND SalesPrice Between 160000 AND 280000;
CORR(NbrSold,SalesPrice)
------------------------.9543
結果の-.9543 は、変数間に逆向きの関係があることを示唆しています。つまり、問
合わせで指定された Area と SalesPrice の範囲において、NbrSold の値は、SalesPrice
が減少すると増加し、SalesPrice が増加すると減少します。
CORR ウィンドウ関数
グループ、累計、または移動を計算する CORR ウィンドウ関数については、ウィン
ドウ集約関数を参照してください。
関連トピック
詳細は、以下を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• 詳細は、<ユーティリティ 、B035-1102>を参照してください。
COUNT
目的
value_expression 内で限定された行の合計数として列の値を返します。
SQL 関数、演算子、式および述部
23
第 2 章 集約関数
COUNT
構文
COUNT
(
value_expression
)
DISTINCT
ALL
*
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれます。
DISTINCT
value_expression によって指定された重複を計算から除外します。
この式に順序付き分析関数や集約関数を含めることはできません。
value_expression
値の数が計算されるリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
*
COUNT によって操作が実行される行のグループ内のすべての行をカウントします。
使用上の注意
構文
カウントする行の総数
COUNT(value_expression)
value_expression が null ではないグループ。
COUNT (DISTINCT value_expression) value_expression が一意で null ではないグループ。
COUNT(*)
COUNT が動作する行のグループ。
COUNT はすべてのデータ タイプに有効です。
結果のタイプと属性
次の表に、COUNT の結果のデータ タイプと書式をリストしています。
モード
データ タイプと書式
ANSI
MaxDecimal は、DBS 制御ユーティリティの一般フィールド 13 です。
DBSControl 内の MaxDecimal の値
• 0 または 15。結果タイプは DECIMAL(15,0)、書式は-(15)9。
• 18。結果タイプは DECIMAL(18,0)、書式は-(18)9。
• 38。結果タイプは DECIMAL(38,0)、書式は-(38)9。
24
SQL 関数、演算子、式および述部
第 2 章 集約関数
COUNT
モード
データ タイプと書式
TERADA
TA
INTEGER および書式は INTEGER のデフォルト書式です。
COUNT
DBSControl 一般フィールド(80)、COUNT_mode のデフォルト値は 0 です。デ
フォルトは互換性モードで、外部アプリケーションに影響するすべての拡張機能
を無効にします。
BIGINT モードと NUMBER モードは COUNT のパフォーマンスに影響を及ぼします。
• 型の上位変換には、モードが変更された場合、別の型を使用した計算式が必要に
なることがあります。これは、COUNT (*)ベースの式の結果が BIGINT/NUMBER
タイプとして実体化され、後で副式として別の式の計算に使用される場合に発生
します。パフォーマンス オーバーヘッドは、COUNT (*)を BIGINT/NUMBER と
してキャストしたときに発生するものと同じです。
• モードが変更されると COUNT (*)のデータ型が変わるため、書式、タイトル、
データ型を仮定した問合わせではこの変更に注意する必要があります。
COUNT の結果がオーバーフローを起こし、エラーが報告された場合には、次の例
のように結果を別のデータ型にキャストできます。
SELECT CAST(COUNT(*) AS BIGINT)
FROM BIGTABLE;
COUNT 関数と RANK ウィンドウ関数について同様の例を示します。
SELECT CAST(COUNT(*) over([PARTITION/ORDER BY]) AS BIGINT)
FROM BIGTABLE;
SELECT CAST(rank over([PARTITION/ORDER BY]) AS BIGINT)
FROM BIGTABLE;
注: CAST は、デフォルトまたは互換性モードに対してのみ必要です。COUNT 計算
の NUMBER または BIGINT モードに対し値 1 または 2 が指定されている場合、CAST
は不要です。
次の表に、COUNT の結果の初期設定タイトルをリストしています。
演算
タイトル
COUNT(x)
Count(x)
COUNT(*)
Count(*)
集約結合索引内の COUNT 指定
結合索引の COUNT 集約関数に対し、COUNT、FLOAT OR DECIMAL(38,0)への
COUNT キャスト、BIGINT、または NUMBER を指定できます。以下に、BIGINT へ
のデータ型キャストを格納する SHOW JOIN INDEX を示します。
CREATE JOIN INDEX TEST.j1 ,NO FALLBACK ,CHECKSUM = DEFAULT AS
SELECT COUNT (*)(BIGINT, NAMED a ),TEST.t1.a1
FROM TEST.t1
GROUP BY TEST.t1.a1
PRIMARY INDEX ( a1 );
SQL 関数、演算子、式および述部
25
第 2 章 集約関数
COUNT
例: 各部門の従業員数の報告
COUNT (*)は、GROUP BY 句が部門番号ごとに結果をグループ化するため、各部門の
従業員数を報告します。
SELECT DeptNo, COUNT(*) FROM Employee
GROUP BY DeptNo
ORDER BY DeptNo;
GROUP BY 句を指定しなければ、Employee テーブルに入っている従業員の総数だけ
が報告されます。
SELECT COUNT(*) FROM Employee;
GROUP BY 句を指定しなければ選択リストに DeptNo 列を含めることができないこ
とに注意してください。それは、その場合に任意の数の値が戻されるのに対して、
COUNT(*)が 1 つの値しか戻さないためです。
例: Null として返された従業員
挿入されているが、まだ部門が割り当てられていない従業員がいる場合、その従業
員の DeptNo 列に NULL が入ります。
SELECT DeptNo, COUNT(*) FROM Employee
GROUP BY DeptNo
ORDER BY DeptNo;
2 人の新しい従業員に部門が割り当てられていないと想定すると、その結果のテー
ブルは次のようになります。
DeptNo
-----?
100
300
500
600
700
Count(*)
-------2
4
3
7
4
3
例: 部門にまだ割り当てられていない従業員数の計算
例: 各部門の従業員数のレポートの実行において、SELECT... COUNT … を使用し、部
門番号による結果のグループ化を行なわなかったとしたら、結果テーブルには DeptNo
の登録済みの非 NULL のオカレンスだけが含まれることになり、部門に未割り当て
(NULL)の 2 人の従業員は含まれないことになります。カウントが異なります(例: 各
部門の従業員数のレポートでは 23 になり、この例で説明する文を使用すると 21 に
なります)。
Employee テーブルの中で部門に割り当てられている 21 人の従業員のほかに、部門
に割り当てられていない新しい従業員が 2 人いることを思い出してください(それぞ
れの新しい従業員の行には、null の部門番号が入っています)。
SELECT COUNT(deptno) FROM employee ;
この SELECT によって、COUNT は、非 null 部門番号のオカレンスの総数を戻します。
集約関数は null を無視するため、2 人の新しい従業員は数えられません。
26
SQL 関数、演算子、式および述部
第 2 章 集約関数
COUNT
Count(DeptNo)
-------------21
例: 性別による従業員数を出すための COUNT の使用
この例では、COUNT を使用して、データベースの Employee テーブル内の男性従業
員の数を数えます。
SELECT COUNT(sex)
FROM Employee
WHERE sex = 'M' ;
結果は、以下のようになります。
Count(Sex)
---------12
例: 非 Null 部門番号の行の総数の計算
この例では、COUNT が、null でない部門番号の行の総数を部門ごとに数えます。
SELECT deptno, COUNT(deptno)
FROM employee
GROUP BY deptno
ORDER BY deptno ;
ここでも、2 人の新しい従業員が数えられていないことに注意する必要があります。
DeptNo
-----100
300
500
600
700
Count(DeptNo)
------------4
3
7
4
3
例: 部門ごとの従業員数を返す
部門番号ごとの従業員数を入手するには、GROUP BY 句および ORDER BY 句を指定
した COUNT (*)を使用します。
SELECT deptno, COUNT(*)
FROM employee
GROUP BY deptno
ORDER BY deptno ;
この場合には、?で示された null も含まれます。
DeptNo
-----?
100
300
500
SQL 関数、演算子、式および述部
Count(*)
-------2
4
3
7
27
第 2 章 集約関数
COVAR_POP
600
700
4
3
例: Employee テーブルにある部門数の判別
Employee テーブルにある部門の数を調べるには、次の SELECT COUNT に示すよう
に COUNT (DISTINCT)を使用します。
SELECT COUNT (DISTINCT DeptNo)
FROM Employee ;
次のレポートが生成されます。
Count(Distinct(DeptNo))
----------------------5
関連トピック
詳細は、以下を参照してください。
• グループ、累計、および移動カウントを戻す COUNT 関数については、ウィンド
ウ集約関数を参照してください。
• COUNT(*)を例外として、計算には NULL は組み込まれません。詳細については、
<SQL 基礎、B035-1141>および集約と NULL を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• COUNT_mode フィールドについては、<ユーティリティ 、B035-1102>を参照し
てください。
COVAR_POP
目的
すべての非 NULL のデータ点の対に対して、引数の母集団共分散を戻します。
構文
COVAR_POP
( value_expression_1, value_expression_2 )
構文要素
value_expression_1/value_expression_2
第 2 の数値式と対になって共分散を判別する数値式。
この式に順序付き分析関数や集約関数を含めることはできません。
28
SQL 関数、演算子、式および述部
第 2 章 集約関数
COVAR_POP
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
共分散は、2 つのランダム変数が同じように分散しているかどうかを示す尺度です。
これは、各々の非 null データ点の対についての偏差積の平均です。
共分散が高いからといって、変数間に因果関係があることを暗示してはいないこと
に注意する必要があります。
他の関数との組み合わせ
COVAR_POP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序
付き分析関数と組み合わせることができます。
COVAR_POP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集
約関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータにない場合は、COVAR_POP は
NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
COVAR_POP のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
データ タイプのデフォルトの書式、および書式における書式設定文字についての説
明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
SQL 関数、演算子、式および述部
29
第 2 章 集約関数
COVAR_SAMP
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
COVAR_POP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、概要を参照してください。
COVAR_POP ウィンドウ関数
グループ、累計、または移動を計算する COVAR_POP ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
COVAR_SAMP
目的
すべての非 NULL のデータ点の対に対して、引数の標本共分散を戻します。
構文
COVAR_SAMP
( value_expression_1, value_expression_2 )
構文要素
value_expression_2/value_expression_1
第 2 の数値式と対になって共分散を判別する数値式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
共分散は、2 つのランダム変数が同じように分散しているかどうかを示す尺度です。
これは、各々の非 null データ点の対についての偏差積の合計です。
共分散が高いからといって、変数間に因果関係があることを暗示してはいないこと
に注意する必要があります。
30
SQL 関数、演算子、式および述部
第 2 章 集約関数
COVAR_SAMP
他の関数との組み合わせ
COVAR_SAMP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順
序付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィ
ンドウ集約関数を参照してください。
COVAR_SAMP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の
集約関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータにない場合は、COVAR_SAMP
は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
COVAR_SAMP(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
データ タイプのデフォルトの書式、および書式における書式設定文字についての説
明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
COVAR_SAMP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、データ型の変換を参照してください。
SQL 関数、演算子、式および述部
31
第 2 章 集約関数
GROUPING
COVAR_SAMP ウィンドウ関数
グループ、累計、または移動を計算する COVAR_SAMP ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: SELECT 文を使用して、weight と height の標本共分散を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
height
weight
1
60
84
2
62
95
3
64
140
4
66
155
5
68
119
6
70
175
7
72
145
8
74
197
9
76
150
10
76
?
11
?
150
12
?
?
次の SELECT 文は、weight と height がどちらも null でない部分における、weight
と height の標本共分散を戻します。
SELECT COVAR_SAMP(weight,height)
FROM regrtbl;
Covar_Samp(weight,height)
------------------------150
GROUPING
目的
結果行の指定された列が GROUP BY 句のグループ化セットから除外されたかどうか
を示す値を戻します。
32
SQL 関数、演算子、式および述部
第 2 章 集約関数
GROUPING
構文
GROUPING
( expression (
構文要素
expression
CUBE、ROLLUP、または GROUPING SET が含まれている、グループ化された問合
わせから除外された可能性のある、結果行内の列。
引数は GROUP BY 句の項目でなければなりません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
CUBE、ROLLUP、または GROUPING SET が含まれている、グループ化された問合
わせの結果行に NULL があるということは、次のいずれかを意味する場合がありま
す。
• 列の実際のデータが NULL である。
• 拡張されたグループ化指定がその列で集約を実行し、特定のグループ化からその
列を除外した。この場合の null は、この列のすべての値を表わします。
実データが NULL の行と、グループ化セットで NULL が生成された行を区別するに
は、GROUPING を使用します。
結果のタイプと属性
GROUPING(x)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER データ タイプのデフォルト書式
Grouping(x)
結果値
結果行の指定された列の値
GROUPING から戻される
もの
拡張されたグループ化指定がその列で集約を実行し、特定のグ 1
ループ化からその列を除外した場合に生成される NULL
その他
SQL 関数、演算子、式および述部
0
33
第 2 章 集約関数
GROUPING
例: 国と市ごとの売上げの要約の表示
次のような sales_view テーブルのデータがあるとします。
PID
コスト
Sale
Margin
状態
County
City
1
38350
50150
11800
CA
Los Angeles
Long Beach
1
63375
82875
19500
CA
San Diego
San Diego
1
46800
61200
14400
CA
Los Angeles
Avalon
2
40625
53125
12500
CA
Los Angeles
Long Beach
County ごと、および City ごとの売上げの要約を調べるには、次の SELECT 文を使用
します。
SELECT county, city, sum(margin)
FROM sale_view
GROUP BY GROUPING SETS ((county),(city));
問合わせにより、次のデータがレポートされます。
County
----------Los Angeles
San Diego
?
?
?
City
---------?
?
Long Beach
San Diego
Avalon
Sum(margin)
----------38700
19500
24300
19500
14400
この例の場合、null は列のすべての値を表わしていることに注意してください。そ
れは、示されているグループ化セットからこの列が除外されているためです。
実データが null の行と、グループ化セットで null が生成された行を区別するには、
GROUPING 関数を使用します。
SELECT county, city, sum(margin),
GROUPING(county) AS County_Grouping,
GROUPING(city) AS City_Grouping
FROM sale_view
GROUP BY GROUPING SETS ((county),(city));
結果は次のようになります。
County
----------Los Angeles
San Diego
?
?
?
City
Sum(margin) County_Grouping City_Grouping
---------- ----------- --------------- ------------?
38700
0
1
?
19500
0
1
Long Beach
24300
1
0
San Diego
19500
1
0
Avalon
14400
1
0
拡張グループ化指定が列に対して集約を実行し、その列を特定のグループ化から除
外したために結果行に現われた null を置換するために、GROUPING を使用すること
もできます。たとえば、
34
SQL 関数、演算子、式および述部
第 2 章 集約関数
KURTOSIS
SELECT CASE
WHEN GROUPING(county) = 1
THEN '-All Counties-'
ELSE county
END AS County,
CASE
WHEN GROUPING(city) = 1
THEN '-All Cities-'
ELSE city
END AS City,
SUM(margin)
FROM sale_view
GROUP BY GROUPING SETS (county,city);
問合わせにより、次のデータがレポートされます。
County
-------------Los Angeles
San Diego
-All Counties-All Counties-All Counties-
City
------------All Cities-All CitiesLong Beach
San Diego
Avalon
Sum(margin)
----------38700
19500
24300
19500
14400
関連トピック
GROUP BY、GROUPING SETS、ROLLUP、および CUBE の詳細は、< SQL データ操
作言語、B035-1146>を参照してください。
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
KURTOSIS
目的
value_expression の分布のとがり(kurtosis)を戻します。
構文
KURTOSIS
value_expression )
(
DISTINCT
ALL
SQL 関数、演算子、式および述部
35
第 2 章 集約関数
KURTOSIS
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれます。
DISTINCT
value_expression によって指定された重複を計算から除外します。
value_expression
値の分布のとがりを計算するリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
定義
とがり(kurtosis)は分布の第 4 モーメントです。これは、正規(ガウス)分布と比較し
た場合の、相対的なピークの大きさ、あるいは平坦さの尺度です。
正規分布のとがりはゼロです。
とがりが正の値であれば分布のピークが高く、とがりが負の値であれば相対的に平
坦であることを示します。
結果のタイプと属性
KURTOSIS(x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
REAL
REAL データ タイプのデフォルト書式
Kurtosis(x)
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• DATE
• 間隔
36
SQL 関数、演算子、式および述部
第 2 章 集約関数
MAX
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
KURTOSIS を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコー
ドの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
計算
KURTOSIS の計算の公式は次のように定義されます。
説明:
変数
内容
x
value_expression
NULL 戻り値になる条件
次の条件は、NULL 戻り値になります。
• 計算に使用されるデータに、非 NULL のデータ点が 4 個未満しかない。
• STDDEV_SAMP(x) = 0
• 0 による除算
MAX
目的
value_expression の最大値である列の値を返します。
構文
MAXIMUM
MAX
(
value_expression )
DISTINCT
ALL
構文要素
ALL
value_expression によって指定された null でないすべての値が、重複も含めて、グ
ループの最大値計算に含まれます。これは、デフォルトです。
SQL 関数、演算子、式および述部
37
第 2 章 集約関数
MAX
DISTINCT
value_expression によって指定された重複を計算から除外します。
value_expression によって指定された重複値と null でない値がグループの最大値計
算から除外されます。
value_expression
最大値が計算されるリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
MAXIMUM は、ANSI SQL:2011 規格の Teradata 拡張機能です。
結果のタイプと属性
次の表に、MAX(x)の結果のデフォルト属性をリストしています。
属性
値
データ タ
イプ
オペランド x が UDT でない場合、結果のデータ タイプはオペランド x のデー
タ タイプです。
オペランド x が UDT である場合、結果のデータ タイプは UDT の暗黙キャス
ト先のデータ タイプです。
書式
オペランド x が UDT でない場合、結果のデータ タイプはオペランド x のデー
タ タイプです。
オペランド x が UDT である場合、結果のデータ タイプは UDT の暗黙キャス
ト先のデータ タイプです。
タイトル
Maximum(x)
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• バイト
• DATE
• TIME または TIMESTAMP
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
38
SQL 関数、演算子、式および述部
第 2 章 集約関数
MAX
MAX を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、<
ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
使用上の注意
MAX は、数値型データと文字型データに対して有効です。文字式に使用された場
合、MAX は最高位の整列順を戻します。
結果の計算には NULL は含められません。詳細は、<SQL 基礎、B035-1141>ど集約
と NULL を参照してください。
value_expression が列式の場合、この列はデータが選択されるテーブル内の列を少
なくとも 1 つ参照する必要があります。
value_expression は、関数によって得られたビュー列に対する列参照を指定しては
なりません。
MAX ウィンドウ関数
グループ、累計、および移動最大値を計算する MAX ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: CHARACTER データ
次の SELECT は、直ちに次の結果を戻します。
SELECT MAX(Name)
FROM Employee;
Maximum(Name)
------------Zorn J
例: 列の式
倉庫の在庫のうち、売上げ原価が最大の商品はどれかを知りたいとします。
SELECT MAX(CostOfSales) AS m, ProdID
FROM Inventory
GROUP BY ProdID
ORDER BY m DESC;
Maximum(CostOfSales)
-------------------1295
975
950
SQL 関数、演算子、式および述部
ProdID
-----3815
4400
4120
39
第 2 章 集約関数
MIN
MIN
目的
value_expression の最小値である列の値を返します。
構文
MINIMUM
(
MIN
value_expression )
DISTINCT
ALL
構文要素
ALL
value_expression によって指定された null でないすべての値が、重複も含めて、グ
ループの最小値計算に含まれます。これは、デフォルトです。
DISTINCT
value_expression によって指定された重複を計算から除外します。
value_expression によって指定された重複値と null でない値がグループの最小値計
算から除外されます。
value_expression
最小値が計算されるリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
MINIMUM は、ANSI SQL:2011 規格の Teradata 拡張機能です。
結果のタイプと属性
次の表に、MIN(x)の結果のデフォルト属性をリストしています。
属性
値
データ タ
イプ
オペランド x が UDT でない場合、結果のデータ タイプはオペランド x のデー
タ タイプです。
オペランド x が UDT である場合、結果のデータ タイプは UDT の暗黙キャス
ト先のデータ タイプです。
40
タイトル
Minimum(x)
書式
オペランド x が UDT でない場合、結果の書式はオペランド x の書式です。
SQL 関数、演算子、式および述部
第 2 章 集約関数
MIN
属性
値
オペランド x が UDT である場合、結果の書式は UDT の暗黙キャスト先のデー
タ タイプの書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• バイト
• DATE
• TIME または TIMESTAMP
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
MIN を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、<
ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
使用上の注意
MINIMUM は、数値データだけでなく文字データにも有効です。MINIMUM は、文
字式の最下位の整列順を戻します。
計算には NULL を組み込むことはできません。詳細については、<SQL 基礎、
B035-1141>の「Null の操作」、および「集約と Null」を参照してください。
value_expression が列式を指定する場合、この式はデータが選択されるテーブル内
の列を少なくとも 1 つ参照する必要があります。
value_expression が列参照を指定する場合、その列は関数によって得られたビュー
列であってはなりません。
MIN ウィンドウ関数
グループ、累計、および移動最大値を計算する MIN ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: CHARACTER データで使用される MINIMUM
次の SELECT は、直ちに次の結果を戻します。
SQL 関数、演算子、式および述部
41
第 2 章 集約関数
REGR_AVGX
SELECT MINIMUM(Name)
FROM Employee;
Minimum(Name)
------------Aarons A
例: JIT インベントリ
ユーザーの製造販売店が最近ベンダーを変更し、そのベンダーからの部品で ProdID
当たり 20 個を超えるものが少ないことがわかっています。他の在庫商品で、新しい
出荷をスケジュールする必要があるほど量が少ないものがいくつあるかを知る必要
があります。ここで、「量が少ない」とは、その部品の QUANTITY 列が 30 未満の
ものと定義されます。
SELECT ProdID, MINIMUM(QUANTITY)
FROM Inventory
WHERE QUANTITY BETWEEN 20 AND 30
GROUP BY ProdID
ORDER BY ProdID;
レポートは次のようになります。
ProdID
----------1124
1355
3215
4391
Minimum(Quantity)
----------------24
21
25
22
REGR_AVGX
目的
従属および独立変数引数のすべての非 NULL データ ペアの
independent_variable_expression の平均を戻します。
構文
REGR_AVGX
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
42
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_AVGX
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立
変数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_AVGX は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序
付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィン
ドウ集約関数を参照してください。
REGR_AVGX は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集
約関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_AVGX は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_AVGX(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
データ タイプのデフォルトの書式、および書式における書式設定文字についての説
明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
SQL 関数、演算子、式および述部
43
第 2 章 集約関数
REGR_AVGX
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_AVGX を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
REGR_AVGX ウィンドウ関数
グループ、累計、または移動を計算する REGR_AVGX ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: regrtbl の height の平均を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
-1
2
3
4
5
6
7
8
9
10
11
12
height
-----60
62
64
66
68
70
72
74
76
76
?
?
weight
-----84
95
140
155
119
175
145
197
150
?
150
?
次の SELECT 文は、weight と height がどちらも null でない部分における、regrtbl
の height の平均を戻します。
SELECT REGR_AVGX(weight,height)
FROM regrtbl;
Regr_Avgx(weight,height)
44
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_AVGY
-----------------------68
REGR_AVGY
目的
従属および独立変数引数のすべての非 NULL データ ペアの
dependent_variable_expression の平均を戻します。
構文
REGR_AVGY
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立
変数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_AVGY は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序
付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィン
ドウ集約関数を参照してください。
REGR_AVGY は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集
約関数と組み合わせることはできません。
SQL 関数、演算子、式および述部
45
第 2 章 集約関数
REGR_AVGY
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_AVGY は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_AVGY(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_AVGY を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
REGR_AVGY ウィンドウ関数
グループ、累計、または移動を計算する REGR_AVGY ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: regrtbl から weight の平均を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
-1
2
3
4
46
height
-----60
62
64
66
weight
-----84
95
140
155
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_COUNT
5
6
7
8
9
10
11
12
68
70
72
74
76
76
?
?
119
175
145
197
150
?
150
?
次の SELECT 文は、height と weight がどちらも null でない部分における、regrtbl
の weight の平均を戻します。
SELECT REGR_AVGY(weight,height)
FROM regrtbl;
Regr_Avgy(weight,height)
-----------------------140
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式、および書式における書式設定文字について
の説明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式お
よび書式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
REGR_COUNT
目的
従属および独立変数引数のすべての非 NULL データ ペアの数を戻します。
構文
REGR_COUNT
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
SQL 関数、演算子、式および述部
47
第 2 章 集約関数
REGR_COUNT
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立変
数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_COUNT は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順
序付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィ
ンドウ集約関数を参照してください。
REGR_COUNT は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の
集約関数と組み合わせることはできません。
結果のタイプと属性
次の表に、REGR_COUNT(y,x)の結果のデータ タイプをリストしています。
モード
データ タイプ
ANSI
DBSControl 内の MaxDecimal の値
• 0 または 15。結果のタイプは DECIMAL(15,0)。
• 18。結果のタイプは DECIMAL(15,0)。
• 38。結果のタイプは DECIMAL(38,0)。
TERADATA
INTEGER
REGR_COUNT の結果のタイプは、ANSI トランザクション モードおよび Teradata ト
ランザクション モードの COUNT の結果のタイプと一致します。
Teradata モードのときに、 REGR_COUNT の結果がオーバーフローを起こし、エラー
が報告された場合には、次の例のように結果を別のデータ タイプにキャストできます。
SELECT CAST(REGR_COUNT(weight,height) AS BIGINT)
FROM regrtbl;
次に、REGR_COUNT の結果のデフォルトの書式とタイトルを示します。
• オペランド y が数値または文字である場合、書式は次のようになります。
• ANSI モードの場合の、DBSControl 内の MaxDecimal の値
0 または 15。書式は-(15)9。
48
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_COUNT
18。書式は-(18)9。
38。書式は-(38)9。
• Teradata モードの場合、書式は INTEGER のデフォルトの書式。
• オペランド y が UDT である場合、書式は UDT の暗黙キャスト先のデータ タイ
プの書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_COUNT を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
REGR_COUNT ウィンドウ関数
グループ、累計、または移動を計算する REGR_COUNT ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: regrtbl の行数を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
height
weight
1
60
84
2
62
95
3
64
140
4
66
155
5
68
119
6
70
175
7
72
145
8
74
197
9
76
150
10
76
?
SQL 関数、演算子、式および述部
49
第 2 章 集約関数
REGR_INTERCEPT
c1
height
weight
11
?
150
12
?
?
次の SELECT 文は、regrtbl における、height と weight がどちらも null でない部分
の行数を戻します。
SELECT REG_COUNT(weight,height)
FROM regrtbl;
結果は以下のようになります。
Regr_Count(weight,height)
------------------------9
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• グループ、累計、または移動を計算する REGR_COUNT ウィンドウ関数について
は、ウィンドウ集約関数を参照してください。
REGR_INTERCEPT
目的
従属および独立変数引数のすべての非 NULL データ ペアを通して、一変量の線形回
帰直線の傾きを戻します。
構文
REGR_INTERCEPT
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
50
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_INTERCEPT
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
切片とは、サンプルの非 NULL データ対を通して得られる回帰直線が、グラフの y
軸と交差する点のことです。
変数上の線形回帰のプロットは、独立変数の変更時の従属変数の動作を予測するた
めに使用されます。
この計算は、変数間の線形的な関連を前提とすることに注意する必要があります。
独立変数と従属変数の間に、強い非線形の関連がある場合は、そのような変数の対
の間で単純な線形回帰を計算すると、その関連は反映されません。
独立変数と従属変数
独立変数とは、他の変数の動作をテストするためにユーザー制御により変化する、
何らかの処理です。
従属変数は、処理に対する応答として測定されるものです。
たとえば、ある品目の販売を拡大するために、さまざまなプロモーションの効果を
テストしたい場合があります。
この場合、プロモーションが独立変数で、品目の販売数が個別のプロモーションの
結果として従属変数になります。
線形回帰の切片の値は、分析用に選択された品目のプロモーションを何も行なわな
い場合の販売数の予想値になります。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立
変数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_INTERCEPT は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、
順序付けられた任意の分析関数と組み合わせることができます。順序付き分析関数
の詳細は、ウィンドウ集約関数を参照してください。
SQL 関数、演算子、式および述部
51
第 2 章 集約関数
REGR_INTERCEPT
REGR_INTERCEPT は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の
中の集約関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_INTERCEPT は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_INTERCEPT(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
REAL
REAL データ タイプのデフォルト書式
REGR_INTERCEPT(y,x)
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_INTERCEPT を含め、システム演算子および関数用の UDT の暗黙タイプ変換
は、ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制
御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
詳細は、<ユーティリティ 、B035-1102>を参照してください。
REGR_INTERCEPT ウィンドウ関数
グループ、累計、または移動を計算する REGR_INTERCEPT ウィンドウ関数について
は、ウィンドウ集約関数を参照してください。
例: NbrSold および SalesPrice の回帰直線の切片を返す
この例では、次の HomeSales テーブルのデータを使用します。
52
SalesPrice
NbrSold
Area
160000
126
358711030
180000
103
358711030
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_R2
SalesPrice
NbrSold
Area
200000
82
358711030
220000
75
358711030
240000
82
358711030
260000
40
358711030
280000
20
358711030
次の問合わせは、358711030 の Area で SalesPrice が 160000~280000 の部分に
おける、NbrSold と SalesPrice の回帰直線の切片を戻します。
SELECT CAST (REGR_INTERCEPT(NbrSold,SalesPrice) AS DECIMAL (5,1))
FROM HomeSales
WHERE area = 358711030
AND SalesPrice BETWEEN 160000 AND 280000;
結果は以下のようになります。
REGR_INTERCEPT(NbrSold,SalesPrice)
---------------------------------249.9
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式、および書式における書式設定文字について
の説明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式お
よび書式句」を参照してください。
• UDT の暗黙型変換の詳細は、概要を参照してください。
• グループ、累計、または移動を計算する REGR_INTERCEPT ウィンドウ関数につ
いては、ウィンドウ集約関数を参照してください。
REGR_R2
目的
従属および独立変数引数のすべての非 NULL データ ペアの決定係数を戻します。
構文
REGR_R2
SQL 関数、演算子、式および述部
( dependent_variable_expression, independent_variable_expression )
53
第 2 章 集約関数
REGR_R2
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立変
数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_R2 は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付け
られた任意の分析関数と組み合わせることができます。順序付き分析関数の詳細は、
ウィンドウ集約関数を参照してください。
REGR_R2 は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約
関数と組み合わせることはできません。
計算
計算に使用される非 NULL データ点の対がデータに 2 つ未満しかない場合は、
REGR_SXY は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_R2(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
54
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_R2
データ タイプのデフォルトの書式、および書式における書式設定文字についての説
明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_R2 を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコー
ドの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<ユーティリティ 、B035-1102>を参照してください。
REGR_R2 ウィンドウ関数
グループ、累計、または移動を計算する REGR_R2 ウィンドウ関数については、ウィ
ンドウ集約関数を参照してください。
例: height と weight の決定係数を返す
この例は、次の regrtbl データに基づいています。NULL は QUESTION MARK によっ
て示されています。
c1
-1
2
3
4
5
6
7
8
9
10
11
12
height
-----60
62
64
66
68
70
72
74
76
76
?
?
weight
-----84
95
140
155
119
175
145
197
150
?
150
?
次の SELECT 文は、weight と height がどちらも null でない部分における、weight
と height の決定係数を戻します。
SELECT CAST(REGR_R2(weight,height) AS DECIMAL(4,2))
FROM regrtbl;
SQL 関数、演算子、式および述部
55
第 2 章 集約関数
REGR_SLOPE
REGR_R2(weight,height)
---------------------.58
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式、および書式における書式設定文字についての
説明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式およ
び書式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• グループ、累計、または移動を計算する REGR_R2 ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
REGR_SLOPE
目的
すべての非 NULL データ対を通して、従属および独立変数引数の一変量の線形回帰
直線の傾きを戻します。
構文
REGR_SLOPE
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
56
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_SLOPE
定義
最適線形回帰の傾きは、1 つの独立変数対従属変数の回帰の変化率の尺度です。
変数上の線形回帰のプロットは、独立変数の変更時の従属変数の動作を予測するた
めに使用されます。
この計算は、変数間の線形的な関連を前提とすることに注意する必要があります。
独立変数と従属変数の間に、強い非線形の関連がある場合は、そのような変数の対
の間で単純な線形回帰を計算すると、その関連は反映されません。
独立変数と従属変数
独立変数とは、他の変数の動作をテストするためにユーザー制御により変化する、
何らかの処理です。
従属変数は、処理に対する応答として測定されるものです。
たとえば、ある品目の販売を拡大するために、さまざまなプロモーションの効果を
テストしたい場合があります。
この場合、プロモーションが独立変数で、品目の販売数が個別のプロモーションの
結果として従属変数になります。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立
変数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_SLOPE は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序
付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィン
ドウ集約関数を参照してください。
REGR_SLOPE は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の
集約関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_SLOPE は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_SLOPE(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
SQL 関数、演算子、式および述部
57
第 2 章 集約関数
REGR_SLOPE
データ タイプ
書式
タイトル
REAL
REAL データ タイプのデフォルト書式
REGR_SLOPE(y,x)
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_SLOPE を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
REGR_SLOPE ウィンドウ関数
グループ、累計、または移動を計算する REGR_SLOPE ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: NbrSold および SalesPrice の回帰直線の傾きを返す
この例では、次の HomeSales テーブルのデータを使用します。
SalesPrice
NbrSold
Area
160000
126
358711030
180000
103
358711030
200000
82
358711030
220000
75
358711030
240000
82
358711030
260000
40
358711030
280000
20
358711030
次の問合わせは、358711030 の Area で SalesPrice が 160000~280000 の部分に
おける、NbrSold と SalesPrice の回帰直線の傾きを戻します。
SELECT CAST (REGR_SLOPE(NbrSold,SalesPrice) AS FLOAT)
FROM HomeSales
WHERE area = 358711030
AND SalesPrice BETWEEN 160000 AND 280000;
58
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_SXX
結果は以下のようになります。
REGR_SLOPE(NbrSold,SalesPrice)
------------------------------7.92857142857143E-004
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式、および書式における書式設定文字について
は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• グループ、累計、または移動を計算する REGR_SLOPE ウィンドウ関数について
は、ウィンドウ集約関数を参照してください。
REGR_SXX
目的
従属および独立変数引数のすべての非 null データ ペアの
independent_variable_expression の 2 乗の合計を戻します。
構文
REGR_SXX
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
SQL 関数、演算子、式および述部
59
第 2 章 集約関数
REGR_SXX
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立変
数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_SXX は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付
けられた任意の分析関数と組み合わせることができます。順序付き分析関数の詳細
は、ウィンドウ集約関数を参照してください。
REGR_SXX は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約
関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_SXX は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_SXX(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_SXX を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、
<ユーティリティ 、B035-1102>を参照してください。
60
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_SXX
REGR_SXX ウィンドウ関数
グループ、累計、または移動を計算する REGR_SXX ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: height の 2 乗の合計を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
-1
2
3
4
5
6
7
8
9
10
11
12
height
-----60
62
64
66
68
70
72
74
76
76
?
?
weight
-----84
95
140
155
119
175
145
197
150
?
150
?
次の SELECT 文は、weight と height がどちらも null でない部分における、height
の 2 乗の合計を戻します。
SELECT REGR_SXX(weight,height)
FROM regrtbl;
Regr_Sxx(weight,height)
----------------------240
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
• グループ、累計、または移動を計算する REGR_SXX ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
SQL 関数、演算子、式および述部
61
第 2 章 集約関数
REGR_SXY
REGR_SXY
目的
従属および独立変数引数のすべての非 null データ ペアの
independent_variable_expression と dependent_variable_expression の積の合計を
戻します。
構文
REGR_SXY
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立変
数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_SXY は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付
けられた任意の分析関数と組み合わせることができます。順序付き分析関数の詳細
は、ウィンドウ集約関数を参照してください。
REGR_SXY は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約
関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_SXY は NULL を戻します。
62
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_SXY
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_SXY(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_SXY を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコー
ドの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
REGR_SXY ウィンドウ関数
グループ、累計、または移動を計算する REGR_SXY ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
例: height と weight の積の合計を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
-1
2
3
4
5
6
7
8
height
-----60
62
64
66
68
70
72
74
SQL 関数、演算子、式および述部
weight
-----84
95
140
155
119
175
145
197
63
第 2 章 集約関数
REGR_SYY
9
10
11
12
76
76
?
?
150
?
150
?
次の SELECT 文は、weight と height がどちらも null でない部分における、weight
と height の積の合計を戻します。
SELECT REGR_SXY(weight,height)
FROM regrtbl;
Regr_Sxy(weight,height)
----------------------1200
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• UDT の暗黙タイプ変換の詳細は、概要を参照してください。
REGR_SYY
目的
従属および独立変数引数のすべての非 null データ ペアの
dependent_variable_expression の 2 乗の合計を戻します。
構文
REGR_SYY
( dependent_variable_expression, independent_variable_expression )
構文要素
dependent_variable_expression
回帰に対する従属変数。従属変数は、処理に対する応答として測定されるものです。
この式に順序付き分析関数や集約関数を含めることはできません。
independent_variable_expression
回帰に対する独立変数。独立変数とは、他の変数の動作をテストするためにユーザー
制御により変化する、何らかの処理です。
この式に順序付き分析関数や集約関数を含めることはできません。
64
SQL 関数、演算子、式および述部
第 2 章 集約関数
REGR_SYY
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
プロット用の軸の設定
プロット用にデータをエクスポートする場合、従属変数として y 軸(縦座標)、独立
変数として x 軸(横座標)を定義します。
他の関数との組み合わせ
REGR_SYY は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付
けられた任意の分析関数と組み合わせることができます。順序付き分析関数の詳細
は、ウィンドウ集約関数を参照してください。
REGR_SYY は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約
関数と組み合わせることはできません。
計算
計算に使用される非 NULL のデータ点の対がデータに 2 つ未満しかない場合は、
REGR_INTERCEPT は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
REGR_SYY(y, x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は y と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
SQL 関数、演算子、式および述部
65
第 2 章 集約関数
SKEW
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
REGR_SYY を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、
<ユーティリティ 、B035-1102>を参照してください。
REGR_SYY ウィンドウ関数
グループ、累計、または移動を計算する REGR_SYY ウィンドウ関数については、ウィ
ンドウ集約関数を参照してください。
例: weight の 2 乗の合計を返す
この例は、次の regrtbl データに基づいています。Null は?によって示されています。
c1
-1
2
3
4
5
6
7
8
9
10
11
12
height
-----60
62
64
66
68
70
72
74
76
76
?
?
weight
-----84
95
140
155
119
175
145
197
150
?
150
?
次の SELECT 文は、height と weight がどちらも null でない部分における、weight
の 2 乗の合計を戻します。
SELECT REGR_SYY(weight,height)
FROM regrtbl;
Regr_Syy(weight,height)
----------------------10426
SKEW
目的
value_expression の分布のひずみ(skewness)を戻します。
66
SQL 関数、演算子、式および述部
第 2 章 集約関数
SKEW
構文
SKEW
value_expression )
(
DISTINCT
ALL
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれま
す。
DISTINCT
value_expression によって指定された null と重複値がグループの計算から除外され
ます。
value_expression
値の分布のひずみを計算するリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
定義
ひずみ(skewness)は分布の第 3 モーメントです。これは、正規(ガウス)分布と比較
した場合の、平均に関する分布の非対称性の尺度です。
正規分布のひずみはゼロです。
ひずみの値が正の数の場合は、分布が正方向に非対称に伸びており、負の数の場合
は分布が負方向に非対称に伸びていることを示します。
結果のタイプと属性
SKEW(x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
REAL
REAL データ タイプのデフォルト書式
SKEW(x)
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
SQL 関数、演算子、式および述部
67
第 2 章 集約関数
STDDEV_POP
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
SKEW を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、<
ユーティリティ 、B035-1102>を参照してください。
計算
SKEW の計算の公式は次のように定義されます。
説明:
変数
内容
x
value_expression
Null 結果になる条件
次の条件の結果は、null になります。
• 計算に使用されるデータに、非 NULL のデータ点が 3 個未満しかない。
• STDDEV_SAMP(x) = 0
• 0 による除算
関連トピック
詳細は、以下を参照してください。
• SQL データ型とリテラル、B035-1143
• 概要
STDDEV_POP
目的
value_expression の中の非 null のデータ点に対して、母集団の標準偏差を戻します。
構文
STDDEV_POP
value_expression )
(
DISTINCT
ALL
68
SQL 関数、演算子、式および述部
第 2 章 集約関数
STDDEV_POP
構文要素
ALL
value_expression によって指定された null でないすべての値が、重複も含めて、計
算に含まれます。これは、デフォルトです。
DISTINCT
value_expression の重複を計算から除外します。
value_expression
母集団の標準偏差を計算する数値リテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
標準偏差は分布の第 2 のモーメントです。母集団について、その母集団の平均から
のばらつきの尺度となります。
処理中のデータ点が完全な母集団でない場合は、STDDEV_POP を使用しないでくだ
さい。
他の関数との組み合わせ
STDDEV_POP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順
序付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィ
ンドウ集約関数を参照してください。
STDDEV_POP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の
集約関数と組み合わせることはできません。
GROUP BY がレポートの区切りに与える影響
STDDEV_POP は、SELECT 文に GROUP BY 句があるかどうかによって、動作が異な
ります。
問合わせ
STDDEV_POP の報告対象
GROUP BY 句を指定する場合
個々のグループ
GROUP BY 句を指定しない場合
サンプル内のすべての行
SQL 関数、演算子、式および述部
69
第 2 章 集約関数
STDDEV_POP
母集団の標準偏差の測定
データが、変数の母集団全体の標本を表わすにすぎない場合は、STDDEV_SAMP 関
数を使用してください。詳細については、「STDDEV_SAMP」を参照してください。
標本サイズが大きくなると、STDDEV_SAMP の値と STDDEV_POP は同じ数値に近づ
いていきます。しかし、変数に関してデータが母集団全体を成しているという絶対
的な確信がない限り、より控えめな STDDEV_SAMP 計算を常に使用するようにして
ください。
計算
母集団に非 NULL のデータ点がない場合は、STDDEV_POP は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
STDDEV_POP(x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
STDDEV_POP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
STDDEV_POP ウィンドウ関数
グループ、累計、または移動を計算する STDDEV_POP ウィンドウ関数については、
ウィンドウ集約関数を参照してください。
70
SQL 関数、演算子、式および述部
第 2 章 集約関数
STDDEV_SAMP
関連トピック
詳細は、以下を参照してください。
• SQL データ型とリテラル、B035-1143
• 概要
• ウィンドウ集約関数
STDDEV_SAMP
目的
value_expression の中の非 null のデータ点に対して、標本の標準偏差を戻します。
構文
STDDEV_SAMP
value_expression )
(
DISTINCT
ALL
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれま
す。
DISTINCT
value_expression の重複を計算から除外します。
value_expression
母集団の標本の標準偏差を計算する数値リテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
標準偏差は分布の第 2 のモーメントです。標本について、その標本の平均からのば
らつきの尺度となります。この計算は、算出値に与える他者の影響を最小限にする
ため、母集団の分散に対して控えめなものとなります。
SQL 関数、演算子、式および述部
71
第 2 章 集約関数
STDDEV_SAMP
計算
ゼロで割ると、エラーではなく NULL になります。
計算に使用される非 NULL のデータ点の対が標本に 2 つ未満しかない場合は、
STDDEV_SAMP は NULL を戻します。
結果のタイプと属性
STDDEV_SAMP(x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ:REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
STDDEV_SAMP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳
細は、<ユーティリティ 、B035-1102>を参照してください。
他の関数との組み合わせ
STDDEV_SAMP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順
序付き分析関数と組み合わせることができます。 順序付き分析関数の詳細は、ウィ
ンドウ集約関数を参照してください。
STDDEV_SAMP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の
集約関数と組み合わせることはできません。
GROUP BY がレポートの区切りに与える影響
GROUP BY 句は STDDEV_SAMP 操作に影響を与えます。
72
SQL 関数、演算子、式および述部
第 2 章 集約関数
SUM
問合わせ
STDDEV_SAMP の報告対象
GROUP BY 句を指定する場合
個々のグループ
GROUP BY 句を指定しない場合
サンプル内のすべての行
母集団の標準偏差の測定
データが、変数の母集団全体を表わしている場合は、STDDEV_POP 関数を使用して
ください。詳細は、「STDDEV_POP」を参照してください。
標本サイズが大きくなると、STDDEV_SAMP の値と STDDEV_POP は同じ数値に近
づいていきます。しかし、変数に関してデータが母集団全体を成しているという絶
対的な確信がない限り、より控えめな STDDEV_SAMP 計算を使用するようにしてく
ださい。
STDDEV_SAMP ウィンドウ関数
グループ、累計、または移動を計算する STDDEV_SAMP ウィンドウ関数について
は、ウィンドウ集約関数を参照してください。
関連トピック
詳細は、以下を参照してください。
• SQL データ型とリテラル、B035-1143
• 概要
• ウィンドウ集約関数
SUM
目的
value_expression の算術合計である列の値を返します。
構文
SUM
(
value_expression )
DISTINCT
ALL
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれま
す。
SQL 関数、演算子、式および述部
73
第 2 章 集約関数
SUM
DISTINCT
value_expression によって指定された null でない値および重複を計算から除外します。
value_expression
合計が計算されるリテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
結果のタイプと属性
次の表に、SUM(x)の結果のデフォルト属性をリストします。
データ タイプとオ 結果のデータ タイプ
ペランド
書式
BYTEINT または
SMALLINT
オペランドと同じ
INTEGER データ Sum(x)
タイプのデフォル
ト書式
文字
オペランドと同じ
FLOAT のデフォ
ルト書式
UDT
オペランドと同じ
UDT の暗黙キャ
スト先のデータ タ
イプの書式
DECIMAL(n,m)
DECIMAL(p,m)。このとき、p は次の規則
によって決定されます:
オペランドのデー Sum(x)
タ タイプのデフォ
ルトの書式
DBSControl 内の MaxDecimal が 0 または
15 である場合
• n ≤ 15 の場合、p = 15。
• 15 < n ≤ 18 の場合、 p = 18。
• n > 18 の場合、p = 38。
タイ
トル
DBSCControl 内の MaxDecimal が 18 であ
る場合
• n ≤ 18 の場合、p = 18。
• n > 18 の場合、p = 38。
DBSControl の MaxDecimal が 38 で n が
任意の値である場合、p = 38。
UDT、
SMALLINT、
BYTEINT、
74
オペランドと同じ
オペランドのデー
タ タイプのデフォ
ルトの書式
SQL 関数、演算子、式および述部
第 2 章 集約関数
SUM
データ タイプとオ 結果のデータ タイプ
ペランド
書式
タイ
トル
DECIMAL、または
文字のいずれでも
ない
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
SUM を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、<
ユーティリティ 、B035-1102>を参照してください。
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
使用上の注意
value_expression が列参照である場合、その列は関数によって得られたビュー列で
あってはなりません。
SUM は数値データに対してのみ有効です。
結果の計算には NULL は含められません。詳細については、<SQL 基礎、
B035-1141>の「Null の操作」、および「集約と Null」を参照してください。
デフォルトの出力形式によって、SUM 関数を使用した結果、数値のあふれやデータ
の喪失が起こる場合があります。それらが発生した場合は、データ タイプの宣言を
使用してデフォルトをオーバーライドすることができます。
たとえば、QUANTITY が INTEGER 値の多数の列から成る場合は、SUM 関数に対し
て次のようなデータ タイプ宣言を指定する必要があるかもしれません。
SUM(QUANTITY(FLOAT))
SELECT Sum の結果オーバーフローが発生する可能性
SELECT Sum の結果オーバーフローが発生する可能性
この関数を使用する場合に、データ型とフォーマットが同期していないと、結果に
よりオーバーフローが発生することがあります。列が以下のように定義されている
場合:
Salary Decimal(15,2) Format ‘$ZZZ,ZZ9.99’
SQL 関数、演算子、式および述部
75
第 2 章 集約関数
VAR_POP
以下の問合わせを実行します。
SELECT SUM (Salary) FROM Employee;
小数オペランドおよび書式が一致していないため、オーバーフローが発生します。
オーバーフローが発生する可能性を回避するには、結果のデータ タイプでの、その
小数の合計が収まる十分な大きさで、小数の合計の書式を明示的に指定します。
SELECT Sum(Salary) (format ‘$Z,ZZZ,ZZZ,ZZ9.99) FROM Employee;
例
例: 売掛金
30 日以上前に請求書を発行してきたすべてのベンダーに支払う必要がある現金の額
を知る必要があるとします。
SELECT SUM(Invoice)
FROM AcctsRec
WHERE (CURRENT_DATE - InvDate) >= 30;
例: 在庫の額面値
在庫のすべての商品の額面の合計を知る必要があるとします。
SELECT SUM(QUANTITY * Price)
FROM Inventory;
Sum((QUANTITY * Price))
----------------------38,525,151.91
関連トピック
詳細は、以下を参照してください。
• 書式における書式設定文字についての説明は、<SQL データ タイプおよびリテラ
ル>の「概要」を参照してください。
• 累計、グループ合計、および移動合計を戻す SUM 関数については、ウィンドウ
集約関数を参照してください。
VAR_POP
目的
value_expression 内のデータ点に対して母集団分散を戻します。
76
SQL 関数、演算子、式および述部
第 2 章 集約関数
VAR_POP
構文
VAR_POP
value_expression )
(
DISTINCT
ALL
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれま
す。
DISTINCT
value_expression の重複を計算から除外します。
value_expression
母集団の分散を計算する数値リテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
母集団の分散は、その母集団の平均からのばらつきの尺度となります。
処理中のデータ点が完全な母集団でない場合は、VAR_POP を使用しないでください。
計算
母集団に非 NULL のデータ点がない場合、VAR_POP は NULL を戻します。
ゼロで割ると、エラーではなく NULL になります。
結果のタイプと属性
VAR_POP(x)のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
SQL 関数、演算子、式および述部
77
第 2 章 集約関数
VAR_POP
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの間
でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行な
います。
•
•
•
•
数値
文字
DATE
間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
VAR_POP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、
<ユーティリティ 、B035-1102>を参照してください。
他の関数との組み合わせ
VAR_POP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付
き分析関数と組み合わせることができます。
VAR_POP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集約
関数と組み合わせることはできません。
GROUP BY がレポートの区切りに与える影響
GROUP BY 句は VAR_POP 操作に影響を与えます。
問合わせ
VAR_POP の報告対象
GROUP BY 句を指定する場合
個々のグループ
GROUP BY 句を指定しない場合
サンプル内のすべての行
母集団の標準偏差の測定
データが、変数の母集団全体の標本を表わすにすぎない場合は、VAR_SAMP 関数を
使用してください。詳細については、「VAR_SAMP」を参照してください。
標本サイズが大きくなると、VAR_SAMP の値と VAR_POP は同じ数値に近づいてい
きます。しかし、変数に関してデータが母集団全体を成しているという絶対的な確
信がない限り、より控えめな VAR_SAMP 計算を常に使用するようにしてください。
関連トピック
詳細は、以下を参照してください。
• ウィンドウ集約関数
78
SQL 関数、演算子、式および述部
第 2 章 集約関数
VAR_SAMP
•
•
•
•
概要
SQL データ定義言語 - 構文規則および例、B035-1144
UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
順序付き分析関数の詳細は、「順序付き分析関数/ウィンドウ集約関数」を参照
してください。
• グループ、累計、または移動を計算する VAR_POP ウィンドウ関数については、
「ウィンドウ集約関数」を参照してください。
VAR_SAMP
目的
value_expression 内のデータ点の標本分散を戻します。
構文
VAR_SAMP
value_expression )
(
DISTINCT
ALL
構文要素
ALL
null でない value_expression のすべての値が、重複も含めて、この計算に含まれま
す。
DISTINCT
value_expression の重複を計算から除外します。
value_expression
標本の分散を計算する数値リテラルまたは列式。
この式に順序付き分析関数や集約関数を含めることはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
定義
標本の分散は、その標本の平均からのばらつきの尺度となります。それは標本標準
偏差の 2 乗です。
SQL 関数、演算子、式および述部
79
第 2 章 集約関数
VAR_SAMP
この計算は、算出値に与える他者の影響を最小限にするため、母集団の分散よりも
控えめなものとなります。
計算
計算に使用される標本に非 null データ点が 2 つ未満しかない場合、VAR_SAMP は
NULL を返します。
ゼロで割ると、エラーではなく NULL になります。
他の関数との組み合わせ
VAR_SAMP は、SELECT リスト、QUALIFY 句、または ORDER BY 句の中で、順序付
き分析関数と組み合わせることができます。
VAR_SAMP は、同じ SELECT リスト、QUALIFY 句、または ORDER BY 句の中の集
約関数と組み合わせることはできません。
GROUP BY がレポートの区切りに与える影響
VAR_SAMP は、SELECT 文に GROUP BY 句があるかどうかによって、動作が異なり
ます。
問合わせ
VAR_SAMP の報告対象
GROUP BY 句を指定する場合
個々のグループ
GROUP BY 句を指定しない場合
サンプル内のすべての行
母集団の分散の測定
データが、変数の母集団全体を表わしている場合は、VAR_POP 関数を使用してくだ
さい。
標本サイズが大きくなると、VAR_SAMP の値と VAR_POP は同じ数値に近づいてい
きます。しかし、変数に関してデータが母集団全体を成しているという絶対的な確
信がない限り、より控えめな VAR_SAMP 計算を常に使用するようにしてください。
結果のタイプと属性
VAR_SAMP のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: REAL
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが数値、日付、または間隔である場合、書式は x と同じ書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先のデータ タイプの
書式です。
80
SQL 関数、演算子、式および述部
第 2 章 集約関数
VAR_SAMP
UDT のサポート
Teradata Database はデフォルトで、UDT と、以下のいずれかの事前定義タイプの
間でキャストを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行
ないます。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。
VAR_SAMP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコー
ドの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
関連トピック
詳細は、以下を参照してください。
• 順序付き分析関数の詳細は、「順序付き分析関数/ウィンドウ集約関数」を参照
してください。
• グループ、累計、または移動を計算する VAR_SAMP ウィンドウ関数については、
「順序付き分析関数/ウィンドウ集約関数」を参照してください。
• データが、変数の母集団全体を表わしている場合は、VAR_POP 関数を使用して
ください。詳細は、「VAR_POP」を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• DisableUDTImplCastForSysFuncOp フィールドの詳細については、<ユーティリ
ティ、B035-1102>を参照してください。
• UDT の暗黙タイプ変換の詳細は、「データ型の変換」を参照してください。
SQL 関数、演算子、式および述部
81
第 2 章 集約関数
VAR_SAMP
82
SQL 関数、演算子、式および述部
第3章
算術演算子/関数、三角関数、双曲線関数
概要
この章では、SQL の算術演算子/関数、三角関数、双曲線関数について説明します。
Teradata SQL は、次の算術演算子をサポートします。
演算子
関数
**
べき乗算
これは、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
*
乗算
/
除算
MOD
モジュロ(剰余)
MOD は、除算における剰余を計算します。
例、60 MOD 7 = 4:これは、60 を 7 で割ります。商は 8、剰余は 4 です。結
果は、次のような被除数の符号になります。
-17 MOD 4 = -1
-17 MOD -4 = -1
17 MOD -4 = 1
17 MOD 4 = 1
これは、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
+
加算
-
減算
+
正符号(正数値)
-
負符号(負数値)
ANSI への準拠
MOD と**を除き、算術演算子は ANSI SQL:2011 準拠です。
算術演算子と LOB
算術演算子は BLOB または CLOB タイプをサポートしていません。
SQL 関数、演算子、式および述部
83
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
算術演算子と UDT
Teradata Database はデフォルトで、UDT と、FLOAT または INTEGER などの事前定
義された数値データ タイプとの間でキャストを行なう暗黙 CAST を持つ UDT 引数に
対して、暗黙のタイプ変換を行ないます。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。
算術演算子を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
関連トピック
詳細は、以下を参照してください。
• DateTime および間隔データ型で許可されている算術演算子の詳細は、「算術演
算子および ANSI の DateTime と間隔のデータ型」を参照してください。
• PERIOD データ型で許可されている算術演算子の詳細は、「算術演算子」を参照
してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドの詳細につい
ては、<ユーティリティ 、B035-1102>を参照してください。
• UDT の暗黙タイプ変換の詳細は、「暗黙的な型の変換」を参照してください。
2 項算術演算子の結果のデータ タイプ
算術式の結果のデータ タイプは、2 つのオペランドのデータ タイプによって決まり
ます。オペランドは、操作が行なわれる前に結果の型に変換されます。
たとえば、INTEGER 値が FLOAT 値に加算される前に、INTEGER 値は結果のデータ
タイプである FLOAT に変換されます。
結果のデータ タイプ
2 項算術演算子の結果のデータ タイプを次の表に示します。
UDT オペランドが関与する 2 項算術演算の結果のデータ タイプは、UDT の暗黙キャ
スト先の事前定義データ タイプの場合の結果データ タイプと同じです。
日時および間隔データ タイプを使用したバイナリ算術操作の結果データ タイプの詳
細は、「算術演算子と結果タイプ」を参照してください。
左のオペランド
右のオペランド
任意のデータ タ
イプ
任意のデータ タイプ **
84
使用する演算子 結果のデータ タイプ
FLOAT
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
DATE
BYTEINT
SMALLINT
INTEGER
BIGINT
+-
BYTEINT
SMALLINT
INTEGER
* / MOD
BIGINT
* / MOD
DATE(続き)
DATE
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
INTEGER
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
BIGINT
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
DECIMAL(k,j)
+-
DATE
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
日付の値に対する加算または減算の場合、
小数の小数点以下は切り捨てられます。
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
* / MOD
DECIMAL(p,j)
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
+-
DATE
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
日付の値に対する加算または減算の場合、
小数の小数点以下は切り捨てられます。
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
* / MOD
NUMBER
FLOAT
* / + - MOD
FLOAT
DATE
-
INTEGER
2 つの日付の差は、これらの日付の間の日数
です。これは、値の数値の差ではないこと
に注意する必要があります。
SQL 関数、演算子、式および述部
85
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
+ * / MOD
INTEGER
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
CHAR(n)
VARCHAR(n)
* / + - MOD
FLOAT
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
BYTEINT
SMALLINT
INTEGER
BYTEINT
SMALLINT
INTEGER
* / + - MOD
INTEGER
BIGINT
* / + - MOD
BIGINT
DECIMAL(k,j)
* / + - MOD
DECIMAL(p,j)
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
* / + - MOD
NUMBER
FLOAT
* / + - MOD
FLOAT
CHAR(n)
VARCHAR(n)
* / + - MOD
FLOAT
DATE
+
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
DATE
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
-
エラー
* / MOD
INTEGER
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
86
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
BIGINT
BYTEINT
SMALLINT
INTEGER
BIGINT
* / + - MOD
BIGINT
DECIMAL(k,j)
* / + - MOD
DECIMAL(p,j)
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
* / + - MOD
NUMBER
FLOAT
* / + - MOD
FLOAT
CHAR(n)
VARCHAR(n)
* / + - MOD
FLOAT
DATE
+
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
DATE
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
-
エラー
* / MOD
BIGINT
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
DECIMAL(m,n)
DECIMAL(p,n)
BYTEINT
SMALLINT
INTEGER
BIGINT
+-*
/ MOD
DECIMAL(m,n)
DECIMAL(k, j)
+-
DECIMAL(min(p,(1+max(n,j)+max(m -n,kj))),max(n,j))
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
*
DECIMAL(min(p,m +k),(n+j))
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
/ MOD
SQL 関数、演算子、式および述部
DECIMAL(p,max(n,j))
87
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
* / + - MOD
NUMBER
FLOAT
* / + - MOD
FLOAT
CHAR(n)
VARCHAR(n)
* / + - MOD
FLOAT
DATE
+
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
DATE
日付の値に対する加算または減算の場合、
小数の小数点以下は切り捨てられます。
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
-
エラー
*
DECIMAL(p,n)
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
p の値について、詳細は「DECIMAL の結果
のデータ型」を参照してください。
/ MOD
DECIMAL(m,n)
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
NUMBER(m,n)
NUMBER(m)
NUMBER(*,n)
NUMBER
BYTEINT
SMALLINT
INTEGER
BIGINT
* / + - MOD
NUMBER
* / + - MOD
FLOAT
DECIMAL(k,j)
FLOAT
CHAR(n)
VARCHAR(n)
88
FLOAT
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
DATE
+
DATE
日付の値に対する加算または減算の場合、
小数の小数点以下は切り捨てられます。
日付の結果の値が DATE 型に許容されている
範囲内にないとき、エラーが報告されます。
その範囲とは、西暦の 1 年から 9999 年ま
での任意の日付です。
-
エラー
*
NUMBER
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
/ MOD
NUMBER
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
FLOAT
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
* / + - MOD
NUMBER
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(k,j)
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
FLOAT
* / + - MOD
FLOAT
DATE
* / + - MOD
FLOAT
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
CHAR(n)
VARCHAR(n)
SQL 関数、演算子、式および述部
* / + - MOD
FLOAT
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
89
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
左のオペランド
右のオペランド
使用する演算子 結果のデータ タイプ
CHAR(n)
VARCHAR(n)
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(k,j)
NUMBER(k,j)
NUMBER(k)
NUMBER(*,
j)
DATE
NUMBER
FLOAT
CHAR(n)
VARCHAR(n)
* / + - MOD
FLOAT
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
* / + - MOD
FLOAT
DATE のこれらの演算はエラーを報告しませ
んが、結果は、通常意味がありません。
算術演算子の引数が文字列の場合には、最
初のアクションとしてその文字列から浮動
小数点の数値への変換が試みられます。こ
の変換が失敗した場合には、エラーが報告
されます。
DECIMAL の結果のデータ型
DECIMAL オペランドが関与するバイナリ算術演算の結果のデータ タイプは、次の
ようになります。
左のオペランド
右のオペランド
使用する演
算子
結果のデータ タイプ
DATE
DECIMAL(k,j)
* / MOD
DECIMAL(p,j)
DATE のこれらの演算はエラーを報告しませんが、結果は、
通常意味がありません。
* / + - MOD
DECIMAL(p,j)
BYTEINT
SMALLINT
INTEGER
BIGINT
+-*
DECIMAL(p,n)
DATE
*
DECIMAL(p,n)
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(m,n)
DATE のこれらの演算はエラーを報告しませんが、結果は、
通常意味がありません。
この場合、p の値、つまり小数結果の桁数は、以下によって異なります。
• DBSControl で MaxDecimal に指定した値。
DBSControl と MaxDecimal の詳細は、<ユーティリティ 、B035-1102>の「DBS
Control(DBS 制御)ユーティリティ」を参照してください。
• 小数オペランドの桁数。ただし、演算子の右の DECIMAL(k,j)オペランドの場合は
桁数は k、演算子の左の DECIMAL(m,n)オペランドの場合は桁数は m。
90
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
2 項算術演算子の結果のデータ タイプ
MaxDecimal の値
小数オペランドの桁数
p
0 または 15
<= 15
15
15 より大きく 18 より小さい
18
> 18
38
<= 18
18
> 18
38
任意の値
38
18
38
左のオペランド
右のオペランド
使用する演
算子
結果のデータ タイプ
DECIMAL(m,n)
DECIMAL(k,j)
+-
DECIMAL(min(p, (1+max(n,j)+max(m -n,k -j))),max(n,j))
*
DECIMAL(min(p,m +k),(n +j))
/ MOD
DECIMAL(p,max(n,j))
この場合、DBSControl 内の MaxDecimal に指定した値と、DECIMAL(m,n)オペラン
ドおよび DECIMAL(k,j)オペランドの桁数によって、小数結果のデータ型の定義にお
ける p の値は異なります。
MaxDecimal の値
および
p
0 または 15
m および k <= 15
15
(m または k > 15)と(m および k <=18)
18
m または k > 18
38
m および k <= 18
18
m または k > 18
38
m および k = 任意の値
38
18
38
数値の結果と四捨五入
式を計算した結果、数値の結果がちょうどではない場合は、切り捨てではなく四捨
五入されます。
四捨五入の規則、および DBSControl 内の RoundHalfwayMagUp および
RoundNumberAsDec フィールドが四捨五入に与える影響について 、詳細は< SQL
データ型とリテラル、B035-1143>の「数値データ型」および<ユーティリティ 、
B035-1102>の「DBS 制御ユーティリティ」を参照してください。
エラー条件
次の場合は、エラーが報告されます。
• ゼロによる除算が行なわれようとした。
• 数値の範囲を超えている。
SQL 関数、演算子、式および述部
91
第 3 章 算術演算子/関数、三角関数、双曲線関数
Structure of Arithmetic Expressions
• べき乗演算で左の引数が負、右の引数が整数以外で行なわれようとした。
整数の除算と切り捨て
整数の除算では、切り捨てが実行されて整数になります。
Structure of Arithmetic Expressions
評価の順序
次の表に、算術式での演算の優先順位を示します。
優先順位
演算
最高
+オペランド(正符号)
-オペランド(負符号)
中
オペランド**オペランド(べき乗算)
オペランド*オペランド(乗算)
オペランド/オペランド(除算)
オペランド MOD オペランド(比率演算子)
オペランド+オペランド(加算)
オペランド-オペランド(減算)
一般に、評価の順序は以下のようになります。
1. 括弧内の演算が最初に実行されます。
2. 括弧がないときは、演算は優先順位の順序で実行されます。
3. 同一の優先順位の演算子は、左から右に向かって評価されます。
最適化ルーチンでは、関与する演算の結合および可換プロパティに基づいて評価が
並べ替えられることがあります。
書式
算術式の書式は、結果のデータ タイプのデフォルトの書式と同じです。
FORMAT 句を使って、結果のデータ タイプのデフォルト書式を変更することができ
ます。FORMAT 句は、BTEQ アプリケーションなどのフィールド モード、および文
字データ タイプへの変換においてのみ適しています。
例: 従業員の昇給の決定
部門 600 のすべての従業員の給与を勤続年数に比例して 200 ドルずつ昇給する予定
(最高で月額 2500 ドルまで)と想定します。
該当者と新しい給与を決定するには、次の文になります。
92
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
算術関数
SELECT Name, (Salary+(YrsExp*200))/12 AS Projection
FROM Employee
WHERE Deptno = 600
AND Projection < 2500 ;
この文は、次の応答を戻します。
Name
-------Newman P
Projection
---------2483.33
この文は括弧を使って、まず演算 YrsExp * 200 を行ないます。次にその結果が Salary
に加算され、合計が 12 で割られています。
YrsExp * 200 を囲む括弧は厳密には必要ではありませんが、Salary + (YrsExp * 200)
を囲む括弧は必要です。それは、この式で括弧が使用されなかった場合、演算 YrsExp
* 200 は 12 で割られ、その結果が Salary に加算されるので、誤った値を生じるか
らです。
この例の句 AS Projection は、算術式の(Salary + (YrsExp * 200)/12)を Projection に
関連付けます。AS 句の使用によって、式全体を参照するのに WHERE 句内で名前
Projection を使用することになります。
結果は、1000 と 100 の位を区切るカンマなしで書式化されます。
算術関数
これから、次の算術関数について説明します。
• ABS
• CASE_N
• CEILING
• EXP
• FLOOR
• LN
• LOG
• NULLIFZERO
• RANDOM
• RANGE_N
• SQRT
• WIDTH_BUCKET
• ZEROIFNULL
ABS
目的
引数の絶対値を計算します。
SQL 関数、演算子、式および述部
93
第 3 章 算術演算子/関数、三角関数、双曲線関数
ABS
構文
ABS
( arg )
構文要素
arg
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
次の表に、ABS の結果のデフォルト属性を示します。
• オペランドが数値である場合、書式は結果のデータ タイプのデフォルトの書式で
す。
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先の事前定義タイプ
のデフォルト書式です。
注: NULL キーワードのデータ タイプは INTEGER です。
データ タイプ書式については、< SQL データ型とリテラル、B035-1143>を参照し
てください。
引数のタイプと規則
引数は、数値でない場合は暗黙のタイプ変換規則に基づいて数値に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙
的な型の変換を参照してください。
arg は文字列の場合は、FLOAT データ型の数値に変換されます。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりませ
ん。
• 数値
• 文字
• 日時
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• ABS を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細は、
<ユーティリティ 、B035-1102>を参照してください。
94
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
次のタイプの引数に ABS を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: ABS 算術関数式の使用
主な ABS 算術関数式とその結果の例を次に示します。
式
結果
ABS(-12)
12
ABS('23')
2.30000000000000E+001
例: ABS 算術関数式の使用
主な ABS 算術関数式とその結果の例を次に示します。
式
結果
ABS(-12)
12
ABS('23')
2.30000000000000E+001
CASE N
目的
条件リストを評価して、TRUE と評価された最初の条件の位置を戻します。ただし、
そのリスト中の以前の条件が UNKNOWN と評価されていないことを前提とします。
構文
,
CASE_N
(
A
conditional_expression
A
)
,
NO CASE
OR UNKNOWN
, UNKNOWN
UNKNOWN
構文要素
conditional_expression
評価する式またはカンマで区切られた条件式のリスト。
条件式は TRUE、FALSE、または UNKNOWN と評価されなければなりません。
SQL 関数、演算子、式および述部
95
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
NO CASE
リスト中のすべての conditional_expression が FALSE と評価される場合に TRUE と
評価されます。
OR UNKNOWN
NO CASE とともに使用します。
リスト中のすべての conditional_expression が FALSE と評価される場合か、または
conditional_expression が UNKNOWN と評価されるとともにリスト中の前の条件が
すべて FALSE と評価される場合、NO CASE OR UNKNOWN 条件は TRUE と評価され
ます。
UNKNOWN
conditional_expression が UNKNOWN と評価され、かつリスト中の前の条件がすべ
て FALSE と評価される場合に TRUE と評価されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
評価
条件の評価が TRUE または UNKNOWN と決まるまでか、またはどの条件の評価も
FALSE となるまで、CASE_N は左から右に向かって conditional_expressions を評価
します。最初の conditional_expression の位置は 1 になり、それに続く条件の位置
は上限を n として 1 ずつ増加します。n は条件式の合計数です。
条件
結果
conditional_expression が CASE_N は conditional_expression の位置を戻します。
TRUE と評価され、前の条
件はすべて FALSE と評価さ
れた場合
conditional_expression が
UNKNOWN と評価され、
前の条件はすべて FALSE と NO CASE OR UNKNOWN を指定した場合、CASE_N は n + 1 を
返します。
評価された場合
UNKNOWN を指定し、NO CASE を指定しない場合、CASE_N
は n + 1 を返します。
NO CASE と UNKNOWN を指定した場合、CASE_N は n + 2 を
返します。
UNKNOWN も NO CASE OR UNKNOWN も指定しない場合、
CASE_N は NULL を返します。
すべての
conditional_expression が
FALSE と評価された場合
96
NO CASE または NO CASE OR UNKNOWN を指定した場合、
CASE_N は n + 1 を返します。
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
条件
結果
NO CASE も NO CASE OR UNKNOWN も指定しない場合、
CASE_N は NULL を返します。
結果のタイプと属性
CASE_N のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER のデフォルト書式
<CASE_N 関数>
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
パーティション基本索引を定義するための CASE_N の使用
テーブルの基本索引または結合索引は、各 AMP に対するそのテーブルのデータま
たは結合索引の分散および検索を制御します。基本索引がパーティション 基本索引
(PPI)である場合、AMP 上のユーザー定義のパーティションに対してデータを割り
当てることができます。
テーブルの基本索引または結合索引を定義するには、PRIMARY INDEX 句を CREATE
TABLE または CREATE JOIN INDEX データ定義文に指定します。パーティション基
本索引を定義するには、基本索引の定義時に PARTITION BY 句を組み込みます。
PARTITION BY 句には、行のパーティション割り当てを決定する 1 つ以上のパーティ
ション化式が必要です。CASE_N を使って、パーティション化列において何らかの
値または NULL をもつ行がいずれかのパーティションに割り当てられるようにパー
ティション化式を構築することができます。
また、RANGE_N を使ってパーティション化列を構築することもできます。詳細に
ついては、「RANGE_N」を参照してください。
PARTITION BY 句がパーティション化式のリストを指定する場合、PPI はマルチレ
ベル PPI であり、1 つのレベルの各パーティションはリスト内の次のパーティショ
ン化式に従ってサブパーティション化されます。有効な SQL 式(例外もあり)から成
る単一レベルの PPI のパーティション化式とは異なり、マルチレベル PPI のパー
ティション化式のリスト内の各式は、CASE_N 関数または RANGE_N 関数でなけれ
ばなりません。
CASE_N 関数に基づくパーティション式を、ADD または DROP することはできませ
ん。CASE_N 関数に基づくパーティション式を変更するには、MODIFY PRIMARY
INDEX オプションを指定した ALTER TABLE 文で、PARTITION BY 句全体を再定義
する必要があります。また、その文を使用するテーブルは空でなければなりません。
詳細については、<SQL データ定義言語 - 構文規則および例、B035-1144>の「ALTER
TABLE」を参照してください。
SQL 関数、演算子、式および述部
97
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
CURRENT_DATE または CURRENT_TIMESTAMP を指定した CASE_N を PPI で使用する方法
ビルトイン関数の CURRENT_DATE または CURRENT_TIMESTAMP を指定した
CASE_N を使用して、パーティション式を定義できます。これを定義した後で、
ALTER TABLE TO CURRENT 文を使用すると、改めて解決された現在の日付またはタ
イムスタンプを使用して、テーブル データを再パーティション化できます。
詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>の「更新可能日付
および更新可能タイムスタンプに基づく CASE_N パーティション式の最適化を調整
するルール」を参照してください。
文字比較を指定した CASE_N の使用
CHAR、VARCHAR、GRAPHIC、VARGRAPHIC データ タイプを比較する条件式を、
CASE_N 関数内で指定できます。適用される使用上の規則は、次のとおりです。
• CASE_N パーティション式には、文字またはグラフィック文字の比較を使用でき
ます。ただし、KANJI1 または KANJISJIS の列やリテラル式が関与している比較
は使用できません。
• CASE_N パーティション式には、UPPERCASE 修飾子と、次に示す関数を使用でき
ます。LOWER、UPPER、TRANSLATE、TRIM、VARGRAPHIC、INDEX、
MINDEX、POSITION、TRANSLATE_CHK、CHAR2HEXINT。
• CASE_N 式内で参照する文字列定数は、31,000 バイト未満にする必要があります。
• CASE_N 関数内の条件式を評価する際に使用される文字データの順序は、セッショ
ンの照合と、その条件式に対するケース指定によって決定されます。
• その条件式が PPI の一部ではない場合には、現在のセッションの照合が使用さ
れます。
• その条件式が PPI の一部である場合には、テーブルまたは結合索引が作成され
たときに有効であったセッションの照合が評価に使用されます。または、パー
ティションが ALTER TABLE 文で変更されたときに有効であったセッションの
照合が評価に使用されます。
• 列参照と文字列定数のケース指定は、セッションのデフォルト、明示的な
CAST、またはテーブルが作成されたときの CREATE TABLE 文の指定内容によっ
て決まります。列には CASESPECIFIC または NOT CASESPECIFIC を明示的に指
定できます。また、それらの修飾子でリテラル式を CAST できます。
明示的な指定がないときに、Teradata セッションのトランザクション セマン
ティクスが有効な場合には、NOT CASESPECIFIC が使用されます。ANSI セッ
ションのトランザクション セマンティクスが有効な場合には、CASESPECIFIC
がデフォルトになります。
たとえば、条件式が、NOT CASESPECIFIC 式と、ケース指定修飾子
(CASESPECIFIC、NOT CASESPECIFIC)のないリテラルの組み合わせならば、
ANSI モードのセッションではケース指定が CASESPECIFIC になり、Teradata
モードのセッションでは NOT CASESPECIFIC になります。
グラフィック文字データが関与する文字列比較は、すべてケース指定になりま
す。
• 文字比較演算子(=、<、>、<=、>=、<>、BETWEEN、LIKE)では、文字列定数が比
較対象の列データよりも短い場合、その文字列定数は埋め込み文字が埋め込まれ
ているものとして扱われます。埋め込み文字(例えば、<スペース> 文字)は、文字
セットに固有なものになります。
98
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
埋め込み文字は、照合内の最小コード ポイントとして照合されないことがあり
ます。長さ n のリテラルの場合、比較対象の列値がリテラルの最初の n 文字まで
完全に一致していても、列値の n+1 の位置に埋め込み文字よりも小さく照合され
る文字が含まれていると、その列値は文字列リテラルよりも小さいと照合されま
す。
制約事項
CASE_N が PARTITION BY 句で使用される場合、以下のような制限が適用されます。
• 最大 65533 の条件を指定できる(大きなパーティション化式の一部でない場合)。
• システム派生列の PARTITION または PARTITION#L1 から PARTITION#L15 を含
めてはいけません。
• 以下の場合を除いて、PERIOD データ型を使用してはなりません。
• 入力が PERIOD データ タイプの列であり、期間式ではない BEGIN 境界関数。
• 入力が PERIOD データ タイプの列であり、期間式ではない END 境界関数。
• IS [NOT] UNTIL_CHANGED。
• IS [NOT] UNTIL_CLOSED。
CASE_N がマルチレベル PPI のパーティション化式で使用される場合は、少なくと
も 2 つのパーティションを定義する必要があります。
問合わせのパーティション排除は、リテラルに限定されていることが多く、そうで
なければパーティション列に対して等価条件の値を使用することになるため、一部
のパーティションは排除可能であっても、最適化ルーチンによって排除されないこ
とがあります。さらに、CPU サイクルの観点から考えると複雑な CASE_N の評価に
はコストがかかることがあり、CASE_N のオーバーヘッドがテーブル ヘッダーの巨
大化を招くこともあります。
例
例: 行を割り当てるパーティションの定義
以下は、CASE_N と totalorders 列の値を使って行の割り当て先のパーティションを
定義する例です。
CREATE TABLE orders
(storeid INTEGER NOT NULL
,productid INTEGER NOT NULL
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL
,totalorders INTEGER)
PRIMARY INDEX (storeid, productid)
PARTITION BY CASE_N(totalorders < 100, totalorders < 1000,
NO CASE, UNKNOWN);
この例では、CASE_N は totalorders 列の値に基づいて、行の割り当て先となる 4 つ
のパーティションを指定します。
パーティ
ション
番号
条件
1
totalorders 列の値は 100 より小さい。
SQL 関数、演算子、式および述部
99
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
パーティ
ション
番号
条件
2
totalorders 列の値は 1000 より小さいが、100 以上である。
3
totalorders 列の値は 1000 以上である。
4
totalorders 列は NULL である。
例: マルチレベル PPI を定義するパーティション化式のリストで CASE_N の使用
以下の例では、「例: 行が割り当てられるパーティションの定義」を変更して、マル
チレベル PPI を定義するパーティション化式のリストで CASE_N を使用しています。
CREATE TABLE orders
(storeid INTEGER NOT NULL
,productid INTEGER NOT NULL
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL
,totalorders INTEGER NOT NULL)
PRIMARY INDEX (storeid, productid)
PARTITION BY (CASE_N(totalorders < 100, totalorders < 1000,
NO CASE)
,CASE_N(orderdate <= '2005-12-31', NO CASE) );
この例では、行が割り当てられる 6 つのパーティションが定義されています。最初
の CASE_N 式は、totalorders 列の値に基づいて 3 つのパーティションを定義してい
ます。2 番目の CASE_N 式は、orderdate 列の値に基づいて 3 つのパーティションを
それぞれ 2 つのパーティションに再分割しています。
レベル 1
パーティ
ション
番号
レベル 2 条件
パーティ
ション
番号
1
1
totalorders 列の値は 100 より小さく、orderdate 列の値は
'2005-12-31'より小さいか等しい。
2
totalorders 列の値は 100 より小さく、orderdate 列の値は
'2005-12-31'より大きい。
1
totalorders 列の値は 1000 より小さく、100 より大きいか等しい。
orderdate 列の値は'2005-12-31'より小さいか等しい。
2
totalorders 列の値は 1000 より小さく、100 より大きいか等しい。
orderdate 列の値は'2005-12-31'より大きい。
1
totalorders 列の値は 1000 より大きいか等しく、orderdate 列の値は
'2005-12-31'より小さいか等しい。
2
totalorders 列の値は 1000 より大きいか等しく、orderdate 列の値は
'2005-12-31'より大きい。
2
3
例: 各パーティションの行数の表示
以下の例は、CASE_N 式を使って orders テーブルがパーティション化された場合の
各パーティションの行カウントを示します。
100
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
CREATE TABLE orders
(orderkey INTEGER NOT NULL
,custkey INTEGER
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL)
PRIMARY INDEX (orderkey);
INSERT INTO orders (1, 1, '1996-01-01');
INSERT INTO orders (2, 1, '1997-04-01');
次の SELECT 文の CASE_N 式は、3 つの条件式と NO CASE 条件を指定します。
SELECT COUNT(*),
CASE_N(orderdate >= '1996-01-01'
orderdate <= '1996-12-31'
custkey <> 999999,
orderdate >= '1997-01-01'
orderdate <= '1997-12-31'
custkey <> 999999,
orderdate >= '1998-01-01'
orderdate <= '1998-12-31'
custkey <> 999999,
NO CASE
) AS Partition_Number
FROM orders
GROUP BY Partition_Number
ORDER BY Partition_Number;
AND
AND
AND
AND
AND
AND
結果は次のようになります。
Count(*)
----------1
1
Partition_Number
---------------1
2
例: 注文データでパーティション化されるテーブルの作成
次の例では、2008 年の四半期ごとの注文(Orders)データでパーティション化された
テーブルを作成しています。
CREATE TABLE Orders
(O_orderkey INTEGER NOT NULL,
O_custkey INTEGER,
O_orderperiod PERIOD (DATE) NOT NULL,
O_orderpriority CHAR (21),
O_comment VARCHAR (79))
PRIMARY INDEX (O_orderkey)
PARTITION BY
CASE_N (END (O_orderperiod) <= date'2008-03-31', /* First Quarter
*/
END (O_orderperiod) <= date'2008-06-30', /* Second Quarter
*/
END (O_orderperiod) <= date'2008-09-30', /* Third Quarter
*/
SQL 関数、演算子、式および述部
101
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
END (O_orderperiod) <= date'2008-12-31' /* Fourth Quarter
*/
);
次の SELECT 文では、2 つのパーティションをスキャンして、年初からの 2 四半期
に受注した注文(Orders)の詳細項目を表示します。
SELECT *
FROM Orders
WHERE END (O_orderperiod) > date'2008-06-30';
例: PERIOD 式の終了境界値の確認
次の例では、PPI のパーティション式に IS [NOT] UNTIL_CHANGED を使用して、期
間式の終了境界が UNTIL_CHANGED かどうかを検査しています。
CREATE TABLE TESTUC
(A INTEGER,
B PERIOD (DATE),
C INTEGER)
PRIMARY INDEX (A)
PARTITION BY
CASE_N (END (b) IS UNTIL_CHANGED,
END (b) IS NOT UNTIL_CHANGED, UNKNOWN);
例: Transaction-time 列の PERIOD 式の終了境界値の確認
次の例では、PPI のパーティション式に IS [NOT] UNTIL_CLOSED を使用して、トラ
ンザクション時間列の終了境界が UNTIL_CLOSED かどうかを検査しています。
CREATE TABLE TESTUC
(A INTEGER,
B PERIOD (TIMESTAMP (6) WITH TIME ZONE) NOT NULL AS
TRANSACTIONTIME,
C INTEGER)
PRIMARY INDEX (A)
PARTITION BY
CASE_N (END (b) IS UNTIL_CHANGED,
END (b) IS NOT UNTIL_CHANGED, UNKNOWN);
例: FALSE 条件の結果の表示
この例では、セッションの照合は ASCII です。
CASE_N (a<'b', a>='ba' and a<'dogg' and b<>'cow', c<>'boy', NO CASE OR
UNKNOWN)
次の表では、a、b、および c に特定の値を指定したときに、上記の CASE_N 関数が
返す結果値を示しています。x および y は、任意の値または NULL を表わします。
条件がすべて FALSE の場合や、先行する条件が FALSE と評価されていて、最後の条
件が UNKNOWN の場合には、値 4 が返されます。
102
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
a
b
c
結果
'a'
x
y
1
'boy'
'girl'
y
2
'boy'
NULL
y
4
'boy'
'cow'
'man'
3
'boy'
'cow'
'boy'
4
'dog'
'ball'
y
2
'dogg'
x
NULL
4
'dogg'
x
'man'
3
'egg'
x
'boy'
4
'egg'
x
NULL
4
'egg'
x
'girl'
3
例: UNKNOWN 条件の結果の表示
この例では、セッションの照合は ASCII です。
CASE_N (a<'b', a>='ba' and a<'dogg' and b<>'cow', c<>'boy', UNKNOWN)
次の表では、a、b、および c に特定の値を指定したときに、上記の CASE_N 関数が
返す結果値を示しています。x および y は、任意の値または NULL を表わします。
先行する条件がすべて FALSE に評価され、最後の条件が UNKNOWN の場合は、値
4 が返されます。すべての条件が FALSE の場合は、NULL が返されます。
a
b
c
結果
'a'
x
y
1
'boy'
'girl'
y
2
'boy'
NULL
y
4
'boy'
'cow'
'man'
3
'boy'
'cow'
'boy'
NULL
'dog'
'ball'
y
2
'dogg'
x
NULL
4
'dogg'
x
'man'
3
'egg'
NULL
'boy'
NULL
'egg'
x
'boy'
NULL
SQL 関数、演算子、式および述部
103
第 3 章 算術演算子/関数、三角関数、双曲線関数
CASE N
a
b
c
結果
'egg'
x
NULL
4
'egg'
x
'girl'
3
例: a の値に基づくパーティションの定義
この例では、CREATE TABLE 文を実行しているときのセッションの照合は ASCII で
す。また、埋め込み文字は<スペース>です。この例では、次に示す a の値に基づい
て、2 つのパーティション(番号 1 と 2)を定義します。
'(a の後ろに 9 個のスペース)から'b
'の間である。
• a の値は、'a
• a の値は、'b
'から'c
'の間である。
CREATE SET TABLE t2
(a VARCHAR(10) CHARACTER SET UNICODE NOT CASESPECIFIC,
b INTEGER)
PRIMARY INDEX (a)
PARTITION BY CASE_N(a BETWEEN 'a' AND 'b', a BETWEEN 'b' AND 'c');
以下の INSERT 文では、'b'と'1'の間に 1 つの<tab>文字が入る文字列を挿入します。
INSERT t2 ('b
1', 1);
以下の INSERT 文では、'b'と'1'の間に 1 つの<space>文字が入る文字列を挿入します。
INSERT t2 ('b 1', 2);
以下の SELECT 文は、INSERT 文の結果を示します。タブ文字はスペース文字よりも
コード ポイントが小さいため、最初に挿入された文字列はパーティション 1 にマッ
プされます。
SELECT PARTITION, a, b FROM t2 ORDER BY 1;
*** Query completed. 2 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
PARTITION a
b
----------- ------ ----1 b 1
1
(string contains single <tab> character)
2 b 1
2
(string contains single <space> character)
関連トピック
詳細は、以下を参照してください。
• PPI のプロパティとパフォーマンスに関する考慮事項 、および PPI の考慮事項と
容量に関する計画の詳細については、<データベース設計、B035-1094>を参照し
てください。
• テーブルの PPI の指定の詳細については、 <SQL データ定義言語 - 構文規則およ
び例、B035-1144>の「CREATE TABLE」を参照してください。
• 結合索引の PPI の指定の詳細については、<SQL データ定義言語 - 構文規則および
例、B035-1144>の「CREATE JOIN INDEX」を参照してください。
• テーブルの基本索引のパーティションの修正の詳細については 、<SQL データ定
義言語 - 構文規則および例、B035-1144>の「ALTER TABLE」を参照してください。
104
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
CEILING
• 新規に解決された CURRENT_DATE 値と、CURRENT_TIMESTAMP 値に基づいた
パーティション化の調整の詳細については、<SQL データ定義言語 - 構文規則お
よび例、B035-1144>の「ALTER TABLE TO CURRENT」を参照してください。
CEILING
目的
入力引数よりも小さくならない最小の整数値を返します。
構文
CEILING
TD_SYSFNLIB.
( arg )
CEIL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
arg
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
CEILING は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
BYTEINT、SMALLINT、INTEGER、BIGINT、FLOAT/REAL/DOUBLE PRECISION、
DECIMAL/NUMERIC、または NUMBER
戻り値
CEILING は次の値を返すスカラー関数です。
SQL 関数、演算子、式および述部
105
第 3 章 算術演算子/関数、三角関数、双曲線関数
CEILING
arg
CEILING の返す値
非正確数
arg より大きい次の整数値。
正確数
入力引数 arg。
NULL
NULL
結果のタイプと属性
結果のタイプは、入力引数の数値と同じデータ タイプになります。
入力引数が DECIMAL/NUMERIC で精度が 38 未満のときには、返される DECIMAL/
NUMERIC 値の精度が 1 だけ増分されます。例えば、DECIMAL(6,4)が渡されたとす
ると、その精度が増分されて DECIMAL(7,4)として返されます。精度が 38 の場合
は、スケールが 1 だけ減分されます(スケールが 0 でない場合)。例えば、
DECIMAL(38,38)の戻りデータ型は DECIMAL(38,37)になります。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、B035-1143>
を参照してください。
例
例: SELECT CEILING(157E-1);の問合わせ
次の問合わせは、FLOAT 値 16E0 を返します。これは、FLOAT 値 15.7E0 よりも小
さくならない最小の整数が 16 になるためです。
SELECT CEILING(157E-1);
例: SELECT CEILING(15.7);の問合わせ
次の問合わせは、DECIMAL 値 16.0 を返します。これは、DECIMAL 定数 15.7 より
も小さくならない最小の整数が 16 になるためです。
SELECT CEILING(15.7);
例: SELECT CEILING(-12.3);の問合わせ
次の問合わせは、DECIMAL 値-12.0 を返します。これは、DECIMAL 定数-12.3 より
も小さくならない最小の整数が-12 になるためです。
SELECT CEILING(-12.3);
例: SELECT CEIL( CAST(9.99 AS DECIMAL(3,2)) );の問合わせ
次の問合わせは、データ型が DECIMAL(4,2)の値 10.00 を返します。これは、9.99
よりも小さくならない最小の整数が 10 になるためです。戻り値の精度が 1 だけ増
分されていることに注目してください。
SELECT CEIL( CAST(9.99 AS DECIMAL(3,2)) );
106
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
EXP
EXP
目的
e(自然対数の底)を引数にべき乗します。ただし、e = 2.71828182845905。
構文
EXP
( arg )
構文要素
arg
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
次の表に、EXP(arg)の結果のデフォルト属性を示します。
データ タイプ
書式
タイトル
FLOAT
結果のデータ タイプのデフォルト書式
EXP(arg)
引数のタイプと規則
arg は、FLOAT でない場合は暗黙の型変換規則に基づいて FLOAT に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、「暗
黙的な型の変換」を参照してください。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。
• EXP を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
次のタイプの引数に EXP を適用することはできません。
• BYTE または VARBYTE
SQL 関数、演算子、式および述部
107
第 3 章 算術演算子/関数、三角関数、双曲線関数
FLOOR
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
使用上の注意
EXP を実行すると、数値のオーバーフロー エラーになる場合があります。
例: 典型的な EXP 算術関数式
主な EXP 算術関数式とその結果の例を次に示します。
式
結果
EXP(1)
2.71828182845905E+000
EXP(0)
1.00000000000000E+000
関連トピック
詳細は、以下を参照してください。
• デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設
定する詳細については、<ユーティリティ 、B035-1102>を参照してください。
FLOOR
目的
入力引数以下の最大の整数を返します。
構文
FLOOR
( arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
108
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
FLOOR
arg
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
FLOOR は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
BYTEINT、SMALLINT、INTEGER、BIGINT、FLOAT/REAL/DOUBLE PRECISION、
DECIMAL/NUMERIC、または NUMBER
戻り値
FLOOR は次の値を返すスカラー関数です。
arg
FLOOR の返す値
非正確数
arg 以下の最大の整数。
正確数
入力引数 arg。
NULL
NULL
結果のタイプと属性
結果のタイプは、入力引数の数値と同じデータ タイプになります。
入力引数が DECIMAL/NUMERIC で精度が 38 未満のときには、返される DECIMAL/
NUMERIC 値の精度が 1 だけ増分されます。例えば、DECIMAL(6,4)が渡されたとす
ると、その精度が増分されて DECIMAL(7,4)として返されます。精度が 38 の場合
は、スケールが 1 だけ減分されます(スケールが 0 でない場合)。例えば、
DECIMAL(38,38)の戻りデータ型は DECIMAL(38,37)になります。
FLOOR のデフォルト タイトルは、FLOOR(arg)です。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
SQL 関数、演算子、式および述部
109
第 3 章 算術演算子/関数、三角関数、双曲線関数
LN 関数
例
例: SELECT FLOOR (136E-1);の問合わせ
次の問合わせは、FLOAT 値 13E0 を返します。これは、FLOAT 値 13.6E0 よりも小
さい最大の整数が 13 になるためです。
SELECT FLOOR (136E-1);
例: SELECT FLOOR(-6.5);の問合わせ
次の問合わせは、DECIMAL 値-7.0 を返します。これは、DECIMAL 定数-6.5 よりも
小さい最大の整数が-7 になるためです。
SELECT FLOOR(-6.5);
例: SELECT FLOOR (CAST(-6.5 AS DECIMAL(2,1)));の問合わせ
次の問合わせは、データ型が DECIMAL(3,1)の値-7.0 を返します。これは、DECIMAL
の-6.5 よりも小さい最大の整数が-7 になるためです。戻り値の精度が 1 だけ増分さ
れていることに注目してください。
SELECT FLOOR (CAST(-6.5 AS DECIMAL(2,1)));
関連トピック
詳細は、以下を参照してください。
• 「埋め込みサービス システム関数 」
• SQL データ型とリテラル、B035-1143
LN 関数
目的
引数の自然対数を計算します。
構文
LN
( arg )
構文要素
arg
非ゼロの正数値引数。
110
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
LN 関数
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
LN(arg)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
FLOAT
FLOAT のデフォルト書式
LN(arg)
引数のタイプと規則
arg は、FLOAT でない場合は暗黙の型変換規則に基づいて FLOAT に変換されます。
引数を変換できない場合は、エラーがレポートされます。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。
• LN を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
次のタイプの引数に LN を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: 典型的な LN 算術関数式
例: 典型的な LN 算術関数式
主な LN 算術関数式とその結果の例を次に示します。
式
結果
LN(2.71828182845905)
1.00000000000000E+000
LN(0)
エラー
関連トピック
詳細は、以下を参照してください。
SQL 関数、演算子、式および述部
111
第 3 章 算術演算子/関数、三角関数、双曲線関数
LOG 関数
• 暗黙タイプ変換の詳細は、「暗黙的な型の変換」を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設
定する詳細については、<ユーティリティ 、B035-1102>を参照してください。
• デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
LOG 関数
目的
引数の底 10 の対数を計算します。
構文
LOG
( arg )
構文要素
arg
非ゼロの正数値引数。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
LOG(arg)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
FLOAT
FLOAT のデフォルト書式
LOG(arg)
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、B035-1143>
を参照してください。
引数のタイプと規則
arg は、FLOAT でない場合は暗黙の型変換規則に基づいて FLOAT に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙
的な型の変換を参照してください。
arg が UDT である場合、以下のルールが適用されます。
112
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
NULLIFZERO
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• LOG を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<ユーティリティ 、B035-1102>を参照してください。
次のタイプの引数に LOG を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: 典型的な LOG 算術関数式
主な LOG 算術関数式とその結果の例を次に示します。
式
結果
LOG(50)
1.69897000433602E+000
LOG(100)
2.00000000000000E+000
関連トピック
詳細は、以下を参照してください。
•
•
•
•
暗黙的な型の変換
SQL データ定義言語 - 構文規則および例、B035-1144
ユーティリティ 、B035-1102
SQL データ型とリテラル、B035-1143
NULLIFZERO
目的
ゼロによる除算の問題を避けるために、データをゼロから null に変換します。
構文
NULLIFZERO
( arg )
SQL 関数、演算子、式および述部
113
第 3 章 算術演算子/関数、三角関数、双曲線関数
NULLIFZERO
構文要素
arg
暗黙のタイプ変換規則に基づいて数値引数に変換される数値引数または引数。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
この関数の ANSI 形式は、CASE の簡略式である NULLIF です。詳細は、「NULLIF
式」を参照してください。
結果のタイプと属性
次の表に、NULLIFZERO の結果のデフォルト属性を示します。
• arg が数値である場合、データ型は arg と同じ型であり、形式は arg と同じ形式
です。
• arg が文字である場合、データ型は FLOAT であり、デフォルトの形式は FLOAT
です。
• arg が UDT である場合、データ型は UDT が暗黙的にキャストされる型であり、
形式は UDF が暗黙的にキャストされるデータ型の形式です。
注: NULL キーワードのデータ タイプは INTEGER です。
データ タイプ書式については、< SQL データ型とリテラル、B035-1143>を参照し
てください。
結果値
arg の値
NULLIFZERO から戻されるもの
非ゼロ
数値引数の値
NULL またはゼロ
NULL
引数のタイプと規則
arg は、数値でない場合は暗黙の型変換規則に基づいて数値に変換されます。引数を
変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙的な型
の変換を参照してください。
arg は文字列の場合は、FLOAT データ型の数値に変換されます。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりませ
ん。
• 数値
• 文字
• DATE
114
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
NULLIFZERO
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• NULLIFZERO を含め、システム演算子および関数用の UDT の暗黙の型変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御
レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定しま
す。詳細は、<ユーティリティ 、B035-1102>を参照してください。
次のタイプの引数に NULLIFZERO を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例
例: NULLIFZERO に対して返された式のエラー
次の式は、x または expression の値がゼロになるとエラーを戻します。
6 / x
6 / expression
一方、次の式は、null 戻します。ゼロによる除算の違反が生じていないため、これ
はエラーではありません。
6 / NULLIFZERO(x)
6 / NULLIFZERO(expression)
例: NULLIFZERO に対して返された要求のエラー
次の要求は、Newman の HCap フィールドの値がゼロであるため、2 番目の列に null
を戻します。BTEQ (フィールド モード)ではこれは「?」と表示されます。
SELECT empno, NULLIFZERO(hcap)
FROM employee
WHERE empno = 10019 ;
関連トピック
NULL の検査に関係するさらに別の式については、以下を参照してください。
• COALESCE 式
• NULLIF 式
• ZEROIFNULL
• 暗黙的な型の変換
• SQL データ定義言語 - 構文規則および例、B035-1144
• ユーティリティ 、B035-1102
• SQL データ型とリテラル、B035-1143
SQL 関数、演算子、式および述部
115
第 3 章 算術演算子/関数、三角関数、双曲線関数
POWER
POWER
目的
base_value の exponent_value 乗を返します。
構文
POWER
( base_value, exponent_value )
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
base_value
変換される数値式。
base_value が負の場合、exponent_value は整数にする必要があります。
任意の入力引数が NULL の場合、この関数は NULL を返します。
exponent_value
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
POWER は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、または NUMBER
116
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANDOM
結果のタイプ
入力引数のどちらかが FLOAT タイプの場合、結果のデータ タイプは FLOAT になり
ます。それ以外の場合、結果のデータ タイプは NUMBER になります。
例: exponent_value の乗を返す問合わせ
例 1: exponent_value の乗。
以下の問合わせは結果として 8.0 を返します。
SELECT POWER(2, 3);
例 2:
以下の問合わせは結果として 0.125 を返します。
SELECT POWER(2, -3);
例 3:
以下の問合わせは結果として 10.648 を返します。
SELECT POWER(2.2, 3);
例 4:
次の問合わせは、エラーを返します。これは、基底値(base_value)が負であるのに
指数値(exponent_value)が整数でないためです。
SELECT POWER(-2.2, 3.1);
関連トピック
詳細は、以下を参照してください。
• 「埋め込みサービス システム関数 」
• SQL データ型とリテラル、B035-1143
RANDOM
目的
結果テーブルの各行について、整数の乱数を戻します。
構文
RANDOM
( lower_bound, upper_bound )
SQL 関数、演算子、式および述部
117
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANDOM
構文要素
lower_bound
乱数を選択するための一定間隔の下限を定義する整数リテラル。
lower_bound の限度は、-2147483648~2147483647 の範囲です。
lower_bound は upper_bound 以下の値である必要があります。
upper_bound
乱数を選択するための一定間隔の上限を定義する整数リテラル。
upper_bound の限度は、-2147483648 以上、2147483647 以下の範囲です。
upper_bound は lower_bound 以上の値である必要があります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
RANDOM(x,y)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER のデフォルト書式
Random(x,y)
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、B035-1143>
を参照してください。
計算
RANDOM は、線形一致アルゴリズムと 48 ビット整数計算を使用します。
このアルゴリズムは、48 ビット整数値のシーケンス(Xi)を生成することで機能します。
SELECT リスト内の複数 RANDOM 呼出し
SELECT リストでは、次のように RANDOM を何度でも呼び出すことができます。
SELECT RANDOM(1,100), RANDOM(1,100);
それぞれの呼出しで、新しい乱数値が定義されます。
制約事項
RANDOM 関数の使用については、以下の規則と制約が適用されます。
• RANDOM を呼び出せるのは、以下の SELECT 問合わせ句のいずれかにおいてのみ
です。
118
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANDOM
• WHERE
• GROUP BY
• ORDER BY
• HAVING/QUALIFY
• RANDOM は、GROUP BY 句や ORDER BY 句の中で位置による参照を行なえませ
ん。
• 集約内や順序付き分析関数内では RANDOM をネストすることはできません。
• INSERT 文中の式リストで RANDOM を使用して基本索引列またはパーティショ
ン列の値を作成することはできません。
以下に例を示します。
INSERT t1 (RANDOM(1,10),...)
テーブルの最初の列が基本索引列またはパーティション列の場合にこれを使用す
ると、RANDOM が原因でエラーになり、報告されます。
索引の条件としての RANDOM の使用
RANDOM 関数は選択された行ごとに評価されるため、索引列の条件として RANDOM
関数が組み込まれると、結果として全 AMP 操作になります。
たとえば、次のテーブル定義の場合を考えてみましょう。
CREATE TABLE t1
(c1 INTEGER
,c2 VARCHAR(9))
PRIMARY INDEX ( c1 );
次の SELECT 文は、結果として全 AMP 操作になります。
SELECT *
FROM t1
WHERE c1 = RANDOM(1,12);
例: 乱数の整数を結果として返す
sales_table という名前のテーブルに、以下のような列のサブセットがあるとします。
Store_ID
Product_ID
Sales
1003
C
20000
1002
C
35000
1001
C
60000
1002
D
50000
1003
D
50000
1001
D
35000
1001
A
100000
1002
A
40000
SQL 関数、演算子、式および述部
119
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
Store_ID
Product_ID
Sales
1001
E
30000
以下の SELECT 文は、結果行の各行ごとに 1~3 の範囲の乱数を戻します。
SELECT store_id, product_id, sales, RANDOM(1,3)
FROM sales_table;
結果テーブルは、たとえば以下のようなものになります。
Store_ID
Product_ID
Sales
RANDOM(1,3)
1003
C
20000
1
1002
C
35000
2
1001
C
60000
2
1002
D
50000
3
1003
D
50000
2
1001
D
35000
3
1001
A
100000
2
1002
A
40000
1
1001
E
30000
2
関連トピック
詳細は、以下を参照してください。
• SQL データ型とリテラル、B035-1143
RANGE_N
目的
式を評価して、指定範囲のリストのうちの 1 つに結果をマップしてから、リスト内
に範囲の位置を戻します。
120
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
構文
RANGE_N
A
( test_expression
start_expression
*
A
BETWEEN
AND
end_expression
AND
*
end_expression
B
EACH
range_size
*
| range_list |
B
)
,
NO RANGE
OR UNKNOWN
, UNKNOWN
UNKNOWN
range_list
C
start_expression
AND
end_expression
AND
end_expression
EACH
range_size
*
D
C
,
start_expression
AND
D
,
start_expression
AND
end_expression
EACH
range_size
EACH
range_size
end_expression
*
構文要素
test_expression
BYTEINT、SMALLINT、INTEGER、DATE、CHAR、VARCHAR、GRAPHIC、または
VARGRAPHIC データ型となる式。
start_expression
*
範囲の開始境界を定義するリテラルまたはリテラル式。
start_expression のデータ型は test_expression のデータ型と同じにする必要があり
ます。または、test_expression と同じデータ型に暗黙的にキャストする必要があり
ます。
終了境界を指定しない場合、範囲はその開始境界(この境界は範囲に含まれます)か
ら次の範囲の開始境界(この境界は範囲に含まれません)までと定義されます。
リスト内の最初の範囲の開始境界にアスタリスク( * )を使用して、使用可能な最小
値(すべての値と NULL は、アスタリスクで指定された開始境界より大きくなりま
す)を示します。アスタリスクは、どのデータ タイプとも互換性があります。
SQL 関数、演算子、式および述部
121
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
end_expression
*
範囲の終了境界を定義するリテラルまたはリテラル式。
end_expression のデータ型は test_expression のデータ型と同じにする必要がありま
す。または、test_expression と同じデータ型に暗黙的にキャストする必要があります。
リスト内の最後の範囲では、終了境界を指定しなければなりません。それ以外の範
囲については、終了境界値を指定しない場合、範囲はその開始境界値から(この開始
境界値は範囲に含まれます)次の範囲の開始境界値まで(この開始境界値は範囲に含ま
れません)と定義されます。
リスト内の最後の範囲の終了境界にはアスタリスク( * )を使用して、使用可能な最大
値(すべての値と NULL は、アスタリスクで指定された終了境界より小さくなりま
す)を示します。
EACH range_size
値が 0 より大きいリテラルまたはリテラル式。
EACH 句を指定する範囲は一連の範囲に等しくなります。ここで、その一連の中の
最初の範囲は start_expression から始まり、それに続く範囲は start_expression +
(range_size * n)から始まります。ここで、n は 1 から始まり、start_expression +
(range_size * n)が end_expression 以下であるか、または範囲リスト内の次の
start_expression より小さい間は 1 つずつ増えます。
DATE タイプの場合、後続範囲内の有効な日付を計算する際には、+算術演算子では
なく ADD_MONTHS を使用します。
range_size のデータ型は、test_expression への追加のために互換性がなければなり
ません。
注: test_expression のデータ型が文字データ型(CHAR、VARCHAR、GRAPHIC、また
は VARGRAPHIC)の場合は、EACH 句を指定できません。
NO RANGE
どの指定範囲にもマップされない test_expression を処理する範囲。
OR UNKNOWN
NO RANGE とともに使用します。
どの指定範囲にもマップされない test_expression や、RANGE_N が範囲 BETWEEN
* AND *を指定しない場合に NULL と評価される test_expression は、NO RANGE OR
UNKNOWN が処理します。
UNKNOWN
RANGE_N が範囲 BETWEEN * AND *を指定しない場合に NULL と評価される
test_expression を処理します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
122
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
範囲の定義
範囲は、開始境界とオプションの終了境界で定義されます。終了境界を指定しない
場合の範囲は、その開始境界(この境界を含む)から次の範囲の開始境界(この境界を
含まない)までと定義されます。
範囲リストは範囲を昇順で指定しなければなりません。その範囲の終了境界は次の
範囲の開始境界の手前までとなります。
評価
RANGE_N は test_expression を評価して、結果が範囲リスト中の範囲内に収まるか
どうかを判断します。最初の範囲の位置は 1 になり、それに続く範囲の位置は n を
上限として 1 ずつ増加します。n は範囲の合計数です。
条件
結果
test_expression RANGE_N から範囲の位置が戻されます。
の結果は範囲内に
収まります
test_expression
の結果は NULL
です
RANGE_N に以下のうちの 1 つを指定しない場合。
• BETWEEN * AND *
• UNKNOWN
• NO RANGE OR UNKNOWN
RANGE_N は NULL を戻します。
RANGE_N に範囲 BETWEEN * AND *を指定した場合、NO RANGE、NO
RANGE OR UNKNOWN、UNKNOWN のどれを指定しても、RANGE_N は
1 を返します。
RANGE_N に範囲 BETWEEN * AND *を指定しない場合。
• NO RANGE OR UNKNOWN を指定した場合、RANGE_N は n + 1 を返
します。
• UNKNOWN を指定し、NO RANGE を指定しない場合、RANGE_N は
n + 1 を返します。
• NO RANGE と UNKNOWN を指定した場合、RANGE_N は n + 2 を返
します。
test_expression NO RANGE または NO RANGE OR UNKNOWN を指定した場合、
は、リスト内のど RANGE_N は n + 1 を返します。
の範囲からも外れ
NO RANGE も NO RANGE OR UNKNOWN も指定しない場合、RANGE_N
ています
は NULL を返します。
結果のタイプと属性
RANGE_N のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER データ タイプのデフォルト書式
<RANGE_N 関数>
SQL 関数、演算子、式および述部
123
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、B035-1143>
を参照してください。
パーティション基本索引を定義するための RANGE_N の使用
テーブルの基本索引または結合索引は、各 AMP に対するそのテーブルのデータまた
は結合索引の分散およびその検索を制御します。基本索引がパーティション基本索
引(PPI)である場合、AMP 上のユーザー定義のパーティションに対してデータを割り
当てることができます。
テーブルの基本索引または結合索引を定義するには、PRIMARY INDEX 句を CREATE
TABLE または CREATE JOIN INDEX データ定義文に指定します。パーティション基
本索引を定義するには、基本索引の定義時に PARTITION BY 句を組み込みます。
PARTITION BY 句には、行のパーティション割り当てを決定する 1 つ以上のパーティ
ション化式が必要です。RANGE_N を使って、パーティション化列において何らかの
値または NULL をもつ行がいずれかのパーティションに割り当てられるようにパー
ティション化式を構築することができます。
また、CASE_N を使ってパーティション化列を構築することもできます 。詳細は、
CASE N を参照してください。
PARTITION BY 句がパーティション化式のリストを指定する場合、PPI はマルチレベ
ル PPI であり、1 つのレベルの各パーティションはリスト内の次のパーティション
化式に従ってサブパーティション化されます。有効な SQL 式(例外もあり)から成る
単一レベルの PPI のパーティション化式とは異なり、マルチレベル PPI のパーティ
ション化式のリスト内の各式は、CASE_N 関数または RANGE_N 関数でなければなり
ません。
CURRENT_DATE または CURRENT_TIMESTAMP を指定した RANGE_N を PPI で使用する
方法
ビルトイン関数の CURRENT_DATE または CURRENT_TIMESTAMP を指定した
RANGE_N を使用して、パーティション式を定義できます。データを 1 つ以上の現在
のパーティションと、1 つ以上の履歴のパーティションとしてパーティション化す
る必要があるときに、現在および履歴のパーティションが、パーティション式内で
解決される CURRENT_DATE または CURRENT_TIMESTAMP に基づく場合は、パー
ティション式内で CURRENT_DATE または CURRENT_TIMESTAMP を使用すること
が最適になります。これにより、ALTER TABLE DROP/ADD RANGE を実行する度に
決定しなければならない明示的な日付を使用したパーティションの再定義の代わり
に、古いデータを現在のパーティションから 1 つ以上の履歴のパーティションに移
動する、定期的なテーブルの調整が可能になります。
詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>の「更新可能日付
および更新可能タイムスタンプに基づく RANGE_N パーティション式の最適化を調
整するルール」を参照してください。
文字データを指定した RANGE_N の使用
RANGE_N 関数内では、test_expression や範囲の境界として、文字式(CHAR、
VARCHAR、GRAPHIC または VARGRAPHIC)を指定できます。適用される使用上の規
則は、次のとおりです。
124
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
• RANGE_N パーティション式には、UPPERCASE 修飾子と、次に示す関数を使用
できます: LOWER、UPPER、TRANSLATE、TRIM、VARGRAPHIC、INDEX、
MINDEX、POSITION、TRANSLATE_CHK、CHAR2HEXINT。
• test_expression が文字データ型の場合は、EACH 句を指定できません。
• RANGE_N 式内で参照する文字列定数は、31,000 バイト未満にする必要がありま
す。
• test_expression が文字データ型であり、いずれかの範囲の境界の長さ(後続の埋
め込み文字を除く)が、test_expression の長さよりも長い場合、エラーが返され
ます。
• 文字の RANGE_N でパーティション化する場合は、範囲の昇順がセッションの照
合と、test_expression のケース指定によって異なります。例えば、
test_expression が、NOT CASESPECIFIC 式と、ケース指定修飾子
(CASESPECIFIC、NOT CASESPECIFIC)のないリテラルの組み合わせならば、ANSI
モードのセッションではケース指定が CASESPECIFIC になり、Teradata モードの
セッションでは NOT CASESPECIFIC になります。
注: グラフィック文字データが関与する文字列比較は、すべてケース指定になり
ます。
• 指定した範囲のいずれかが、NULL 境界で定義されていてる場合や、昇順になっ
ていない場合、または部分的に重なる場合には、エラーが返されます。文字のテ
スト値の昇順は、セッションの照合と、test_expression のケース指定によって異
なります。
• 列の参照とリテラルの大文字/小文字の区別は、セッションのデフォルト、明
示的な CAST、またはテーブルが作成されたときの CREATE TABLE 文の指定内
容によって決まります。列には CASESPECIFIC または NOT CASESPECIFIC を
明示的に指定できます。また、それらの修飾子で定数式を CAST できます。
明示的な指定がないときに、Teradata セッションのトランザクション セマン
ティクスが有効な場合には、NOT CASESPECIFIC が使用されます。ANSI セッ
ションのトランザクション セマンティクスが有効な場合には、CASESPECIFIC
がデフォルトになります。
例えば、条件式が、NOT CASESPECIFIC 式と、大文字/小文字の区別修飾子
(CASESPECIFIC、NOT CASESPECIFIC)のない定数の組み合わせならば、ANSI
モードのセッションでは大文字/小文字の区別が CASESENSITIVE になり、
Teradata モードのセッションでは CASEBLIND になります。
グラフィック データが関わる文字列比較では、すべて大文字と小文字が区別
されます。
• 文字比較演算子(=、<、>、<=、>=、<>、BETWEEN、LIKE)では、文字列定数が比
較対象の列データよりも短い場合、その文字列定数は埋め込み文字が埋め込まれ
ているものとして扱われます。埋め込み文字(例えば、<スペース> 文字)は、文字
セットに固有なものになります。そのため、文字の test_expression が、文字範
囲の境界よりも長い長さで定義されていると、その範囲の境界と test _expression
の比較は、範囲の境界が埋め込み文字で埋め込まれているものとして動作します。
埋め込み文字は、照合内の最小コード ポイントとして照合されないことがあり
ます。範囲の境界の長さが n の場合に、その範囲の境界と test_expression が最
初の n 文字まで完全に一致していても、n+1 の位置に埋め込み文字よりも小さく
照合される文字が含まれていると、その test_expression は範囲の境界よりも小
さいと照合されます。「例」を参照してください。
SQL 関数、演算子、式および述部
125
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
制約事項
RANGE_N が PARTITION BY 句で使用される場合、以下のような制限が適用されます。
• 最大 65,533 の範囲を指定できる(大きなパーティション化式の一部でない場合)。
• システム派生列の PARTITION または PARTITION#L1 から PARTITION#L15 を含
めてはいけません。
• PERIOD データ タイプを使用してはいけません。ただし、結果が DATE データ タ
イプになれば、BEGIN 境界関数または END 境界関数を PERIOD データ タイプの
列に対して使用することはできます。
RANGE_N がマルチレベル PPI のパーティション化式で使用される場合は、少なくと
も 2 つのパーティションを定義する必要があります。
パーティション式で RANGE_N が CURRENT_DATE または CURRENT_TIMESTAMP
を指定している場合は、ALTER TABLE を使用してテーブルの範囲を追加または削除
することはできません。この機能を実現するには、ALTER TABLE TO CURRENT 文を
使用する必要があります。
テスト式としての UDT の使用
test_expression は、結果が UDT データ型になる式であってはいけません。RANG_N
を使用して PPI を定義するときにこれが発生すると、エラーが報告されます。PPI
の定義に RANGE_N を使用しない場合は、暗黙の変換に頼らず、BYTEINT、
SMALLINT、INTEGER、DATE、CHAR、VARCHAR、GRAPHIC、または
VARGRAPHIC となるように、式を明示的にキャストしてください。
例
例 1: 行を割り当てることが可能な 4 つのパーティションの指定
以下は、RANGE_N と totalorders 列の値を使って行の割り当て先のパーティション
を定義する例です。
CREATE TABLE orders
(storeid INTEGER NOT NULL
,productid INTEGER NOT NULL
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL
,totalorders INTEGER)
PRIMARY INDEX (storeid, productid)
PARTITION BY RANGE_N(totalorders BETWEEN *, 100, 1000 AND *,
UNKNOWN);
この例では、RANGE_N は totalorders 列の値に基づいて、行の割り当て先となる 4
つのパーティションを指定します。
パーティ
条件
ション番号
126
1
totalorders 列の値は 100 より小さい。
2
totalorders 列の値は 1000 より小さいが、100 以上である。
3
totalorders 列の値は 1000 以上である。
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
パーティ
条件
ション番号
4
totalorders 列は NULL であるため、範囲は UNKNOWN となります。
例 2: パーティション式のリストでの RANGE_N の使用
以下の例では、「例」を変更して、マルチレベル PPI を定義するパーティション化
式のリストで RANGE_N を使用しています。
CREATE TABLE orders
(storeid INTEGER NOT NULL
,productid INTEGER NOT NULL
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL
,totalorders INTEGER NOT NULL)
PRIMARY INDEX (storeid, productid)
PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *)
,RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) );
この例では、行が割り当てられる 6 つのパーティションが定義されています。最初
の RANGE_N 式は、totalorders 列の値に基づいて 3 つのパーティションを定義して
います。2 番目の RANGE_N 式は、orderdate 列の値に基づいて 3 つのパーティショ
ンをそれぞれ 2 つのパーティションに再分割しています。
レベル 1
パーティ
ション
番号
レベル 2 条件
パーティ
ション
番号
1
1
totalorders 列の値は 100 より小さく、orderdate 列の値は
'2005-12-31'より小さい。
2
totalorders 列の値は 100 より小さく、orderdate 列の値は
'2005-12-31'より大きいか等しい。
1
totalorders 列の値は 1000 より小さく、100 より大きいか等しい。
orderdate 列の値は'2005-12-31'より小さい。
2
totalorders 列の値は 1000 より小さく、100 より大きいか等しい。
orderdate 列の値は'2005-12-31'より大きいか等しい。
1
totalorders 列の値は 1000 より大きいか等しく、orderdate 列の値は
'2005-12-31'より小さい。
2
totalorders 列の値は 1000 より大きいか等しく、orderdate 列の値は
'2005-12-31'より大きいか等しい。
2
3
例 3: 1 つのパーティションを指定するパーティション基本索引の定義
以下に、NULL を含めた totalorders 列の任意の値について、行の割り当て先の 1 つ
のパーティションを指定するパーティション基本索引を定義する例を示します 。
CREATE TABLE orders
(storeid INTEGER NOT NULL
,productid INTEGER NOT NULL
,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL
,totalorders INTEGER)
SQL 関数、演算子、式および述部
127
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
PRIMARY INDEX (storeid, productid)
PARTITION BY RANGE_N(totalorders BETWEEN * AND *);
例 4: RANGE_N 式を使ってテーブルがパーティション化されている場合の各パーティショ
ンの行数をカウントする
以下の例は、RANGE_N 式を使ってテーブルがパーティション化された場合の各パー
ティション内の行カウントを示します。
CREATE TABLE orders
(orderkey INTEGER NOT NULL
,custkey INTEGER
,orderdate DATE FORMAT 'yyyy-mm-dd')
PRIMARY INDEX (orderkey);
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
orders
orders
orders
orders
orders
orders
orders
orders
orders
orders
(1,
(2,
(3,
(4,
(5,
(6,
(7,
(8,
(9,
(10,
100,
100,
109,
101,
100,
109,
101,
101,
111,
111,
'1998-01-01');
'1998-04-01');
'1998-04-01');
'1998-04-10');
'1998-07-01');
'1998-07-10');
'1998-08-01');
'1998-12-01');
'1999-01-01');
NULL);
以下の SELECT 文中の RANGE_N 式は、EACH 句を使って一連の 12 個の範囲を定義
しています。ただし最初の範囲は'1998-01-01'から開始し、その後に続く範囲は、
1 ヶ月ずつの間隔で順番に増加し、開始境界を含みます。
SELECT COUNT(*),
RANGE_N(orderdate
BETWEEN DATE '1998-01-01' AND DATE '1998-12-31'
EACH INTERVAL '1' MONTH
) AS Partition_Number
FROM orders
GROUP BY Partition_Number
ORDER BY Partition_Number;
結果は次のようになります。
Count(*) Partition_Number
----------- ---------------2
?
1
1
3
4
2
7
1
8
1
12
例 5: RANGE_N 式を使ったテーブルのパーティション化
次の例では、パーティション化を指定してテーブルを作成します。このパーティショ
ン化の定義には、END 境界関数が関与する RANGE_N 式を使用します。テーブルに
128
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
は、それぞれのパーティションが各年の販売履歴を表わす 10 個のパーティション
が作成されます。
CREATE TABLE SalesHistory
(product_code CHAR (8),
quantity_sold INTEGER,
transaction_period PERIOD (DATE))
PRIMARY INDEX (product_code)
PARTITION BY
RANGE_N (END (transaction_period) BETWEEN date'2006-01-01'
AND date '2015-12-31' EACH INTERVAL'1' YEAR);
次の SELECT 文は、2010 年よりも前の販売履歴の 5 つのパーティションをスキャ
ンします。
SELECT *
FROM SalesHistory
WHERE transaction_period < period (date'2010-01-01');
例 6: Start_expression と CURRENT_DATE
CURRENT_DATE または CURRENT_TIMESTAMP が、RANGE_N 内の最初の範囲で
ある start_expression に指定されている場合、CURRENT_DATE または
CURRENT_TIMESTAMP で改めて解決された start_expression がパーティション境
界と一致すると、一致したパーティションより前のすべてのパーティションが削除
されます。それ以外の場合は、新しいパーティション式でテーブル全体が再パーティ
ション化されます。
次の CREATE TABLE 文が、2006 年 4 月 1 日に実行されたとします。
CREATE TABLE ppi (i INT, j DATE)
PRIMARY INDEX (i)
PARTITION BY
RANGE_N (j BETWEEN CURRENT_DATE AND
CURRENT_DATE + INTERVAL '1' YEAR - INTERVAL '1' DAY
EACH INTERVAL '1' MONTH);
最後に解決された日付は、2006 年 4 月 1 日になります。ALTER TABLE TO
CURRENT 文を 2006 年 6 月 1 日に実行すると、start_expression は、改めて
CURRENT_DATE('2006-06-01')に解決されます。これは、3 番目のパーティション
境界と一致します。そのため、パーティション 1 と 2 は削除され、最後に調整され
た日付は、改めて解決された CURRENT_DATE に設定されます。
ただし、ALTER TABLE TO CURRENT 文を 2006 年 6 月 1 日ではなく、2006 年 6
月 10 日に実行したとすると、start_expression は改めて
CURRENT_DATE('2006-06-10')に解決され、パーティション境界と一致しなくなり
ます。そのため、すべての行がスキャンされ、それらの行は新しいパーティション
式に基づいて再パーティション化されます。この文の後のパーティション境界は、
それまでの月の最初の日ではなく、月の 10 日目に揃えられます。
例 7: 履歴を記録するためのテーブルのパーティション化
次のテーブル定義は、2007 年(この時点で、現在の年)に作成されています。テーブ
ルは、5 年間分の注文履歴と、現在および将来のそれぞれ 1 年分の注文を記録する
ためにパーティション化されます。
SQL 関数、演算子、式および述部
129
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
CREATE TABLE Orders
(o_orderkey INTEGER NOT NULL,
o_custkey INTEGER,
o_orderstatus CHAR(1) CASESPECIFIC,
o_totalprice DECIMAL(13,2) NOT NULL,
o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
o_orderpriority CHAR(21),
o_comment VARCHAR(79))
PRIMARY INDEX (o_orderkey)
PARTITION BY RANGE_N(
o_orderdate BETWEEN DATE '2002-01-01' AND DATE '2008-12-31'
EACH INTERVAL '1' MONTH)
UNIQUE INDEX (o_orderkey);
2008 年に、以前と同じように、5 年間分の履歴と、現在および将来のそれぞれ 1 年
間分の記録を保守するためにテーブルを変更しようと考えたときには、次の文を
2008 年に実行します。
ALTER TABLE Orders MODIFY PRIMARY INDEX (o_orderkey)
DROP RANGE WHERE PARTITION BETWEEN 1 AND 12
ADD RANGE BETWEEN DATE '2009-01-01' AND DATE '2009-12-31'
EACH INTERVAL '1' MONTH
WITH DELETE;
この場合、新しい日付を計算して、その日付を明示的に ADD RANGE 句に指定する
必要があります。これでは、この文を実行する年ごとに手動の介入が必要になって
しまいます。
それとは別に、CURRENT_DATE を使用して、次に示すようにテーブルを定義できま
す。これにより、パーティションの変更が容易になります。
CREATE TABLE Orders
(o_orderkey INTEGER NOT NULL,
o_custkey INTEGER,
o_orderstatus CHAR(1) CASESPECIFIC,
o_totalprice DECIMAL(13,2) NOT NULL,
o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
o_orderpriority CHAR(21),
o_comment VARCHAR(79))
PRIMARY INDEX (o_orderkey)
PARTITION BY RANGE_N(o_orderdate BETWEEN
CAST(((EXTRACT(YEAR FROM CURRENT_DATE)-5-1900)*10000+0101) AS DATE)
AND
CAST(((EXTRACT(YEAR FROM CURRENT_DATE)+1-1900)*10000+1231) AS DATE)
EACH INTERVAL '1' MONTH)
UNIQUE INDEX (o_orderkey);
次の ALTER TABLE 文を毎年実行するように、スケジュールすることができます。こ
の文は、パーティションの削除と追加を効率的に実行して、パーティションのウィ
ンドウを前方に進めます。
ALTER TABLE Orders TO CURRENT WITH DELETE;
CURRENT_DATE を使用することで、新しい日付に基づいてデータを再パーティショ
ン化しようとしたときに、ALTER TABLE 文を毎回修正する必要がなくなります。
130
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
どちらの場合も、年境界でパーティション化が開始されます。最初の例では、これ
を ALTER TABLE 文が変更することはありません。そのため、パーティション化は
年境界で開始され続けます。ただし、別の境界で開始するようにパーティション化
を変更する、ALTER TABLE 文の指定は可能です。たとえば、ALTER TABLE 文に希
望の日付を指定すると、ある年の特定の月に開始するようにロール フォワードでき
ます。
CURRENT_DATE を使用する 2 番目の例では、年境界で開始するロール フォワード
のみ可能です。ただし、この例を変更すると、月初めに開始するロール フォワード
にパーティション化を使用できるようになります。この例では、CREATE TABLE の
日付を起点として、Orders テーブルに過去 71 カ月分の履歴と、今月および将来の
12 カ月分(合計 84 カ月)の記録を格納することを想定しています。
CREATE TABLE Orders
(o_orderkey INTEGER NOT NULL,
o_custkey INTEGER,
o_orderstatus CHAR(1) CASESPECIFIC,
o_totalprice DECIMAL(13,2) NOT NULL,
o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
o_orderpriority CHAR(21),
o_comment VARCHAR(79))
PRIMARY INDEX (o_orderkey)
PARTITION BY RANGE_N(o_orderdate BETWEEN
CAST(((EXTRACT(YEAR FROM CURRENT_DATE)-1900)*10000 +
EXTRACT(MONTH FROM CURRENT_DATE)*100 + 01) AS DATE) INTERVAL '71' MONTH
AND
CAST(((EXTRACT(YEAR FROM CURRENT_DATE)+1-1900)*10000 +
EXTRACT(MONTH FROM CURRENT_DATE)*100 + 01) AS DATE)+
INTERVAL '13' MONTH - INTERVAL '1' DAY
EACH INTERVAL '1' MONTH)
UNIQUE INDEX (o_orderkey);
次の ALTER TABLE 文を、毎月またはそれより少ない(ただし、将来の月を越えな
い)頻度で実行するようにスケジュールできます。この文は、Orders テーブルに過
去 71 カ月の履歴と、現在の月、将来の 12 カ月の記録が含まれ続けるように、パー
ティションの削除と追加を実行してパーティションのウィンドウを先に進めます 。
ALTER TABLE Orders TO CURRENT WITH DELETE;
次に示す、より単純なパーティション化を定義できますが、これは最適化されない
ことがあり、ALTER TABLE TO CURRENT 文を実行すると、調整のためにテーブル
全体がスキャンされる可能性があります。この例では、CREATE TABLE の日付を起
点として、Orders テーブルには約 2,191 日分の履歴と、今日と将来の 356 日分(合
計、約 7 年)の記録を格納することを想定しています。
CREATE TABLE Orders
(o_orderkey INTEGER NOT NULL,
o_custkey INTEGER,
o_orderstatus CHAR(1) CASESPECIFIC,
o_totalprice DECIMAL(13,2) NOT NULL,
o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
o_orderpriority CHAR(21),
o_comment VARCHAR(79))
PRIMARY INDEX (o_orderkey)
SQL 関数、演算子、式および述部
131
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
PARTITION BY RANGE_N(o_orderdate BETWEEN
CURRENT_DATE - INTERVAL '6' YEAR
AND
CURRENT_DATE + INTERVAL '1' YEAR
EACH INTERVAL '1' MONTH)
UNIQUE INDEX (o_orderkey);
次の ALTER TABLE 文を、毎日またはそれより少ない(ただし、将来の日を越えない)
頻度で実行するようにスケジュールできます。この文は、CURRENT_DATE と、最後
に CREATE TABLE または ALTER TABLE TO CURRENT 文が実行された日付が同じ場
合にのみ、パーティションの削除と追加を実行してパーティションのウィンドウを
前進させます。それ以外の場合は、行を調整するために、テーブル全体がスキャン
されます。
ALTER TABLE Orders TO CURRENT WITH DELETE;
これは、最後に CREATE TABLE または ALTER TABLE TO CURRENT 文が実行された
日とは違う日に ALTER TABLE 文が実行された場合に、効率が非常に悪化することが
あります。パフォーマンスは、最後に解決された日付と改めて解決された日付の間
の日数が増えるほど悪化します。その理由は、移動しなければならない行の数が増
えるためです。
たとえば、最後に解決された日付が 2008 年 1 月 1 日で、その後の 2008 年 2 月 2
日に ALTER TABLE TO CURRENT 文が実行されたとすると、テーブル内のすべての
行が新しいパーティションに移動されることになります。
例 8: 範囲の定義
次の例では、5 つの範囲を定義しています。セッションの照合は ASCII です。
RANGE_N(animal BETWEEN *, 'ape', 'bird', 'bull' AND 'cow',
'dog' AND *, NO RANGE, UNKNOWN)
説明:
Range
Includes...
1
'ape'より小さいすべての値。
2
'ape'以上'bird'未満の文字列。
3
'bird'以上'bull'未満の文字列。
4
'bull'と'cow'の間の文字列。
5
'dog'以上の文字列。
animal の値が定義した範囲のいずれかと一致すると、RANGE_N は一致した範囲の
番号を返します。
animal の値が、'cow'より大きく'dog'よりも小さい場合には、どの範囲にも一致しま
せんが、NO RANGE が指定されているため、RANGE_N は 6 を返します。
animal の値が NULL の場合には、UNKNOWN が指定されているため、RANGE_N は
7 を返します。
例 9: 5 つの範囲の定義
次の例では、5 つの範囲を定義しています。セッションの照合は ASCII です。
132
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
RANGE_N
RANGE_N(animal BETWEEN *, 'ape', 'bird', 'bull' AND 'cow',
'dog' AND *, UNKNOWN)
説明:
Range
Includes...
1
'ape'より小さいすべての値。
2
'ape'以上'bird'未満の文字列。
3
'bird'以上'bull'未満の文字列。
4
'bull'と'cow'の間の文字列。
5
'dog'以上の文字列。
animal の値が定義した範囲のいずれかと一致すると、RANGE_N は一致した範囲の
番号を返します。
animal の値が、'cow'より大きく'dog'よりも小さい場合には、どの範囲にも一致し
ません。この場合、NO RANGE が指定されていないため、RANGE_N は NULL を返
します。
animal の値が NULL の場合には、UNKNOWN が指定されているため、RANGE_N は
6 を返します。
例 10: 2 つの範囲の定義
この例では、CREATE TABLE 文を実行しているときのセッションの照合は ASCII で
す。また、埋め込み文字は<スペース>です。この例では、2 つの範囲を定義してい
ます(番号 1 と 2)。
• 'a
'(a の後ろに 9 個のスペース)以上'b
'未満の値はパーティション 1 に
マップされます。
• 'b
'以上'c
'未満の値は、パーティション 2 にマップされます。
CREATE SET TABLE t2
(a VARCHAR(10) CHARACTER SET UNICODE NOT CASESPECIFIC,
b INTEGER)
PRIMARY INDEX (a)
PARTITION BY RANGE_N(a BETWEEN 'a','b' AND 'c');
以下の INSERT 文では、'b'と'1'の間に 1 つの<tab>文字が入る文字列を挿入します。
INSERT t2 ('b
1', 1);
以下の INSERT 文では、'b'と'1'の間に 1 つの<space>文字が入る文字列を挿入します。
INSERT t2 ('b 1', 2);
以下の SELECT 文は、INSERT 文の結果を示します。タブ文字はスペース文字よりも
コード ポイントが小さいため、最初に挿入された文字列はパーティション 1 にマッ
プされます。
SELECT PARTITION, a, b FROM t2 ORDER BY 1;
*** Query completed. 2 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
PARTITION a
b
----------- ------ -----
SQL 関数、演算子、式および述部
133
第 3 章 算術演算子/関数、三角関数、双曲線関数
ROUND
1
2
b 1
b 1
1
2
(string contains single <tab> character)
(string contains single <space> character)
関連トピック
詳細は、以下を参照してください。
• PPI のプロパティとパフォーマンスに関する考慮事項 、または PPI の考慮事項と
容量に関する計画の詳細については、<データベース設計、B035-1094>を参照し
てください。
• テーブルの PPI の指定の詳細については、<SQL データ定義言語 - 構文規則および
例、B035-1144>の「CREATE TABLE」を参照してください。
• 結合索引の PPI の指定の詳細については、<SQL データ定義言語 - 構文規則および
例、B035-1144>の「CREATE JOIN INDEX」を参照してください。
• テーブルの基本索引のパーティションの修正の詳細については 、<SQL データ定
義言語 - 構文規則および例、B035-1144>の「ALTER TABLE」を参照してください。
• 新規に解決された CURRENT_DATE 値と、CURRENT_TIMESTAMP 値に基づいた
パーティション化の調整の詳細については、<SQL データ定義言語 - 構文規則およ
び例、B035-1144>の「ALTER TABLE TO CURRENT」を参照してください。
• ADD_MONTHS について、詳細は ADD_MONTHS を参照してください。
ROUND
目的
小数点の右側または左側の桁位置 places_value で丸められた numeric_value を返し
ます。
構文
ROUND
( numeric_value
TD_SYSFNLIB.
)
, places_value
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
変換される数値式。
places_value
丸める桁位置。指定されていない場合、numeric_value は桁位置 0 で丸められます
(デフォルト)。
134
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
ROUND
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
ROUND は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_value = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• places_value = NUMBER
places_value 引数では、UDF に適用される暗黙のデータ型変換規則を使用して
INTEGER に変換できるデータ型の値も渡すことができます。numeric_value 引数に
ついては、暗黙の型変換はサポートされていません。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
結果のタイプ
結果のデータ型は、numeric_value 引数のデータ型と同じになります。
numeric_value のデータ型が DECIMAL/NUMERIC で精度が 38 未満の場合、返され
る DECIMAL/NUMERIC 値の精度は 1 だけ増分されます。例えば、DECIMAL(6,4)の
引数は DECIMAL(7,4)として返されます。精度が 38 の場合は、スケールが 1 だけ減
分されます(スケールが 0 でない場合)。例えば、DECIMAL(38,38)の引数は
DECIMAL(38,37)として返されます。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
使用上の注意
ROUND は次のように機能します。
places_value が正の場合、小数点の右側の桁位置 places_value で丸めます。
places_value が負の場合、小数点の左側の桁位置 places_value で丸めます。
places_value がゼロまたは省略されている場合、桁位置 0 で丸めます。
numeric_value または places_value が NULL の場合、この関数は NULL を返しま
す。
• ROUND は、ゼロから進めた先の桁の値を、その次の桁の値が 5 以上のときに切
り上げます。
•
•
•
•
SQL 関数、演算子、式および述部
135
第 3 章 算術演算子/関数、三角関数、双曲線関数
ROUND
注: 丸めの動作は、常に上記の公式に従います。これは、DBS 制御レコードの
RoundHalfWayMagUp フィールドには影響されません。つまり、丸めの動作は、
RoundHalfWayMagUp フィールドが常に TRUE に設定されているものとして機能す
るということです。
例
例 1: 結果 32.4000 を返す問合わせを行なう
以下の問合わせは結果として 32.4000 を返します。
SELECT ROUND(32.4467, 1);
例 2: 結果 32.4600 を返す問合わせを行なう
以下の問合わせは結果として 32.4600 を返します。
SELECT ROUND(32.4567, 2);
例 3: 結果 100.0000 を返す問合わせを行なう
以下の問合わせは結果として 100.0000 を返します。
SELECT ROUND(99.9999, 3);
例 4: 結果 30.0000 を返す問合わせを行なう
以下の問合わせは結果として 30.0000 を返します。
SELECT ROUND(32.4567, -1);
例 5: 結果 100.0000 を返す問合わせを行なう
以下の問合わせは結果として 100.0000 を返します。
SELECT ROUND(55.4567, -2);
例 6: 結果 0.0000 を返す問合わせを行なう
以下の問合わせは結果として 0.0000 を返します。
SELECT ROUND(55.4567, -3);
例 7: 結果-5.00 を返す問合わせを行なう
以下の問合わせは結果として-5.00 を返します。
SELECT ROUND(-5.35, 0);
例 8: 結果-6.00 を返す問合わせを行なう
以下の問合わせは結果として-6.00 を返します。
SELECT ROUND(-5.55, 0);
136
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
SIGN
関連トピック
詳細は、以下を参照してください。
•
•
•
•
SQL 外部ルーチン プログラミング、B035-1147
「埋め込みサービス システム関数 」
SQL データ型とリテラル、B035-1143
SQL 外部ルーチン プログラミング、B035-1147
SIGN
目的
numeric_value の符号を返します。
構文
SIGN
( numeric_value )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
SIGN は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と呼
び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、または NUMBER
SQL 関数、演算子、式および述部
137
第 3 章 算術演算子/関数、三角関数、双曲線関数
SIGN
結果のタイプ
結果のデータ タイプは NUMBER です。
NUMBER の、デフォルトのデータ タイプ書式については、< SQL データ型とリテラ
ル、B035-1143>を参照してください。
使用上の注意
FLOAT/REAL/DOUBLE PRECISION 以外の数値タイプの場合、SIGN は以下を返しま
す。
• numeric_value が< 0 の場合、-1 が返されます。
• numeric_value = 0 の場合は、0 が返されます。
• numeric_value が >0 の場合、1 が返されます。
FLOAT/REAL/DOUBLE PRECISION の場合、SIGN は以下を返します。
• numeric_value が< 0 の場合、-1 が返されます。
• numeric_value が>= 0 の場合、1 が返されます。
入力引数が NULL の場合、この関数は NULL を返します。
例
例 1: SELECT SIGN(-2);の問合わせ
以下の問合わせは結果として-1 を返します。
SELECT SIGN(-2);
例 2: 値が整数で 0 に等しい場合の結果の問合わせ
次の問合わせは、結果 0 を返します。これは、値が整数であり 0 と等しいためです。
SELECT SIGN(CAST(0 AS INTEGER));
例 3: データ型が FLOAT で値が 0 以上の場合の結果の問合わせ
次の問合わせは結果 1 を返します。これは、データ型が FLOAT であり、値が 0 以上
だからです。
SELECT SIGN(CAST(0 as FLOAT));
例 4: SELECT SIGN(3.74);の問合わせ
以下の問合わせは結果として 1 を返します。
SELECT SIGN(3.74);
関連トピック
詳細は、以下を参照してください。
• 「埋め込みサービス システム関数 」
138
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
SQRT
• SQL データ型とリテラル、B035-1143
SQRT
目的
引数の平方根を計算します。
構文
SQRT
( arg )
構文要素
arg
正数、数値引数。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
SQRT(arg)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
FLOAT
FLOAT のデフォルト書式
SQRT(arg)
引数のタイプと規則
arg は、FLOAT でない場合は暗黙の型変換規則に基づいて FLOAT に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙
的な型の変換を参照してください。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• SQRT を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
SQL 関数、演算子、式および述部
139
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRUNC
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<ユーティリティ 、B035-1102>を参照してください。
次のタイプの引数に SQRT を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: 典型的な SQRT 算術関数式
主な SQRT 算術関数式とその結果の例を次に示します。
式
結果
SQRT(2)
1.41421356237309E+000
SQRT(-2)
エラー
関連トピック
詳細は、以下を参照してください。
•
•
•
•
「暗黙的な型の変換」
SQL データ定義言語 - 構文規則および例、B035-1144
ユーティリティ 、B035-1102
SQL データ型とリテラル、B035-1143
TRUNC
目的
小数点の右側または左側の桁位置 places_value で切り捨てられた numeric_value を
返します。
構文
TRUNC
( numeric_value
TD_SYSFNLIB.
)
, places_value
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
変換される数値式。
140
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRUNC
places_value
切り捨てる桁位置。指定されていない場合、numeric_value は桁位置 0 で切り捨て
られます(デフォルト)。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TRUNC は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_value = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• places_value = NUMBER
places_value 引数では、UDF に適用される暗黙のデータ型変換規則を使用して
INTEGER に変換できるデータ型の値も渡すことができます。numeric_value 引数に
ついては、暗黙の型変換はサポートされていません。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
結果のタイプ
結果のデータ型は、numeric_value 引数のデータ型と同じになります。例えば、
numeric_value のデータ型が DECIMAL/NUMERIC の場合、返されるタイプは、引数
numeric_value と同じ精度とスケールを持つ DECIMAL/NUMERIC になります。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
使用上の注意
TRUNC は次のように機能します。
• places_value が正の場合、小数点の右側の桁位置 places_value で切り捨てます。
• places_value が負の場合、小数点の左側の桁位置 places_value で切り捨てます(0
にします)。
• places_value がゼロまたは省略されている場合、桁位置 0 で切り捨てます。
SQL 関数、演算子、式および述部
141
第 3 章 算術演算子/関数、三角関数、双曲線関数
WIDTH BUCKET
• numeric_value または places_value が NULL の場合、この関数は NULL を返しま
す。
例: 問合わせにより、SELECT TRUNC を返す
以下の問合わせは結果として 32.4500 を返します。
SELECT TRUNC(32.4567, 2);
以下の問合わせは結果として 30.0000 を返します。
SELECT TRUNC(32.4567, -1);
関連トピック
詳細は、以下を参照してください。
• SQL 外部ルーチン プログラミング、B035-1147
• 「埋め込みサービス システム関数 」
• SQL データ型とリテラル、B035-1143
WIDTH BUCKET
目的
value_expression が割り当てられるパーティションの番号を戻します。
構文
WIDTH BUCKET
( value_expression, lower_bound, upper_bound, partition_count )
構文要素
value_expression
パーティション番号が返される値。
lower_bound
等しくパーティション化される値の範囲の下限。
upper_bound
等しくパーティション化される値の範囲の上限。
partition_count
作成されるパーティションの数。
この値はデフォルトでパーティションの幅も指定します。
142
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
WIDTH BUCKET
作成されるパーティション数は partition_count + 2 となります。パーティション 0
とパーティション partition_count + 1 は、上限と下限内に収まらない
value_expression の値になります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
WIDTH_BUCKET(x、l、u、y)のデータ タイプ、書式、およびタイトルは、次のよう
になります。
データ タイプ
書式
タイトル
INTEGER
INTEGER のデフォルト書式
Width_bucket(x, l, u, y)
引数のタイプと規則
WIDTH_BUCKET 引数に関する規則については、以下の表を参考にしてください。
データ タイプ
規則
数値
WIDTH_BUCKET では、引数として任意の数値データ
タイプを使用できます。引数 value_expression、
lower_bound、および upper_bound は、REAL に変換
されてから処理されます。partition_count 引数は、
INTEGER に変換されてから処理されます。
文字
WIDTH_BUCKET では、数値を表わす文字列を使用す
ることができ、その文字列は該当する数値タイプに変
換されます。
• TIME、TIMESTAMP または
PERIOD
• INTERVAL
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR
(サーバーの文字セットが
GRAPHIC の場合)
WIDTH_BUCKET では、これらのタイプの引数を使用
できません。
UDT
• 以下のいずれかの事前定義タイプに対する暗黙
CAST が UDT になければなりません。
数値
文字
DATE
SQL 関数、演算子、式および述部
143
第 3 章 算術演算子/関数、三角関数、双曲線関数
WIDTH BUCKET
データ タイプ
規則
UDT 用の暗黙 CAST を定義するには、CREATE
CAST 文を使用し、AS ASSIGNMENT 節を指定しま
す。CREATE CAST の詳細は、< SQL データ型とリ
テラル、B035-1143>を参照してください。
• WIDTH_BUCKET を含め、システム演算子および関
数用の UDT の暗黙の型変換は、ANSI SQL 規格の
Teradata 拡張機能です。この拡張を無効にするに
は、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを
TRUE に設定します。詳細は、<ユーティリティ 、
B035-1102>を参照してください。
引数を妥当なタイプに暗黙変換できない場合は、エラーが戻されます。暗黙タイプ
変換の詳細は、暗黙的な型の変換を参照してください。
規則
WIDTH_BUCKET には次の規則が適用されます。
• いずれかの引数が NULL の場合、結果も NULL になります。
• partition_count <=0、または partition_count > 2147483646 の場合、要求元にエ
ラーが戻されます。
• lower_bound = upper_bound の場合、要求元にエラーが戻されます。
• lower_bound < upper_bound の場合、以下の表の規則が適用されます。
条件
結果
value_expression < 0。
lower_bound
value_expression >= partition_count +1。
upper_bound
結果に指定されたデータ タイプでは結果を表現できない場合、エ
ラーが戻されます。
その他
以下の式以下になる最大の正確な数値。位取りは 0 です。
• lower_bound > upper_bound の場合、以下の表の規則が適用されます。
条件
結果
value_expression > 0.
lower_bound
value_expression <= partition_count +1。
upper_bound
結果に指定されたデータ タイプでは結果を表現できない場合、エ
ラーが戻されます。
その他
144
以下の式以下になる最小の正確な数値。位取りは 0 です。
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
WIDTH BUCKET
条件
結果
例: 範囲内における従業員の給与を示すヒストグラムの作成
給与が$70000 から$200000 の範囲の従業員すべての給与のヒストグラムを作成す
るとします。指定された範囲内の各パーティション(バケット)の幅は$32500 にな
ります。
従業員の給与テーブルに記録されている従業員は 8 人です。
salary
-------50000
150000
220000
199999
70000
70000
70000
120000
first_name
-----------William
Todd
Bob
Donald
Betty
James
Mary
Mary
last_name
----------Crawford
Crawford
Stone
Stone
Crawford
Crawford
Lee
Stone
次の SELECT 文を実行します。
SELECT salary, WIDTH_BUCKET(salary,70000,200000,4),COUNT(salary)
FROM emp_salary
GROUP BY 1
ORDER BY 1;
この文によって作成されるレポートは次のようになります。
salary
-------50000
70000
120000
150000
199999
220000
Width_bucket(salary,70000,200000,4)
-----------------------------------0
1
2
3
4
5
Count(salary)
---------------1
3
1
1
1
1
関連トピック
詳細は、以下を参照してください。
•
•
•
•
ユーティリティ 、B035-1102
「暗黙的な型の変換」
SQL データ定義言語 - 構文規則および例、B035-1144
SQL データ型とリテラル、B035-1143
SQL 関数、演算子、式および述部
145
第 3 章 算術演算子/関数、三角関数、双曲線関数
ZEROIFNULL
ZEROIFNULL
目的
NULL 結果が原因でエラーにならないように、データを NULL からゼロに変換します。
構文
ZEROIFNULL
( arg )
構文要素
arg
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
次の表に、ZEROIFNULL の結果のデフォルト属性を示します。
• オペランドが数値である場合、書式は arg と同じ書式です。
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先の事前定義タイプ
の書式です。
注: NULL キーワードのデータ タイプは INTEGER です。
引数のタイプと規則
arg の値
ZEROIFNULL から戻されるもの
非 null
数値引数の値
null またはゼロ
ゼロ
注: STRUCTURED 型 UDT 列の値が NULL
になるのは、NULL に設定された属性を
STRUCTURED 型 UDT インスタンスが持っ
ている場合ではなく、その列に明示的に
NULL を入れた場合だけです。
引数は、数値でない場合は暗黙のタイプ変換規則に従って数値に変換されます。引
数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙的
な型の変換を参照してください。
arg は文字列の場合は、FLOAT データ型の数値に変換されます。
146
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRIGONOMETRIC
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
• 数値
• 文字
• DATE
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• ZEROIFNULL を含め、システム演算子および関数用の UDT の暗黙の型変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御
レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定しま
す。詳細は、<ユーティリティ 、B035-1102>を参照してください。
次のタイプの引数に ZEROIFNULL を適用することはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: Salary 列が Null かどうかのテスト
この例では、Salary 列が null かどうかをテストすることができます。
SELECT empno, ZEROIFNULL(salary)
FROM employee ;
ゼロ以外の値が各従業員番号ごとに戻され、Salary 列には null が存在しないことを
示します。
関連トピック
NULL の検査に関係するさらに別の式については、以下を参照してください。
•
•
•
•
•
•
•
COALESCE 式
NULLIF 式
「NULLIFZERO」
SQL データ型とリテラル、B035-1143
ユーティリティ 、B035-1102
SQL データ定義言語 - 構文規則および例、B035-1144
暗黙的な型の変換
TRIGONOMETRIC
目的
引数の三角関数または逆三角関数を実行します。
SQL 関数、演算子、式および述部
147
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRIGONOMETRIC
構文
COS
( arg )
SIN
TAN
ACOS
ASIN
ATAN
ATAN2
( x, y )
構文要素
arg
ラジアン単位で角を表わす任意の有効な数値式。
x
逆正接計算で使用する点の x 座標。
y
逆正接計算で使用する点の y 座標。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
定義
148
関数
定義
逆余弦
逆余弦は、余弦が引数になる角のことです。
逆正弦
逆正弦は、正弦が引数になる角のことです。
逆正接
逆正接は、正接が引数になる角のことです。
余弦
角の余弦は、直角の 2 辺の比になります。この比は、角に接する辺の長さを斜
辺の長さで割ったものです。
正弦
角の正弦は、直角の 2 辺の比になります。この比は、角の対面にある辺の長さ
を斜辺の長さで割ったものです。
正接
角の正接は、直角の 2 辺の比になります。この比は、角の対面にある辺の長さ
を角に接する辺の長さで割ったものです。
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRIGONOMETRIC
結果のタイプと属性
次の表に、三角関数および逆三角関数の結果のデフォルトのデータ タイプ、書式、
およびタイトルを示します。
データ タイプ
書式
タイトル
FLOAT
FLOAT のデフォルト書式
Cos(arg)
Sin(arg)
Tan(arg)
ArcCos(arg)
ArcSin(arg)
ArcTan(arg)
Atan2(x,y)
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
結果値
関数
結果値
COS(arg)
-1 以上 1 以下のラジアン単位の arg の余弦。
SIN(arg)
-1 以上 1 以下のラジアン単位の arg の正弦。
TAN(arg)
ラジアン単位の arg の正接。
ACOS(arg)
0~π ラジアンの範囲の角。
ASIN(arg)
-π/2~π/2 ラジアンの範囲の角。
ATAN(arg)
-π/2~π/2 ラジアンの範囲の角。
ATAN2(x,y)
-π および π ラジアン(-π を除く)の範囲の角。
正の結果は、x 軸から左回りで見た角を表わします。負の結果は、右回りで
見た角を表わします。
ATAN2(x,y)では x を 0 にできるが ATAN(y/x)では x を 0 にできない(ゼロ除算
エラーになるため)ことを除き、ATAN2(x,y)は ATAN(y/x)と等しくなります。
x と y の両方が 0 の場合は、エラーが戻されます。
引数のタイプと規則
FLOAT でない引数は、暗黙のタイプ変換規則に基づいて FLOAT に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙
的な型の変換を参照してください。
引数が UDT である場合、以下の規則が適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりま
せん。
SQL 関数、演算子、式および述部
149
第 3 章 算術演算子/関数、三角関数、双曲線関数
TRIGONOMETRIC
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• 三角関数および逆三角関数を含め、システム演算子および関数用の UDT の暗黙の
型変換は、ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、
DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設
定します。詳細は、<ユーティリティ 、B035-1102>を参照してください。
三角関数および逆三角関数は、以下のタイプの引数を取ることはできません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: 典型的な関数式
以下は主な関数式と結果です。
式
結果
COS(5-4)
5.40302305868140E -001
SIN(LOG(0.5))
-2.96504042171437E -001
SIN(RADIANS(180.0))
1.22464679914735E-016
TAN(ABS(-3))
-1.42546543074278E -001
ACOS(-0.5)
2.09439510239320E 000
ASIN(1)
1.57079632679490E 000
ATAN(1+2)
1.24904577239825E 000
ATAN2(1,1)
7.85398163397448E -001
関連トピック
詳細は、以下を参照してください。
•
•
•
•
150
「暗黙的な型の変換」
SQL データ定義言語 - 構文規則および例、B035-1144
ユーティリティ 、B035-1102
SQL データ型とリテラル、B035-1143
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
DEGREES RADIANS
DEGREES RADIANS
目的
DEGREES は、ラジアン単位で指定された値を取り、この値を度(角度)に変換します。
RADIANS は、度(角度)単位で指定された値を取り、この値をラジアンに変換します。
構文
DEGREES
( arg )
RADIANS
構文要素
arg
変換される数値式。
• 関数が DEGREES である場合、arg はラジアン単位の角であると解釈されます。
• 関数が RADIANS である場合、arg は度(角度)単位の角であると解釈されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイトル
以下の表に DEGREES(arg)および RADIANS(arg)のデフォルト タイトルを示します。
関数
タイトル
DEGREES(arg)
(5.72957795130823E001*arg)
RADIANS(arg)
(1.74532925199433E-002*arg)
結果のタイプと書式
次に、DEGREES と RADIANS の結果のタイプと書式を示します。
• オペランドが数値である場合、書式は結果のデータ タイプのデフォルトの書式
です。
• オペランドが文字である場合、書式は FLOAT のデフォルトの書式です。
• オペランドが UDT である場合、書式は UDT の暗黙キャスト先の事前定義タイプ
のデフォルト書式です。
注: NULL キーワードのデータ タイプは INTEGER です。
データ タイプ書式については、< SQL データ型とリテラル、B035-1143>を参照し
てください。
SQL 関数、演算子、式および述部
151
第 3 章 算術演算子/関数、三角関数、双曲線関数
HYPERBOLIC
引数のタイプと規則
引数は、数値でない場合は暗黙のタイプ変換規則に基づいて数値に変換されます。
引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、暗黙
的な型の変換を参照してください。
arg は文字列の場合は、FLOAT データ型の数値に変換されます。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりませ
ん。
• 数値
• 文字
• 日時
• 間隔
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• DEGREES および RADIANS を含め、システム演算子および関数用の UDT の暗黙
の型変換は、ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするに
は、DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE
に設定します。詳細は、<ユーティリティ 、B035-1102>を参照してください。
DEGREES および RADIANS のいずれも、以下のタイプの引数には適用できません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
使用上の注意
DEGREES および RADIANS は、引数がラジアン単位で指定されることを求める SIN
および COS などの三角関数、およびラジアン単位で指定された値を戻す ASIN およ
び ACOS などの逆三角関数を処理する際に役立ちます。
例: 主な DEGREES および RADIANS 関数式
主な DEGREES および RADIANS 関数式とその結果の例を次に示します。
式
結果
SIN(RADIANS(60.0))
8.66025403784439E-001
DEGREES(1.0)
5.72957795130823E 001
HYPERBOLIC
目的
引数の双曲線関数または逆双曲線関数を実行します。
152
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
HYPERBOLIC
構文
COSH
( arg )
SINH
TANH
ACOSH
ASINH
ATANH
構文要素
arg
任意の実数。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
次の表に、双曲線関数および逆双曲線関数の結果のデフォルト属性を示します。
データ タイプ
書式
タイトル
FLOAT
FLOAT のデフォルト書式
Hyperbolic Cos(arg)
Hyperbolic Sin(arg)
Hyperbolic Tan(arg)
Hyperbolic ArcCos(arg)
Hyperbolic ArcSin(arg)
Hyperbolic ArcTan(arg)
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
結果値
関数
結果
COSH(arg)
arg の双曲余弦。
SINH(arg)
arg の双曲正弦。
TANH(arg)
arg の双曲正接。
ACOSH(arg)
arg の逆双曲余弦。逆双曲余弦は、双曲余弦が次の式を満たす数になる値
です。
acosh(cosh(arg)) = arg
SQL 関数、演算子、式および述部
153
第 3 章 算術演算子/関数、三角関数、双曲線関数
HYPERBOLIC
関数
結果
ASINH(arg)
arg の逆双曲正弦。逆双曲正弦は、双曲正弦が次の式を満たす数になる値
です。
asinh(sinh(arg)) = arg
ATANH(arg)
arg の逆双曲正接。逆双曲正接は、双曲正接が次の式を満たす数になる値
です。
atanh(tanh(arg)) = arg
引数のタイプと規則
arg は、FLOAT でない場合は暗黙の型変換規則に基づいて FLOAT 値に変換されま
す。引数を変換できない場合は、エラーが戻されます。暗黙タイプ変換の詳細は、
暗黙的な型の変換を参照してください。
arg が UDT である場合、以下のルールが適用されます。
• 以下のいずれかの事前定義タイプに対する暗黙 CAST が UDT になければなりませ
ん。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言
語 - 構文規則および例、B035-1144>を参照してください。
• 双曲線関数および逆双曲線関数を含めた、システム演算子および関数用の UDT の
暗黙の型変換は、ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にす
るには、DBS 制御レコードの DisableUDTImplCastForSysFuncOp フィールドを
TRUE に設定します。詳細は、<ユーティリティ 、B035-1102>を参照してくださ
い。
双曲線関数および逆双曲線関数は、以下のタイプの引数には適用できません。
• BYTE または VARBYTE
• BLOB または CLOB
• CHARACTER または VARCHAR (サーバーの文字セットが GRAPHIC の場合)
例: 典型的な双曲線関数式と逆双曲線関数式
以下は、主な双曲線関数および逆双曲線関数の式と結果です。
154
式
結果
COSH(EXP(1))
7.61012513866229E 000
SINH(1)
1.17520119364380E 000
TANH(0)
0E 000
ACOSH(3)
1.76274717403909E 000
ASINH(LOG(0.1))
-8.81373587019543E -001
ATANH(LN(0.5))
-8.53988047997524E -001
SQL 関数、演算子、式および述部
第 3 章 算術演算子/関数、三角関数、双曲線関数
HYPERBOLIC
関連トピック
詳細は、以下を参照してください。
•
•
•
•
暗黙的な型の変換
ユーティリティ 、B035-1102
SQL データ定義言語 - 構文規則および例、B035-1144
SQL データ型とリテラル、B035-1143
SQL 関数、演算子、式および述部
155
第 3 章 算術演算子/関数、三角関数、双曲線関数
HYPERBOLIC
156
SQL 関数、演算子、式および述部
第4章
ARRAY/VARRAY 関数および演算子
概要
この章では、1 次元(1-D)、多次元(n-D)、またはその両方の ARRAY データ型の関数、
演算子、式およびメソッドについて説明します。これらの関数を使用すると、配列
内のすべての構成要素や、配列を構成する構成要素の部分集合に対して、算術演算、
関係演算および集合演算を実行できるようになります。
ARRAY データ型について、詳細は< SQL データ型とリテラル、B035-1143>の
「ARRAY/VARRAY データ型」を参照してください。1 次元配列および多次元配列の
作成について、詳細は<SQL データ定義言語 - 構文規則および例、B035-1144>の
「CREATE TYPE(ARRAY/VARRAY 形式)」を参照してください。
注: この章で取り上げる関数は、埋め込みサービス システム関数です。埋め込みサー
ビス関数の有効化と呼び出しについて、詳細は「埋め込みサービス システム関数 」
を参照してください。
ARRAY 構成要素の参照
目的
ARRAY データ タイプ値の中の、指定した構成要素の値にアクセスします。
構文
5
array_expression
[ index_value ]
構文要素
array_expression
ARRAY データ型と評価される式。
index_value
アクセスする値を保持する配列内の構成要素への索引。
SQL 関数、演算子、式および述部
157
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY 構成要素の参照
1-D ARRAY タイプの場合、index_value は範囲が 1~n(n は ARRAY タイプの宣言サ
イズ)の正の整数であることが必要です。
n-D ARRAY タイプの場合、index_value は範囲が m~n(m は、配列の次元について
宣言された下限、n は宣言された上限)の正または負の整数であることが必要です。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
使用上の注意
参照先の配列の構成要素は、値または NULL で初期化する必要があります。参照先
の配列の構成要素が未初期化状態の場合は、エラーが返されます。DEFAULT NULL
句を使用すると、その ARRAY データ タイプが作成される時点で配列のすべての構
成要素を NULL で初期化できます。また、ARRAY コンストラクタ式を使用して、配
列を初期化することもできます。DEFAULT NULL 句について、詳細は<SQL データ
定義言語 - 構文規則および例、B035-1144>の「CREATE TYPE (ARRAY 形式)」を参
照してください。ARRAY コンストラクタ式については、「ARRAY コンストラクタ
式」を参照してください。
1-D ARRAY タイプの場合、1 組の角括弧を付けた ARRAY 構成要素の参照構文を使用
すると、単一の構成要素を参照できます。例えば、MyArray[n]のようにします。こ
の MyArray は 1-D ARRAY データ型です。
n-D ARRAY タイプの場合、n 組の角括弧を付けた ARRAY 構成要素の参照構文を使用
して、単一の構成要素を参照できます。この n は、n-D ARRAY タイプの次元数に対
応します。例えば、my3DArray が 3-D ARRAY データ型を定義する場合、この配列
の 1 つの構成要素にアクセスする ARRAY 構成要素の参照構文は、my3DArray[x][y]
[z]になります。角括弧の最大セット数は 5 です。これは、Teradata がサポートする
n-D ARRAY タイプの最大次元数に対応しています。
ARRAY 構成要素の参照に含まれる参照次元数は、その構成要素の参照を使用して配
列値の構成要素にアクセスしようとしたときに検証されます。この検証には、参照
先の ARRAY 値が存在している必要があり、SQL 文で構成要素の参照を実際に実行す
る必要があります。そのため、まれに、ARRAY 構成要素の参照を含む SQL 文が実際
には実行されない場合があります。たとえば、行を格納していないテーブルからの
SELECT や、左側の評価が真になる OR 句の右側で構成要素の参照を行なう SELECT
内の WHERE 句などが挙げられます。このような場合、ARRAY 構成要素の参照は、
UDF の呼び出しと同じ動作になります。
ARRAY 構成要素の参照を SET 句で使用する方法
UPDATE 文や MERGE 文の SET 句のターゲット値として ARRAY 構成要素の参照を使
用すると、ARRAY 内の個々の構成要素の値を設定できます。
158
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY 構成要素の参照
1-D 配列の中ほどの構成要素に特定の値を設定したときに、それより前の構成要素
が初期化されていない場合には、それらの構成要素が自動的に NULL に初期化され
ます。n-D ARRAY タイプの場合、配列の中ほどの構成要素を特定の値に設定したと
きに、それより前(行優先順で全次元)の構成要素が初期化されていない場合には、
それらの構成要素が自動的に NULL に初期化されます。
配列の要素型が可変長型で、要素の初期化のため渡された値が要素型の最大サイズ
より大きい場合、Teradata Database は要素型の最大サイズになるように渡された値
を自動的に切り捨てます。この切り捨て動作は、Teradata セッション モードのトラ
ンザクション処理でのみ発生します。ANSI セッション モードでは、Teradata
Database は渡された値の切り捨ては行なわず、代わりにエラーを返します。この動
作は、DISTINCT 型 UDT および STRUCTURED 型 UDT の動作と同じです。
さらに、CHAR から TIMESTAMP へ、または TIMESTAMP から DATE へのキャスト
など、既存の暗黙の CAST 機能は、既存の ARRAY 構成要素の参照ではサポートして
いません。SET 句の変換元のデータ タイプは、配列の構成要素のデータ タイプと同
じでなければなりません。SET 句の変換先が ARRAY 構成要素の参照の場合、配列
の構成要素のタイプとは異なるデータ タイプを持つ SET 句の変換元値に対しては、
明示的な CAST を使用する必要があります。
例
例: ARRAY 要素の参照構文の表示
テーブルに ephone という名前の列が含まれ、ephone 列のデータ タイプが 1-D
ARRAY の場合、配列の 5 番目の構成要素の値にアクセスする ARRAY 構成要素の参
照構文を次に示します。
ephone[5]
例: 1-D ARRAY でのテーブルとセット要素の作成
次の 1-D ARRAY データ タイプについて考えてみましょう。
CREATE TYPE phonenumbers_ary AS CHAR(10) ARRAY[5];
次の文は、ephone という名前でデータ タイプが phonenumbers_ary の列を持つテー
ブルを作成します。
CREATE TABLE my_table (eno INTEGER, ephone phonenumbers_ary);
次の文は、ARRAY 構成要素の参照を使用して、配列の構成要素 3 の値を
「5551234567」に設定します。配列内の構成要素 1 と 2 が初期化されていなかっ
た場合、この UPDATE 文により、それらの構成要素は自動的に null に設定されます。
UPDATE my_table
SET ephone[3] = '5551234567';
SQL 関数、演算子、式および述部
159
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_Constructor_Expression
例: 3-D ARRAY でのテーブルとセット要素の作成
次の STRUCTURED 型 UDT について考えてみましょう。
CREATE TYPE measures_UDT AS(amplitude INTEGER,
phase
INTEGER,
frequency INTEGER);
次の文は、shots という名前で構成要素のタイプが measures_UDT の 3-D ARRAY
データ タイプを作成します。
CREATE TYPE shots AS measures_UDT ARRAY[-2:2][-5:5][-3:3];
次の文は、shot_ary という名前の列を持つテーブルを作成します。shot_ary 列のデー
タ タイプは shots です。これは 3-D ARRAY タイプです。
CREATE TABLE seismic_table (id INTEGER, shot_ary shots);
次の問合わせは、3-D 配列の構成要素の値を選択します。
SELECT shot_ary[-1][1][3] FROM seismic_table;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ARRAY_Constructor_Expression
目的
ARRAY タイプの新しいインスタンスを生成し、そのインスタンスを指定されたコン
ストラクタ メソッドまたは関数を使って初期化します。
構文
array_name
NEW
(
)
,
n
element_expression
構文要素
array_name
初期化する ARRAY データ型の名前。
160
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_Constructor_Expression
element_expression
リテラル値と評価される式。値のデータ型は、array_name 配列の要素型と同じに
する必要があります。
element_expression は n 回繰り返すことができます。n は array_name アレイの宣
言サイズです。n の最大値は 2559 です。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
ARRAY コンストラクタに渡す式は、array_name 配列の要素型のデータ型に暗黙的
に変換できるものである必要があります。CHAR から TIMESTAMP へ、または
TIMESTAMP から DATE へのキャストなど、既存の暗黙の CAST 機能は、既存の
ARRAY コンストラクタ式ではサポートしていません。
ARRAY コンストラクタ式には、ゼロ個以上の引数を使用できます。引数がない場
合、ARRAY コンストラクタは空の ARRAY タイプ値を初期化し、その ARRAY デー
タ型が DEFAULT NULL 句を指定せずに作成された場合には、配列のすべての構成
要素の値を未初期化状態に設定します。その ARRAY データ型が DEFAULT NULL 句
を指定して作成された場合は、ARRAY コンストラクタが配列のすべての構成要素の
値を null に初期化します。未初期化状態の配列の構成要素へのアクセスを試みる
と、エラーが返されるので注意してください。
ARRAY コンストラクタ式に対しては、最大 n 個の引数を渡すことができます。この
とき、n は、ARRAY データ型の宣言サイズです。1 次元 ARRAY タイプの場合、
ARRAY コンストラクタは配列の構成要素の先頭から、引数が渡される順に引数を入
れていきます。多次元 ARRAY タイプの場合、ARRAY コンストラクタ式に引数を行
優先順で渡します。これは、多次元配列の構成要素が行優先順で埋め込まれるため
です。
引数の数が配列の構成要素数より少ない場合、引数の値が指定されていない残りの
構成要素は、初期化されていない状態に設定されます。ただし、DEFAULT NULL 句
を使用して ARRAY データ型を作成した場合、そのような構成要素は null に設定さ
れます。
UDT のコンストラクタ メソッドは、128 個を超える引数は受け付けませんが、こ
の制限は ARRAY データ型には適用されません。ARRAY コンストラクタに指定でき
る引数の数は、ARRAY タイプに定義できる構成要素の最大数または 2559 個のどち
らか小さい方に制限されます。
配列の要素型が可変長型で、要素の初期化のため渡された値が要素型の最大サイズ
より大きい場合、Teradata Database は要素型の最大サイズになるように渡された値
を自動的に切り捨てます。この切り捨て動作は、Teradata セッション モードのトラ
ンザクション処理でのみ発生します。ANSI セッション モードでは、Teradata
SQL 関数、演算子、式および述部
161
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_Constructor_Expression
Database は渡された値の切り捨ては行なわず、代わりにエラーを返します。この動
作は、DISTINCT 型 UDT および STRUCTURED 型 UDT の動作と同じです。
NEW キーワードを使用しない ARRAY コンストラクタ式の呼び出し
NEW キーワードを使用しなくても、ARRAY コンストラクタ式を呼び出すことがで
きます。これは Oracle 構文と互換性があります。NEW キーワードを使用せずに呼
び出すと、この式を Teradata Database は UDF 式のように扱います。これは、ARRAY
コンストラクタ式を使用できる場所を、スカラー UDF と同じ用法に制限します。こ
れは、同じシナリオで、NEW キーワードを使用しない ARRAY コンストラクタ式が
使用できない SQL 文内でも、NEW キーワードを使用する ARRAY コンストラクタ式
は使用できることを意味します。たとえば、CREATE TABLE 文の DEFAULT 句で、
NEW キーワードを使用する ARRAY コンストラクタ式を使用できます。ただし、
DEFAULT 句で NEW キーワードを使用しない ARRAY コンストラクタ式は使用でき
ません。
さらに、NEW キーワードを使用しない ARRAY コンストラクタ式はスカラー UDF の
ように扱われるので、この場合、UDF の既存の検索順序ルールが適用されます。
Teradata Database は次のデータベース内の UDF を次の順序で検索します。
1 デフォルト データベース
2 SYSLIB データベース
3 TD_SYSFNLIB データベース
4 SYSUDTLIB データベース
UDF がデフォルト データベース、SYSLIB、または、TD_SYSFNLIB 内にあり、かつ、
定義された ARRAY データ型と同じ名前を持つ場合、また、NEW キーワードを指定
しない ARRAY コンストラクタ式を呼び出す場合は、Teradata Database は ARRAY コ
ンストラクタに代わって UDF を呼び出します。この対立を回避するには、ARRAY コ
ンストラクタを呼び出すときに NEW キーワードを使用します。
例: ARRAY コンストラクタ式の使用
次の 1-D ARRAY データ タイプについて考えてみましょう。
CREATE TYPE phonenumbers_ary AS CHAR(10) ARRAY[5];
phonenumbers_ary 内の最初の 2 つの構成要素に指定した値を設定し、また、配列
内の他の構成要素を初期化されていない状態に設定する ARRAY コンストラクタ式を
次に示します。
NEW phonenumbers_ary('5551234567', '8585551234')
または
phonenumbers_ary('5551234567', '8585551234')
162
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY 適用範囲の参照
ARRAY 適用範囲の参照
目的
ARRAY 関数を呼び出すときに、ARRAY データ タイプの複数の構成要素を参照します。
構文
array_lower_bounds, array_upper_bounds
構文要素
array_lower_bounds
整数値または事前定義された ARRAY タイプ ArrayVec の配列インスタンスで、範囲
の下限を定義する整数値のカンマ区切りリストを指定したもの。
array_upper_bounds
整数値または事前定義された ARRAY タイプ ArrayVec の配列インスタンスで、範囲
の上限を定義する整数値のカンマ区切りリストを指定したもの。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY 関数を呼び出すときに 1 つ以上の ARRAY データ タイプの構成要素を参照す
るには、1-D 配列には整数値を使用できますが、n-D 配列には ArrayVec ARRAY デー
タ タイプを使用する必要があります。ArrayVec ARRAY データ タイプは、システム
によって自動的に作成され、次のように定義されています。
CREATE TYPE ArrayVec AS INTEGER ARRAY[1000];
任意選択の scope_reference 引数または array_bound 引数を持つすべての ARRAY
関数については、ArrayVec ARRAY タイプの 1 つ以上のインスタンスを使用して、
n-D ARRAY データ型の各次元の境界を記述できます。
規則
ARRAY 関数で任意選択の scope_reference パラメータが指定されているときは、次
のルールが適用されます。
• scope_reference には、2 つの整数値または 2 つの ArrayVec 値を渡せます。1 次
元 ARRAY 引数を使用して ARRAY 関数を呼び出す場合、scope_reference には整
数と ArrayVec を組み合わせた値を渡せます。例えば、scope_reference は
SQL 関数、演算子、式および述部
163
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY 適用範囲の参照
integer_value、ArrayVec_value または ArrayVec_value、integer_value にするこ
とができます。
• scope_reference の範囲の上限または下限を指定するのに ArrayVec インスタンス
を使用する場合、次の操作は許されません。
• 配列引数の境界を定義するために必要な ArrayVec 構成要素のいずれかに NULL
を渡す。
• 配列引数の境界を定義するには不十分な数の構成要素を ArrayVec に渡す。
• 配列引数の境界を定義するには多すぎる数の構成要素を ArrayVec に渡す。
• RETURNS NULL ON NULL INPUT 句を定義するすべての ARRAY 関数については、
scope_reference を定義する任意選択のパラメータの 1 つが NULL として渡され
ると、結果値として NULL が返されます。
• scope_reference を指定して呼び出される ARRAY 関数は、その適用範囲が明示的
に定義されているとみなされるので、初期化されていない構成要素のいずれか
が、ARRAY 入力引数のいずれかで scope_reference の範囲内にあれば、そのよう
な関数はエラーを返します。CARDINALITY 関数は、このルールの例外となりま
す。これは、初期化されていない構成要素が含まれている、明示的な適用範囲
は、この関数の入力として受け入れられないためです。
アプリケーションを 2 つの配列の間で操作する必要がある場合、作成時に DEFAULT
NULL 句を使用してそうした配列を作成することを考慮します。こうすると、配列の
すべての構成要素が初期化されるので、システムから無効な構成要素の参照による
エラーを回避できます。
ARRAY 関数で任意選択の scope_reference パラメータが指定されていないときは、
次のルールが適用されます。
• scope_reference を指定せずに ARRAY 関数を呼び出すと、使用されるデフォルト
の適用範囲は入力 ARRAY 引数で初期化されている構成要素の数になります。
ARRAY 関数が 2 つの ARRAY 引数を受け付け、初期化された構成要素の数が 2 つ
の配列で異なっている場合、エラーが返されます。
• ARRAY 関数が ARRAY 値を返すとき、結果の ARRAY 値に含まれる初期化された
構成要素の数は、入力 ARRAY 引数の構成要素の数と同じになります。
例: 範囲内の固有(Distinct)要素の数を返す
次の問合わせにより、phonelist 配列の各次元の範囲 5~10 内にある固有(Distinct)
構成要素の数が返されます。
SELECT CARDINALITY(phonelist, NEW ArrayVec(5,5), NEW ArrayVec(10,10));
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
164
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_AGG
ARRAY_AGG
目的
問合わせの SELECT リストの一部として配列を作成できる ARRAY データ タイプと
ともに使用する集約関数。
構文
ARRAY_AGG
A
( element_value_expr
TD_SYSFNLIB.
, array_expression )
A
ORDER BY
value_expression
ASC
DESC
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
element_value_expr
ARRAY のエレメント タイプと評価される式。
value_expression
比較可能な Teradata データ型と評価される式。
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
array_expression
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
SQL 関数、演算子、式および述部
165
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_AGG
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
引数のタイプ
ARRAY_AGG では、2 つの引数を使用できます。第 1 引数は、定義済みの ARRAY
データ タイプの構成要素の値として現在使用されているデータ タイプを評価する式
です。第 2 引数は、構成要素のタイプが第 1 引数と一致する定義済みの ARRAY デー
タ タイプを評価する式です。
結果のタイプ
ARRAY データ型を解決する array_expression から得たデータ型情報は、ARRAY_AGG
が返すタイプの設定に使用されます。
結果値およびルール
ARRAY_AGG は ARRAY タイプ値を返し、その構成要素は第 1 パラメータとして渡さ
れた構成要素式値の集約セットです。n-D ARRAY 結果値の場合、配列に集約される
value_expression 値は行優先順で入力されます。
第 1 引数で ORDER BY 句を指定すると、結果の配列に入力される値は、この句で指
定された列値の順に並べられます。ARRAY_AGG の ORDER BY 句には、次のルール
が適用されます。
• ARRAY_AGG の ORDER BY 句に渡してもよい値は 1 つのみです。この点が、
ORDERE BY に対して複数の値を渡すことができる SELECT 文の ORDER BY とは
異なります。
• ARRAY 列値は、ORDER BY 句における整列キーとしては渡せません。ARRAY 値
のリレーショナル比較はできません。それ以外に、BLOB または CLOB など、比
較できないデータ タイプ値は、ORDER BY 句における整列キーとしては渡せませ
ん。
• ORDER BY に渡される単一の値の場合、リレーショナル比較ができる式は渡して
もかまいません。ただし、渡される値が列値ではない場合、結果の配列構成要素
の整列は行なわれません。また、結果は結果の配列に順不同で書き込まれます。
適切な整列を行なうには、SQL 文内で参照先のテーブルの 1 つから得られる列値
を使用します。
使用上の注意
任意の array_expression を渡せることから、渡す ARRAY タイプ値には、初期化され
た構成要素が含まれていても、いなくてもかまいません。ただし、ARRAY_AGG は
166
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_AGG
array_expression 内の初期化済みの構成要素は無視します。array_expression は、
結果値のデータ型を指定する場合にのみ使用されます。
推奨事項: このパラメータには、NEW myArray()など、必要な ARRAY タイプ値の空
のインスタンスを渡します。
ARRAY_AGG に渡される array_expression 引数が NULL リテラルの場合、エラーが
返されます。array_expression 引数を ARRAY データ型に解決できる場合、データ
に NULL が含まれていても関数は正常に実行されます。
処理中の現在行の value_expression 引数が NULL と評価される場合、その式は集計
中の値のリストから除外されず、非 NULL 構成要素で行なうのと同様に、適切な
ARRAY 構成要素の値を設定するために使用されます。これは ANSI SQL:2011 規格
に対応し、規格では、ARRAY_AGG とその他の集計関数との違いとして注記されて
います。
ARRAY_AGG は、CLASS AGGREGATE 値を 64000 として作成されています。これ
は、そのサイズで中間集計ストレージが割り当てられることを意味します。中間集
計ストレージは固定長値なので、このバッファがオーバーフローするような非常に
大きな入力セットを処理する場合も考えられます。すべての集計 UDF にこの制限が
あります。
例: ソース テーブルのデータを新しいテーブルに挿入する
この例では、ある従業員に付随する電話番号を記録するソース テーブルからデータ
を取り出し、電話番号を ARRAY タイプで記録する新しいテーブルに挿入します。
多くの場合、一人の従業員が、会社の電話、携帯電話、自宅の電話など、複数の電
話番号を持つことができます。こうしたタイプのデータを表わすには、複数の電話
番号を記録する 1-D ARRAY タイプの方が適しています。これはテーブルの行数を減
らします。
注:同じタイプの動作を n-D ARRAY タイプで表わすことも可能です。両者の唯一の
違いは、構成要素の格納が行優先順で処理されることです。
次の文は、最大 100 件の電話番号値を持つことのできる 1-D ARRAY タイプを作成
します。
CREATE TYPE emp_phone_array AS VARCHAR(14) ARRAY[100];
次のソース表は、従業員の電話番号それぞれが 1 行になっています。
CREATE SET TABLE employee
(emp_id INTEGER,
emp_name VARCHAR(30),
emp_phone CHAR(14));
SELECT * FROM employee;
emp_id
emp_name
-----------------1
Beth
SQL 関数、演算子、式および述部
emp_phone
------------(619) 619-6190
167
第 4 章 ARRAY/VARRAY 関数および演算子
UNNEST
1
1
2
2
2
3
3
3
Beth
Beth
Greg
Greg
Greg
Louise
Louise
Louise
(619)
(619)
(858)
(858)
(858)
(421)
(421)
(421)
620-6200
720-7200
858-8580
859-8590
860-8600
421-4210
422-4220
423-4230
次のターゲット表では、従業員それぞれが 1 行になっており、その従業員に関連す
るすべての電話番号を ARRAY タイプに格納します。
CREATE SET TABLE employeePhoneInfo
(emp_id INTEGER,
emp_name VARCHAR(30),
emp_phone emp_phone_array);
INSERT INTO employeePhoneInfo
SELECT emp_id, emp_name,
ARRAY_AGG(emp_phone, NEW emp_phone_array())
FROM employee GROUP BY emp_id,emp_name
WHERE emp_id < 100;
SELECT * FROM employeePhoneInfo;
emp_id
---------
emp_name
-----------
emp_phone
---------
1
Beth
( (619) 619-6190, (619) 620-6200, (619) 720-7200 )
2
Greg
( (858) 858-8580, (858) 859-8590, (858) 860-8600 )
3
Louise
( (421) 421-4210, (421) 422-4220, (421) 423-4230 )
UNNEST
目的
ARRAY データ タイプで使用するテーブル関数で、配列を列テーブルに変換できます。
構文
UNNEST
TD_SYSFNLIB.
168
(
array_expr )
key_expr,
WITH ORDINALITY
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
UNNEST
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
key_expr
ARRAY、UDT、PERIOD データ型、BLOB、または CLOB 以外の Teradata データ型
と評価される式。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
引数のタイプ
UNNEST が受け取る引数は、1 つまたは 2 つのいずれかです。任意選択のキー値引
数により結果のテーブルに生成される行をグループ化できます。これは特に、
UNNEST を ARRAY_AGG 関数の補足として使用する場合に役立ちます。というの
も、ARRAY_AGG は、集計 GROUP BY 句を使用して呼び出され、グループ化に基づ
いて複数の ARRAY 値を生成するからです。
array_expr 引数は、現在システム内で定義されている ARRAY データ型と評価され
る式です。
結果のタイプと値
UNNEST は、1~3 列を含むテーブルを返します。第 1 の出力列は、任意選択のキー
値が指定されていた場合に、それに対応します。第 2 の出力列は、渡された ARRAY
タイプの構成要素のタイプと同じデータ タイプです。 任意選択の WITH ORDINALITY
句が指定された場合、UNNEST は各構成要素に関連付けられた位置を含む追加の整
数列を集計します。
テーブルでは、UNNEST に渡された ARRAY 値の各構成要素が 1 行に取り込まれま
す。n-D ARRAY 入力値の場合、入力の n-D ARRAY から得た構成要素の値を格納す
る列が、行優先順で出力されます。
SQL 関数、演算子、式および述部
169
第 4 章 ARRAY/VARRAY 関数および演算子
UNNEST
使用上の注意
テーブル UDF はテーブル関数です。したがって、SQL SELECT 文の FROM 句でのみ
使用できます。
ARRAY 式引数が NULL と評価されると、結果のテーブルに行は返りません。ARRAY
式引数が NULL でなくても、存在しない構成要素が 1 つ以上ある場合は、対応する
結果行の配列構成要素の列値は NULL になります。
例: UNNEST の呼び出し
この例は、UNNEST を呼び出し、1-D ARRAY タイプの列 myarray を使用して、任意
選択のキー値引数を渡し、任意選択の WITH ORDINALITY 句を使用します。例では、
tt2 テーブルの各行の myarray 配列に格納される値ごとに 1 行ずつ、20 行を返しま
す。3 つの列の結果が返されます。
• out_key は、UNNEST に渡される任意選択のキー値です。この例では tt2 テーブ
ルの int_key 列の値に対応するため、tt2 テーブルの各行から発生した結果の配列
値を識別します。
• pos は、配列内の構成要素の位置です。例では WITH ORDINALITY 句を使用して
いるため、結果に含まれます。
• val は、配列の構成要素の値です。
CREATE TYPE myarray AS INTEGER ARRAY[10];
CREATE TABLE tt2(
pkey INTEGER,
int_key INTEGER,
vc_key VARCHAR(20),
myarr myarray);
INS INTO tt2 VALUES(0, 0, 'item 0', NEW myarray(10, 20, 30, 40, 50));
INS INTO tt2 VALUES(1, 1, 'item 1', NEW myarray(11, 21, 31, 41, 51));
INS INTO tt2 VALUES(2, 2, 'item 2', NEW myarray(12, 22, 32, 42, 52));
INS INTO tt2 VALUES(3, 3, 'item 3', NEW myarray(NULL, 23, 33, 43,
NULL));
INS INTO tt2 VALUES(4, 4, 'item 4', NULL);
SELECT out_key, tf.pos, tf.val
FROM tt2,
TABLE (UNNEST(tt2.int_key, tt2.myarr) WITH ORDINALITY) AS
tf(out_key, val, pos) WHERE tt2.int_key = tf.out_key ORDER BY 1,2;
*** Query completed. 20 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
out_key
pos
val
----------- ----------- ----------0
1
10
0
2
20
0
3
30
170
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
CARDINALITY
0
0
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
40
50
11
21
31
41
51
12
22
32
42
52
?
23
33
43
?
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
CARDINALITY
目的
現在値が割り当てられている ARRAY データ タイプ内の構成要素数を表わす整数、
または、特定の適用範囲の参照内で初期化された構成要素数を返します。
構文
システム関数の構文
CARDINALITY
( array_expr
)
, scope_reference
メソッドスタイルの構文
array_expr. CARDINALITY
(
)
scope_reference
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
SQL 関数、演算子、式および述部
171
第 4 章 ARRAY/VARRAY 関数および演算子
CARDINALITY
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
scope_reference
ARRAY 適用範囲の参照。
ARRAY 式が CARDINALITY 関数に指定されている場合、初期化されていない構成要
素が含まれている、明示的な適用範囲は、入力として受け入れられます。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
引数のタイプ
array_expr 引数は、現在システム内で定義されている ARRAY データ型と評価される
式です。
結果のタイプと値
CARDINALITY は、現在値が割り当てられている ARRAY 内の構成要素数を表わす整
数値を返します。この数には、NULL の構成要素も含まれます。ARRAY 値に割り当
てられている構成要素の値の数が、定義されている最大サイズ n より少ない場合が
あるので、CARDINALITY 関数から n より小さい値が返る場合があります。
配列引数が空の(つまり、構成要素が割り当てられていない)場合、関数は 0 を返しま
す。配列引数が NULL の場合は、CARDINALITY は結果として NULL を返します。
初期化されていないいずれかの構成要素が、ARRAY 入力引数のいずれかに指定した
scope_reference の範囲にある場合、通常、ARRAY 関数はエラーを返しますが、
CARDINALITY 関数内に指定された ARRAY 式の動作は異なります。ARRAY 式が
CARDINALITY 関数に指定されている場合、初期化されていない構成要素が含まれて
いる、明示的な適用範囲は入力として受け入れられます。
例: 1-D ARRAY の要素数を表わす整数を返す
次の例では、現在値が割り当てられている 1-D ARRAY 内の構成要素数を表わす整数
値を返します。
CREATE TYPE phonenumbers AS CHAR(10) ARRAY[20];
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
SELECT CARDINALITY(phonelist)
FROM employee_info;
172
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_CONCATENATION_OPERATOR
CARDINALITY 関数を使用して、特定の適用範囲の参照内で現在初期化されている
構成要素数を返すこともできます。たとえば、次の問合わせにより、phonelist 配列
の範囲 5~10 で初期化された構成要素数が返ります。
SELECT CARDINALITY(phonelist, 5, 10);
次の 2-D ARRAY データ タイプについて考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_table(shots shot_ary);
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の例では、現在値が割り当てられている 2-D ARRAY 内の構成要素数を表わす整数
値を返します。
SELECT CARDINALITY(shot1) FROM seismic_data;
次に、メソッドスタイルの構文を使用した同じ問合わせを示します。
SELECT shot1.CARDINALITY() FROM seismic_data;
次の問合わせにより、phonelist 配列の各次元の範囲 5~10 で初期化された構成要
素の数が返ります。
SELECT CARDINALITY(phonelist, NEW ArrayVec(5,5), NEW ArrayVec(10,10));
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ARRAY_CONCATENATION_OPERATOR
目的
1 次元の ARRAY データ タイプを連結します。
構文
array_expr1
SQL 関数、演算子、式および述部
array_expr2
173
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_CONCATENATION_OPERATOR
構文要素
array_expr1/array_expr1
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
||
連結演算子。
ANSI への準拠
1 次元(1-D)の ARRAY データ タイプの ARRAY 連結演算子は、部分的に ANSI SQL:
2011 に準拠しています。
ARRAY 連結演算子では、両方のオペランドが同じ ARRAY タイプのインスタンスで
あることと、連結演算の変換先タイプも同じタイプであることが必要です。これは、
1-D ARRAY 連結の変換先データ タイプが、両方の演算子の長さの合計として定義さ
れた長さを持つ新しい 1-D ARRAY タイプとなるよう定義されているため、ANSI 規
格とはずれがあります。
引数のタイプ
array_expr1 および array_expr2 は、CREATE TYPE 文で定義したものと同じ 1-D
ARRAY データ型であることが必要です。
結果のタイプと値
連結演算の結果は、2 つの引数のデータ型と同じ型の新しい 1-D ARRAY 値です。こ
のとき、array_expr1 にあるすべての構成要素の後ろに、array_expr2 にあるすべて
の構成要素が続きます。存在する構成要素には、NULL 構成要素も含まれますが、初
期化されていない状態にある構成要素は含まれません。
結果値と引数値が同じ 1-D ARRAY タイプなので、最大サイズ n も同じです。そのた
め、array_expr1 と array_expr2 の連結の結果、構成要素数が定義済みの 1-D ARRAY
タイプの最大サイズ n を超えると、操作はエラーでアボートします。
どちらかの引数が NULL の場合、操作の結果は NULL になります。
制約事項
ARRAY 連結演算子は、多次元の ARRAY データ タイプと一緒には使用できません。
174
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_CONCATENATION_FUNCTION
例: 1-D ARRAY 値の連結
この例では、同じデータ タイプの 1-D ARRAY 値を 2 つ受け取り、それを連結します。
CREATE TYPE address AS CHAR(10) ARRAY[5];
CREATE TABLE employee_info (eno INTEGER, addressval address);
/* Assume one row in table employee_info contains the following value
for "addressval":
Addressval[1] = '123 Main St.'
Addressval[2] = 'San Diego'
Addressval[3] = 'CA'
*/
/* The following select statement concatenates the current value in
"addressval" with ZIP code and country information, which are stored as
additional elements of the 1-D array. */
SELECT addressval || NEW address('92101', 'USA');
FROM employee_info;
/* Result value is the following:
Addressval[1] = '123 Main St.'
Addressval[2] = 'San Diego'
Addressval[3] = 'CA'
Addressval[4] = '92101'
Addressval[5] = 'USA'
*/
ARRAY_CONCATENATION_FUNCTION
目的
1 次元 ARRAY データ タイプを連結し、その配列の構成要素のサブセットに適用で
きます。
構文
システム関数の構文
ARRAY_CONCAT
( expr1, expr2
)
, scope_reference
メソッドスタイルの構文
expr1. ARRAY_CONCAT
( expr2
)
, scope_reference
SQL 関数、演算子、式および述部
175
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_CONCATENATION_FUNCTION
構文要素
expr1
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
expr1 および expr2 が ARRAY 式であること、また、両方が CREATE TYPE 文で定義
したものと同じ 1-D ARRAY データ型であることが必要です。
結果のタイプと値
連結演算の結果は、2 つの引数のデータ型と同じ型の新しい 1-D ARRAY 値です。こ
のとき、expr1 にあるすべての構成要素の後ろに、expr2 にあるすべての構成要素が
続きます。存在する構成要素には、null 構成要素も含まれますが、初期化されてい
ない状態にある構成要素は含まれません。
結果値と引数値が同じ 1-D ARRAY タイプなので、最大サイズ n も同じです。そのた
め、expr1 と expr2 の連結の結果、構成要素数が定義済みの 1-D ARRAY タイプの最
大サイズ n を超えると、操作はエラーでアボートします。
どちらかの引数が NULL の場合、操作の結果は NULL になります。
制約事項
ARRAY 連結関数は、多次元の ARRAY データ タイプと一緒には使用できません。
例: 2 つの 1-D ARRAY 値の連結
この例では、同じデータ タイプの 1-D ARRAY 値を 2 つ受け取り、それを連結しま
す。PhoneNum と OldPhoneNum は employee_info テーブル内の列で、どちらの列
も同じ 1-D ARRAY データ タイプです。
176
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARISON_FUNCTION
/* The following select statement concatenates the current value in
"PhoneNum" with the value in "OldPhoneNum". */
/* Assume one row in table employee_info contains the following value
for "PhoneNum":
PhoneNum[1] = '6197211000'
PhoneNum[2] = '6197221000'
PhoneNum[3] = '6197231000'
Also, assume one row in table employee_info contains the following value
for "OldPhoneNum":
OldPhoneNum[1] = '8582001000'
OldPhoneNum[2] = '8582002000'
OldPhoneNum[3] = '8582003000'
*/
SELECT ARRAY_CONCAT(PhoneNum, OldPhoneNum)
FROM employee_info;
/* Result value is the following:
PhoneNum[1] = '6197211000'
PhoneNum[2] = '6197221000'
PhoneNum[3] = '6197231000'
PhoneNum[4] = '8582001000'
PhoneNum[5] = '8582002000'
PhoneNum[6] = '8582003000'
*/
次に、メソッドスタイルの構文を使用した同じ問合わせを示します。
SELECT PhoneNum.ARRAY_CONCAT(OldPhoneNum)
FROM employee_info;
ARRAY_COMPARISON_FUNCTION
目的
ARRAY 値の個々の構成要素の比較を実行し、配列全体または適用範囲のいずれかを
参照します。
構文
システム関数の構文
ARRAY_GT
ARRAY_GE
( expr1, expr2
)
, scope_reference
ARRAY_LT
ARRAY_LE
ARRAY_EQ
ARRAY_NE
SQL 関数、演算子、式および述部
177
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARISON_FUNCTION
メソッドスタイルの構文
expr1.
ARRAY_GT
( expr2
ARRAY_GE
)
, scope_reference
ARRAY_LT
ARRAY_LE
ARRAY_EQ
ARRAY_NE
構文要素
expr1
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
expr1 または expr2、または両方の引数は ARRAY 式でなければなりません。詳細に
ついては、「使用上の注意」を参照してください。
サポートされている ARRAY 比較関数
次の表に、サポートされる ARRAY 比較関数の説明を示します。
リレーショナル
関数
ARRAY_GT
178
説明
「より大きい」関数。2 つの式を比較し、expr1 が expr2 より大きいか
どうかを判断します。その場合、関数は対応する結果の ARRAY 構成要
素にゼロ以外の値を返します。expr1 が expr2 以下の場合、関数は対
応する結果の ARRAY 構成要素にゼロを返します。
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARISON_FUNCTION
リレーショナル
関数
説明
ARRAY_GE
「~以上」関数。2 つの式を比較し、expr1 が expr2 以上かどうかを判
断します。その場合、関数は対応する結果の ARRAY 構成要素にゼロ以
外の値を返します。expr1 が expr2 より小さい場合、関数は対応する
結果の ARRAY 構成要素にゼロを返します。
ARRAY_LT
「より小さい」関数。2 つの式を比較し、expr1 が expr2 より小さいか
どうかを判断します。その場合、関数は対応する結果の ARRAY 構成要
素にゼロ以外の値を返します。expr1 が expr2 以上の場合、関数は対
応する結果の ARRAY 構成要素にゼロを返します。
ARRAY_LE
「~以下」関数。2 つの式を比較し、expr1 が expr2 以下かどうかを判
断します。その場合、関数は対応する結果の ARRAY 構成要素にゼロ以
外の値を返します。expr1 が expr2 より大きい場合、関数は対応する
結果の ARRAY 構成要素にゼロを返します。
ARRAY_EQ
「等しい」関数。2 つの式を比較し、expr1 が expr2 に等しいかどうか
を判断します。その場合、関数は対応する結果の ARRAY 構成要素にゼ
ロ以外の値を返します。expr1 が expr2 と等しくない場合、関数は対
応する結果の ARRAY 構成要素にゼロを返します。
ARRAY_NE
「等しくない」関数。2 つの式を比較し、expr1 が expr2 に等しくない
かを判断します。2 つの式が等しくない場合、関数は対応する結果の
ARRAY 構成要素にゼロ以外の値を返します。expr1 が expr2 と等しい
場合、関数は対応する結果の ARRAY 構成要素にゼロを返します。
使用上の注意
リレーショナル関数 ARRAY_GT、ARRAY_GE、ARRAY_LT、ARRAY_LE、
ARRAY_EQ、および ARRAY_NE の場合、ARRAY タイプでは 2 つの形式をサポート
しています。
第 1 の形式では、左側と右側両方のオペランドが同じ ARRAY タイプの 2 つのイン
スタンスです。
リレーショナル演算が対になって、2 つの引数内の一致する構成要素のペアそれぞ
れを 1 つずつ実行します。任意選択の引数 scope_reference が定義されている場合、
操作はその適用範囲内の構成要素についてのみ実行されます。scope_reference の
境界外にある構成要素はすべて NULL に設定されます。
結果は、入力配列引数と同じタイプの ARRAY となり、m=n である DECIMAL(m,n)
以外のすべての数値タイプについて、1 (true)、0 (false)、または NULL の 3 つのう
ちいずれかの値が入ります。m=n である DECIMAL(m,n)の場合、小数点の左側の桁
は許されないことから、関数は 1 という値を格納できません。この場合、関数は.
9[0]を返します。1 を超える高レベルの精度の場合、右側は 0 が埋め込まれます。
SQL 関数、演算子、式および述部
179
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARISON_FUNCTION
第 2 の形式では、左側または右側のいずれか一方が、有効な Teradata データ タイ
プを持つ ARRAY です。また、その他のオペランドは、左側の ARRAY に対して定義
されたものと同じデータ タイプの数値です。
リレーショナル演算は、数値引数を ARRAY 引数の各構成要素に適用することで実行
します。任意選択の引数 scope_reference が定義されている場合、操作はその適用範
囲内の構成要素についてのみ実行されます。scope_reference の境界外にある構成要
素はすべて NULL に設定されます。
結果は、入力配列引数と同じタイプの ARRAY となり、m=n である DECIMAL(m,n)以
外のすべての数値タイプについて、1 (true)、0 (false)、または NULL の 3 つのうち
いずれかの値が入ります。m=n である DECIMAL(m,n)の場合、小数点の左側の桁は
許されないことから、関数は 1 という値を格納できません。この場合、関数は.9[0]
を返します。1 を超える高レベルの精度の場合、右側は 0 が埋め込まれます。右側
が NULL と判断されると、NULL が返されます。
リレーショナル比較関数のどちらの形式でも、ARRAY 引数内に NULL 構成要素があ
ると、結果の ARRAY のその位置には NULL 構成要素が入ります。配列を呼び出す比
較は、CREATE TYPE 文内の任意選択の DEFAULT NULL 句の影響は受けません。た
だし、DEFAULT NULL 句を指定せずに作成された配列を比較するときにエラーにな
る確率は高まります。
ARRAY 引数に初期化されていない状態にある構成要素が含まれている場合、エラー
が返されます。適用範囲の参照を使用して、初期化されてない構成要素が含まれて
いる ARRAY の範囲の参照を回避するか、初期化されていない構成要素を NULL に設
定します。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参
照してください。
制約事項
ARRAY 値のリレーショナル比較はできません。ARRAY データには、いかなるリレー
ショナル比較演算子も使用できません。リレーショナル比較ができるのは、ARRAY
の個々の構成要素に限られます。
例
例: 1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[10];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
sale_price と regular_price という配列の構成要素の値が次のようになっているとし
ます。
180
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARISON_FUNCTION
sale_price[1:10] = 50, 100, 200, 90, 250, 550, 200, 200, 50, 75
regular_price[1:10] = 100, 300, 230, 110, 500, 550, 200, 400, 100, 150
次の問合わせは、構成要素のタイプ BYTEINT の適用範囲の参照[1:10]で 1-D ARRAY
を返します。評価中、regular_price 配列内の指定した適用範囲[5:10]にある各構成
要素を、リレーショナル関数 ARRAY_GT を使用して sale_price 配列の対応する構成
要素と比較します。出力配列内の結果の値は、ゼロまたはまたはゼロ以外の適用範
囲内の構成要素の数、そして、配列のそれ以外のすべての構成要素については NULL
となります。
SELECT ARRAY_GT(regular_price, sale_price, 5,10)
FROM inventory;
問合わせの出力は、次の値を持つ 1-D ARRAY です。
output_array[1:10] = [ NULL, NULL, NULL, NULL, 1, 0, 0, 1, 1, 1]
次の問合わせは、item_price タイプの適用範囲の参照[1:10]で 1-D ARRAY を返しま
す。評価中、regular_price 配列内の指定した適用範囲[5:10]にある各構成要素を、
リレーショナル関数 ARRAY_GT を使用して sale_price 配列の対応する構成要素と比
較します。構成要素のタイプ BYTEINT の値(ゼロまたはゼロ以外の数)からなる結果
の ARRAY は、regular_price 配列の対応する構成要素の値を乗じたものです。
SELECT ARRAY_MUL(regular_price, ARRAY_GT(sale_price, regular_price, 5,
10))
FROM inventory;
問合わせの出力は、次の値を持つ 1-D ARRAY です。
output_array[1:10] = [ NULL, NULL, NULL, NULL, 500, 0, 0, 400, 100, 150]
次の問合わせでは、リレーショナル関数 ARRAY_LT で 1-D ARRAY sale_price の適用
範囲内にある各構成要素をリテラル値 100 と比較します。構成要素の値が 100 よ
り小さい場合、比較関数はゼロ以外の値を返し、それ以外の場合、条件が満たされ
ていない場合は 0 を、構成要素が初期化されない場合は NULL を返します。
item_price ARRAY タイプの 1-D ARRAY は、入力 1-D ARRAY の各構成要素の対応す
る値が設定されて返ります。
SELECT ARRAY_LT(sale_price,100)
FROM inventory;
問合わせの出力は、次の値を持つ 1-D ARRAY です。
output_array[1:10] = [ 1, 0 , 0, 1, 0, 0, 0, 0, 1, 1]
例: 2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER DEFAULT NULL;
CREATE TABLE seismic_data (
SQL 関数、演算子、式および述部
181
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_ARITHMETIC_FUNCTION
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、構成要素のタイプが INTEGER の 2-D ARRAY を返します。出力配
列のサイズは、入力配列引数のサイズと同じです。評価中、shot1 配列内の位置[5]
[10]にある構成要素が値 5 と比較されます。構成要素が 5 より大きい場合、出力配
列にある対応する構成要素の値がゼロ以外の値に設定されます。その他の場合は 0
に設定されます。出力配列内のその他すべての構成要素は NULL に設定されます。
SELECT ARRAY_GT(shot1, 5, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_GT(5, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
次の問合わせでは、リレーショナル関数 ARRAY_LT で 2-D ARRAY shot1 の適用範囲
の参照[3:5][8:10]内にある各構成要素をリテラル値 0 と比較します。構成要素の値
が 0 より小さい場合、比較関数は 0 を返し、それ以外の場合ゼロ以外の値を返しま
す。shot_ary タイプの結果の配列は、shot1 配列を乗じたものです。
SELECT ARRAY_MUL(shot1, ARRAY_LT(shot1, 0, NEW arrayVec(3,8), NEW
arrayVec(5,10)))
FROM seismic_data;
ARRAY_ARITHMETIC_FUNCTION
目的
ARRAY 値に算術演算(加算、減算、乗算、除算、および剰余)を実行し、配列全体ま
たは適用範囲のいずれかを参照します。
システム関数の構文
ARRAY_ADD
( expr1, expr2
ARRAY_SUB
)
, scope_reference
ARRAY_MUL
ARRAY_DIV
ARRAY_MOD
構文
メソッドスタイルの構文
182
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_ARITHMETIC_FUNCTION
expr1.
ARRAY_ADD
( expr2
ARRAY_SUB
)
, scope_reference
ARRAY_MUL
ARRAY_DIV
ARRAY_MOD
構文要素
expr1/expr2
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
ARRAY 算術関数に対して有効な引数は、次のいずれかです。
• expr1 および expr2 は、それぞれが同じ ARRAY タイプのインスタンスです。
• expr1 は数値引数型の ARRAY 値であり、expr2 は expr1 の要素型に割り当てる
ことのできる数値です。
expr1 または expr2 のどちらかが NULL の場合、この関数は NULL を返します。
使用上の注意
算術関数 ARRAY_ADD、ARRAY_SUB、ARRAY_MUL、ARRAY_DIV、および
ARRAY_MOD の場合、ARRAY タイプでは 2 つの形式をサポートしています。
第 1 の形式では、左側と右側両方のオペランドが同じ ARRAY タイプの 2 つのイン
スタンスです。
算術演算が対になって、2 つの引数内の一致する構成要素のペアそれぞれを 1 つず
つ実行します。任意選択の引数 scope_reference が定義されている場合、操作はそ
の適用範囲内の構成要素についてのみ実行されます。scope_reference の境界外に
ある構成要素はすべて NULL に設定されます。結果は、入力 ARRAY 引数と同じデー
SQL 関数、演算子、式および述部
183
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_ARITHMETIC_FUNCTION
タ タイプの ARRAY で、カーディナリティ(取り込まれた構成要素の数)は最初の入力
ARRAY 引数と同じです。
第 2 の形式では、左側または右側のどちらか一方が数値引数タイプの ARRAY とな
り、右側は左側の構成要素のタイプに割り当てることのできる数値です。算術演算
は、算術演算子を持つ右側の値を左側の ARRAY 引数の各構成要素に適用することで
実行します。結果は、入力 ARRAY 引数と同じタイプの ARRAY で、カーディナリティ
(取り込まれた構成要素の数)は入力 ARRAY 引数と同じです。任意選択の引数
scope_reference が定義されている場合、操作はその適用範囲内の構成要素について
のみ実行されます。scope_reference の境界外にある構成要素はすべて NULL に設定
されます。
算術関数のどちらの形式でも、ARRAY 引数内に NULL 構成要素があると、結果の
ARRAY のその位置には NULL 構成要素が入ります。配列を呼び出す算術演算は、
CREATE TYPE 文内の任意選択の DEFAULT NULL 句の影響は受けません。ただし、
DEFAULT NULL 句を指定せずに作成された配列を比較するときにエラーになる確率
は高まります。
ARRAY 引数に初期化されていない状態にある構成要素が含まれている場合、エラー
が返されます。適用範囲の参照を使用して、初期化されてない構成要素が含まれて
いる ARRAY の範囲の参照を回避するか、初期化されていない構成要素を NULL に設
定します。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参
照してください。
結果のタイプと値
結果は、入力配列引数の最大カーディナリティと同じサイズの ARRAY で、構成要素
のタイプは expr1 と同じです。結果の配列タイプのサイズは、現在のカーディナリ
ティを指すことに注意してください。
例
例: ARRAY を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price_diff item_price);
sale_price_diff と regular_price という配列の構成要素の値が次のようになっている
とします。
sale_price_diff[1:20] =
184
100, 200, 120, 140, 50, 160, 45, 10, 90, 100
50, 100, 200, 90, 250, 550, 200, 200, 50, 75
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_ARITHMETIC_FUNCTION
regular_price[1:20] =
50, 90, 80, 10, 45, 30, 20, 10, 90, 100,
100, 300, 230, 110, 500, 550, 200, 400, 100, 150
次の問合わせは、構成要素のタイプが item_price の 1-D ARRAY を返します。評価
中、regular_price 配列内の指定した適用範囲にある各構成要素を、算術関数
ARRAY_SUB を使用して sale_price_diff 配列の対応する構成要素と組み合わせます。
SELECT ARRAY_SUB(regular_price, sale_price_diff, 10, 20)
FROM inventory;
問合わせは、次の値を持つ 1-D ARRAY を返します。
output_array[1:20] = [ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, 50, 200, 30, 20, 250, 0, 0, 200, 50, 75]
次の問合わせでは、1-D ARRAY sale_price_diff 内のすべての構成要素にリテラル値
2 が加算されます。
SELECT ARRAY_ADD(sale_price_diff, 2) FROM inventory;
この問合わせは、次の値を持つ 1-D ARRAY を返します。
output_array[1:20] = [ 102, 202, 122, 142, 52, 162, 47, 12, 92, 102
52, 102, 202, 92, 252, 552, 202, 202, 52, 77]
次の問合わせは、ARRAY に算術演算を実行しながらフィルタ処理条件を使用する方
法を示したものです。この例では、適用範囲[10:20]内で値が 1000 未満のすべての
構成要素に 2 を乗じます。
SELECT ARRAY_MUL(regular_price, 2, 10, 20) FROM inventory
WHERE ARRAY_COUNT_DISTINCT(ARRAY_LT(regular_price,1000,10,20),1)>1;
この問合わせは、次の値を持つ 1-D ARRAY を返します。
output_array[1:20] = [NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, 200, 600, 460, 220, 1000, 1100, 400, 800, 200, 300]
例: ARRAY を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER DEFAULT NULL;
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、操作の結果更新された適用範囲の参照[10:20][10:20]に構成要素
を持つ shot_ary タイプの ARRAY を返します。評価中、shot1 内の指定した適用範
囲の参照にある各構成要素を、算術関数 ARRAY_ADD を使用して shot2 の対応する
構成要素と組み合わせます。
SQL 関数、演算子、式および述部
185
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_SUM
SELECT ARRAY_ADD(shot1, shot2, NEW arrayVec(10, 20),
NEW arrayVec(10,20))
FROM seismic_data;
次の問合わせでは、shot1 配列の指定した適用範囲の参照内のすべての構成要素にリ
テラル値 9 が加算されます。
SELECT ARRAY_ADD(shot1, 9, NEW arrayVec(10,10), NEW arrayVec(20,20))
FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_ADD(9, NEW arrayVec(10,10), NEW arrayVec(20,20)) FROM
seismic_data;
次の問合わせは、n-D ARRAY に算術演算を実行しながらフィルタ処理条件を使用す
る方法を示したものです。この例では、適用範囲[10:20][10:20]内で負の数を値に持
つすべての構成要素にゼロを乗じます。
SELECT ARRAY_MUL(shot1, 0, NEW arrayVec(10,10), NEW arrayVec(20,20))
FROM seismic_data
WHERE ARRAY_COUNT_DISTINCT(ARRAY_LT(shot1, 0, NEW arrayVec(10,10),
NEW arrayVec(20,20)),0)>1;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ARRAY_SUM
目的
array_expr 内の各構成要素の値を加算した総合計、または指定した適用範囲内の構
成要素の合計を表わす値を返します。
構文
システム関数の構文
ARRAY_SUM
( array_expr
)
scope_reference
メソッドスタイルの構文
array_expr.ARRAY_SUM
(
)
scope_reference
186
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_SUM
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_SUM は、引数として配列式を取り、配列引数内の各構成要素の値を加算し
た総合計を表わすスカラー値を返します。配列引数の構成要素のタイプは数値でな
ければなりません。適用範囲の参照を指定する場合は、合計は指定された適用範囲
内にある構成要素のみに適用されます。
影響を受ける構成要素は、条件式によるフィルタ処理はできません 。そのため、
ARRAY_SUM を呼び出す SELECT 文では、WHERE 句に配列リレーショナル式を含
めてはいけません。
配列引数に NULL 構成要素があると、その構成要素は無視され、計算には考慮され
ません。配列引数に初期化されていない状態にある構成要素が含まれている場合、
エラーが返されます。適用範囲の参照を使用して、初期化されてない構成要素を持
つ配列の範囲の参照を回避するか、初期化されていない構成要素を NULL に設定し
ます。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参照し
てください。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
ARRAY_SUM の結果のタイプは NUMBER となります。ただし、配列引数の構成要
素のタイプが FLOAT である場合を除きます。この場合、結果のタイプは FLOAT と
なります。
SQL 関数、演算子、式および述部
187
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_SUM
例
例: ARRAY_SUM を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
次の問合わせを評価するとき、regular_price 配列の各構成要素の値が加算されます。
結果の値は 2 で除算されます。
SELECT ARRAY_SUM(regular_price) / 2 FROM inventory;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT regular_price.ARRAY_SUM() / 2 FROM inventory;
次の問合わせでは、ARRAY_SUM により、regular_price 配列内の指定した適用範囲
内にある各構成要素が加算されます。問合わせからは、regular_price 配列内の影響
を受ける構成要素の値を加算した総合計を表わす値が返ります。
SELECT ARRAY_SUM(regular_price, NEW arrayVec(5,10))FROM inventory;
次に、同じ問合わせを指定する別の方法を示します。
SELECT ARRAY_SUM(regular_price, 5, 10) FROM inventory;
例: ARRAY_SUM を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせを評価するとき、shot1 配列内の各構成要素の値が加算されます。結果
の値は 2 で除算されます。
SELECT ARRAY_SUM(shot1) / 2 FROM seismic_data;
次の問合わせでは、ARRAY_SUM により、shot1 配列内の指定した適用範囲の参照内
にある各構成要素が加算されます。問合わせからは、shot1 配列内の影響を受ける構
成要素の値を加算した総合計を表わす値が返ります。
SELECT ARRAY_SUM(shot1, NEW arrayVec(5,5), NEW arrayVec(10,10)) FROM
seismic_data;
188
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_AVG
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ARRAY_AVG
目的
array_expr 内のすべての構成要素の値の平均値または指定された適用範囲内の構成
要素の平均値を返します。
構文
システム関数の構文
ARRAY_AVG
( array_expr
)
scope_reference
メソッドスタイルの構文
array_expr.ARRAY_AVG
(
)
scope_reference
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_AVG は、引数として配列式を取り、FLOAT タイプのスカラー値を返しま
す。この値は、配列引数内の各構成要素の値の加算を表わし、この結果を構成要素
の合計数で除算した結果を表わします。配列引数の構成要素のタイプは数値でなけ
SQL 関数、演算子、式および述部
189
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_AVG
ればなりません。適用範囲の参照を指定する場合は、関数は指定された適用範囲内
にある構成要素のみに適用されます。
影響を受ける構成要素は、条件式によるフィルタ処理はできません 。そのため、
ARRAY_AVG を呼び出す SELECT 文では、WHERE 句に配列リレーショナル式を含め
てはいけません。
配列引数に NULL 構成要素があると、その構成要素は無視され、計算には考慮され
ません。配列引数に初期化されていない状態にある構成要素が含まれている場合、
エラーが返されます。適用範囲の参照を使用して、初期化されてない構成要素を持
つ配列の範囲の参照を回避するか、初期化されていない構成要素を NULL に設定し
ます。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参照し
てください。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
ARRAY_AVG の結果のデータ タイプは FLOAT です。
例
例: ARRAY_AVG を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
次の問合わせを評価するとき、regular_price 配列の各構成要素の値が加算されます。
その後で、すべての構成要素の値の総合計を regular_price 配列内の構成要素数で除
算します。
SELECT ARRAY_AVG(regular_price) FROM inventory;
次の問合わせでは、ARRAY_AVG により、regular_price 配列内の指定した適用範囲
内にある各構成要素が加算されます。結果は、影響を受ける regular_price の構成要
素の値を加算した総合計を、指定した適用範囲を構成する要素の総合計数で除算し
たものを表わすスカラー値です。
SELECT ARRAY_AVG(regular_price, 5, 10)FROM inventory;
例: ARRAY_AVG を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
190
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_MAX
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせを評価するとき、shot1 配列内の各構成要素の値が加算されます。そ
の後で、すべての構成要素の値の総合計を shot1 配列内の構成要素数で除算します。
SELECT ARRAY_AVG(shot1) FROM seismic_data;
次の問合わせでは、ARRAY_AVG により、shot1 配列内の指定した適用範囲の参照
内にある各構成要素が加算されます。結果は、影響を受ける shot1 の構成要素の値
を加算した総合計を、指定した適用範囲を構成する要素の総合計数で除算したもの
を表わすスカラー値です。
SELECT ARRAY_AVG(shot1, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_AVG(NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
ARRAY_MAX
目的
array_expr 内のすべての構成要素の値の最大値または指定された適用範囲内の構成
要素の最大値を返します。
構文
システム関数の構文
ARRAY_MAX
( array_expr
)
, scope_reference
メソッドスタイルの構文
array_expr.ARRAY_MAX
(
)
, scope_reference
構文要素
array_expr
次のいずれかである ARRAY 式。
SQL 関数、演算子、式および述部
191
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_MAX
•
•
•
•
ARRAY 列の参照
ARRAY コンストラクタ式
UDF 式
UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_MAX は、引数として配列式を取り、配列を構成するすべての要素の最大値
を表わす構成要素の値を返します。適用範囲の参照を指定する場合は、関数は指定
された適用範囲内にある構成要素のみに適用されます。
影響を受ける構成要素は、条件式によるフィルタ処理はできません 。そのため、
ARRAY_MAX を呼び出す SELECT 文では、WHERE 句に配列リレーショナル式を含め
てはいけません。
配列引数に NULL 構成要素があると、その構成要素は無視され、計算には考慮され
ません。配列引数に初期化されていない状態にある構成要素が含まれている場合、
エラーが返されます。適用範囲の参照を使用して、初期化されてない構成要素を持
つ配列の範囲の参照を回避するか、初期化されていない構成要素を NULL に設定し
ます。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参照し
てください。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
結果のタイプは、配列引数の構成要素のタイプと同じです。
例
例: ARRAY_MAX を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
192
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_MIN
次の問合わせは、regular_price 配列内のすべての構成要素の値の最大値となる構成
要素の値を返します。
SELECT ARRAY_MAX(regular_price) FROM inventory;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT regular_price.ARRAY_MAX() FROM inventory;
次の問合わせは、regular_price 配列内の指定した適用範囲内の構成要素の値の最大
値となる構成要素の値を返します。
SELECT ARRAY_MAX(regular_price, 5, 10)FROM inventory;
例: ARRAY_MAX を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、short1 配列内のすべての構成要素の値の最大値となる構成要素の
値を返します。
SELECT ARRAY_MAX(shot1) FROM seismic_data;
次の問合わせは、shot1 配列内の指定した適用範囲内の構成要素の値の最大値とな
る構成要素の値を返します。
SELECT ARRAY_MAX(shot1, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
ARRAY_MIN
目的
array_expr 内のすべての構成要素の値の最小値または指定された適用範囲内の構成
要素の最小値を返します。
構文
システム関数の構文
ARRAY_MIN
( array_expr
)
, scope_reference
メソッドスタイルの構文
SQL 関数、演算子、式および述部
193
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_MIN
array_expr.ARRAY_MIN
(
)
, scope_reference
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_MIN は、引数として配列式を取り、配列を構成するすべての要素の最小値
を表わす構成要素の値を返します。適用範囲の参照を指定する場合は、関数は指定
された適用範囲内にある構成要素のみに適用されます。
影響を受ける構成要素は、条件式によるフィルタ処理はできません 。そのため、
ARRAY_MIN を呼び出す SELECT 文では、WHERE 句に配列リレーショナル式を含め
てはいけません。
配列引数に NULL 構成要素があると、その構成要素は無視され、計算には考慮され
ません。配列引数に初期化されていない状態にある構成要素が含まれている場合、
エラーが返されます。適用範囲の参照を使用して、初期化されてない構成要素を持
つ配列の範囲の参照を回避するか、初期化されていない構成要素を NULL に設定し
ます。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参照し
てください。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
結果のタイプは、配列引数の構成要素のタイプと同じです。
194
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_MIN
例
例: ARRAY_MIN を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
次の問合わせは、regular_price 配列内のすべての構成要素の値の最小値となる構成
要素の値を返します。
SELECT ARRAY_MIN(regular_price) FROM inventory;
次の問合わせは、regular_price 配列内の指定した適用範囲内の構成要素の値の最小
値となる構成要素の値を返します。
SELECT ARRAY_MIN(regular_price, 5, 10)FROM inventory;
例: ARRAY_MIN を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、short1 配列内のすべての構成要素の値の最小値となる構成要素の
値を返します。
SELECT ARRAY_MIN(shot1) FROM seismic_data;
次の問合わせは、shot1 配列内の指定した適用範囲内の構成要素の値の最小値とな
る構成要素の値を返します。
SELECT ARRAY_MIN(shot1, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_MIN(NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
SQL 関数、演算子、式および述部
195
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COUNT_DISTINCT
ARRAY_COUNT_DISTINCT
目的
array_expr 内の、任意選択で指定した入力値と一致する固有(Distinct)構成要素の数
を返します。
構文
システム関数の構文
ARRAY_COUNT_DISTINCT
( array_expr
)
, scope_reference
, matching_expr
メソッドスタイルの構文
array_expr.ARRAY_COUNT_DISTINCT
(
)
scope_reference
, matching_expr
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
配列の構成要素のタイプは NUMERIC データ型でなければなりません。
scope_reference
ARRAY 適用範囲の参照。
matching_expr
配列内の 1 つ以上の要素と一致させる式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_COUNT_DISTINCT は、引数として配列式を取り、可能な 2 つの出力の 1 つ
を表わす値を返します。
• 任意選択の引数 matching_expr を指定する場合、関数は、matching_expr と値が
等しい array_expr 内の構成要素の数を返します。matching_expr が NULL の場
合、関数は NULL の構成要素の値を返します。
196
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COUNT_DISTINCT
• 任意選択の引数 matching_expr を指定しない場合、関数は、array_expr 内の固
有(Distinct)構成要素の数を返します。配列引数に NULL 構成要素があると、その
構成要素は無視され、計算には考慮されません。
適用範囲の参照を指定する場合は、関数は指定された適用範囲内にある構成要素の
みに適用されます。ARRAY_COUNT_DISTINCT は、構成要素のタイプが数値と文字
の配列で使用できます。
配列引数に初期化されていない状態にある構成要素が含まれている場合、エラーが
返されます。適用範囲の参照を使用して、初期化されてない構成要素を持つ配列の
範囲の参照を回避するか、初期化されていない構成要素を NULL に設定します。こ
れは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参照してくださ
い。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
結果の型は INTEGER です。
例
例: ARRAY_COUNT_DISTINCT を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS DECIMAL(7,2) ARRAY[20];
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
次の問合わせで、ARRAY_COUNT_DISTINCT は regular_price 配列内の適用範囲の
参照内で 100 に等しい値を持つ構成要素の数を返します。
SELECT ARRAY_COUNT_DISTINCT(regular_price, 5, 10, 100) FROM inventory;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT regular_price.ARRAY_COUNT_DISTINCT(5, 10, 100) FROM inventory;
次の問合わせは、regular_price 配列内の固有(Distinct)構成要素の数を返します。
SELECT ARRAY_COUNT_DISTINCT(regular_price)FROM inventory;
例: ARRAY_COUNT_DISTINCT を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
SQL 関数、演算子、式および述部
197
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_GET
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせで、ARRAY_COUNT_DISTINCT は short1 配列内の指定した適用範囲内
で 100 に等しい値を持つ構成要素の数を返します。
SELECT ARRAY_COUNT_DISTINCT(shot1, NEW arrayVec(5,5), NEW
arrayVec(10,10), 100) FROM seismic_data;
ARRAY_GET
目的
指定した索引位置に対応する array_expr 内の構成要素の値を返します。
構文
システム関数の構文
ARRAY_GET
( array_expr, array_index )
メソッドスタイルの構文
array_expr.ARRAY_GET
( array_index )
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
array_index
次のいずれかを指定します:
• 整数値。
• 事前定義された配列タイプ ArrayVec の配列インスタンスで、境界を定義する整
数値のカンマ区切りリストを指定したもの。
• array_index の値は、array_expr の範囲内である必要があります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
198
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_GET
使用上の注意
ARRAY_GET は、引数として配列式を取り、array_index で指定した位置に対応する
array_expr 内の構成要素の値を返します。
array_expr が 1 次元 ARRAY タイプの場合、位置決めする構成要素の索引は
INTEGER または ArrayVec 型で定義され、array_expr の定義済みの境界の範囲内に
なければなりません。
array_expr が多次元 ARRAY タイプの場合、位置決めする構成要素の索引は、事前
定義された配列タイプ ArrayVec を使用して定義されます。ArrayVec タイプの詳細
は、「ARRAY 適用範囲の参照」を参照してください。ArrayVec により定義される
次元数は、2~5 (サポートされる次元数の最大値)とし、array_expr 内の次元数に対
応しなければなりません。各次元の値はカンマで区切り、array_expr の定義済みの
境界の範囲内でなければなりません。
array_index の値が初期化されていない状態の ARRAY の構成要素を参照する場合、
エラーが返されます。初期化されてない ARRAY の構成要素の参照を回避するには、
初期化されていない構成要素を NULL に設定します。これは、OEXTEND メソッド
を使用して行なえます。「OEXTEND」を参照してください。
array_expr が NULL の場合、この関数は NULL を返します。
結果のタイプ
結果のタイプは、配列引数の構成要素のタイプと同じです。
例
例: ARRAY_GET を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE item_price AS VARRAY(50) OF DECIMAL(7,2);
CREATE TABLE inventory (itemkind INTEGER,
regular_price item_price,
sale_price item_price);
次の問合わせでは、ARRAY_GET は、regular_price 配列の位置 40 にある構成要素
の値を返します。
SELECT ARRAY_GET(regular_price,40) FROM inventory;
例: ARRAY_GET を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
SQL 関数、演算子、式および述部
199
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARE
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせでは、ARRAY_GET は、short1 配列の位置[5][10]にある構成要素の値
を返します。
SELECT ARRAY_GET(shot1, NEW arrayVec(5,10)) FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_GET(NEW arrayVec(5,10)) FROM seismic_data;
ARRAY_COMPARE
目的
2 つの配列の構成要素の対の比較を実行し、1、0、または NULL という値を返し、
2 つの配列の引数が同じ構成要素の値を含んでいるかどうかを示します。
構文
システム関数の構文
ARRAY_COMPARE
( expr1, expr2
)
, scope_reference, nulls_equal_flag
メソッドスタイルの構文
expr1.ARRAY_COMPARE
( expr2
)
, scope_reference, nulls_equal_flag
構文要素
expr1 /expr2
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
scope_reference
ARRAY 適用範囲の参照。
nulls_equal_flag
NULL 要素の値の比較方法を指定するフラグ。このパラメータに対して有効な値は、
0 と 1 です。
200
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_COMPARE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
関数は 2 つの配列の構成要素の対の比較を行ない、ANSI 規格による ARRAY 比較の
ルールに従います。
使用上の注意
ARRAY_COMPARE 関数は、2 つの配列引数の対の比較を行ない、2 つの配列式がす
べて同じ構成要素の値を含むかどうかを示すスカラー値を返します。
ARRAY_COMPARE は、次のような ANSI 配列比較のルールに従います。
1 expr1 または expr2 のどちらかが NULL と評価される場合、結果は NULL にな
ります。
2 expr1 のすべての構成要素の値が expr2 の構成要素の値と等しい場合にのみ、
expr1 および expr2 は等しくなります。
3 expr1 と expr2 両方が同じ値を持ち、配列内の同じ位置にある場合に限り、expr1
の構成要素の値は expr2 の構成要素の値と等しくなります。
4 非 NULL 構成要素が配列 A および配列 B の指定された構成要素と一致しない場
合、これは一致しないとみなされ、ARRAY_COMPARE は値 0 を返します。
5 指定した構成要素のどちらかまたは両方の値が NULL、かつ、配列内のそれ以外
のすべての構成要素が一致する場合、これは ANSI 規格に従って一致しないとみ
なされます。ANSI 規格に従えば、このケースの結果は UNKNOWN です。
Teradata では、これを NULL 結果と評価します。
上記のルール(1)または(5)を満たす場合、ARRAY_COMPARE は NULL を返します。
ルール(2)および(3)を満たす場合、ARRAY_COMPARE は 1 を返します。それ以外の
場合、ARRAY_COMPARE は 0 を返します。
任意選択の nulls_equal_flag を 1 に設定し、指定した構成要素の両方の値が NULL
の場合、これは一致するとみなされ、ANSI 規格とはずれがあります。それ以外のす
べての構成要素が一致する場合、上記のルール(2)が適用されます。
任意の引数 scope_reference を指定する場合は、関数は指定された適用範囲内にあ
る構成要素のみに適用されます。
配列引数に初期化されていない状態にある構成要素が含まれている場合、エラーが
返されます。適用範囲の参照を使用して、初期化されてない構成要素が含まれてい
る ARRAY の範囲の参照を回避するか、初期化されていない構成要素を NULL に設
定します。これは、OEXTEND メソッドを使用して行なえます。「OEXTEND」を参
照してください。
SQL 関数、演算子、式および述部
201
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE
制約事項
ARRAY 値のリレーショナル比較はできません。ARRAY データには、いかなるリレー
ショナル比較演算子も使用できません。リレーショナル比較ができるのは、ARRAY
の個々の構成要素に限られます。
例: ARRAY_COMPARE を使用した、テーブルの問合わせ
この例では、inventory テーブルには、2 つの ARRAY 列(sale_price_june および
sale_price_july)があり、次の構成要素の値を持っています。
sale_price_june[1:10] = 50, 100, 200, 90, 250, 550, 200, 200, 50, 75
sale_price_july[1:10] = 50, 100, 200, 90, 250, 550, 200, 200, 50, 75
sale_price_june 配列内のすべての構成要素の値が sale_price_july 配列の構成要素の
値に等しいので、次の問合わせの出力は 1 です。
SELECT ARRAY_COMPARE(sale_price_june, sale_price_july)
FROM inventory;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT sale_price_june.ARRAY_COMPARE(sale_price_july)
FROM inventory;
同じ配列を考えますが、構成要素の値は次のように異なっています。
sale_price_june[1:10] = 50, 100, 200, 90, 250, 550, 200, 200, 50, 75
sale_price_july[1:10] = 50, 100, 200, 90, 300, 550, 200, 200, 50, 75
位置 5 にある構成要素の値が 2 つの配列で異なるため、次の問合わせの出力は 0 で
す。
SELECT ARRAY_COMPARE(sale_price_june, sale_price_july)
FROM inventory;
次の問合わせは、位置 6~10 の構成要素の値を比較します。問合わせの出力は、両
方の配列の指定位置の構成要素の値が等しいため、1 になります。
SELECT ARRAY_COMPARE(sale_price_june, sale_price_july, 6, 10)
FROM inventory;
ARRAY_UPDATE
目的
array_expr 内の構成要素のすべてまたはサブセットを、指定した新しい値に更新し
ます。
構文
システム関数の構文
202
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE
ARRAY_UPDATE
( array_expr, new_value
)
,
scope_reference
array_index
,
scope_reference
array_index
メソッドスタイルの構文
array_expr.ARRAY_UPDATE
( new_value
)
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
new_value
array_expr のエレメント タイプと同じデータ型を持つ値と評価される式です。
scope_reference
ARRAY 適用範囲の参照。
array_index
次のいずれかを指定します:
• 整数値。
• 事前定義された配列タイプ ArrayVec の配列インスタンスで、境界を定義する整
数値のカンマ区切りリストを指定したもの。
• array_index の値は、array_expr の範囲内である必要があります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_UPDATE は、引数として配列式を取り、new_value で指定した値で
array_expr 内の構成要素のすべてまたはサブセットを更新します。
ARRAY_UPDATE 関数には、次に示すルールが適用されます。
• array_expr が NULL の場合、結果は NULL になります。
• new_value の値は、array_expr のエレメント タイプと同じデータ型と評価され
る必要があります。あるいは、暗黙的にエレメント タイプ ARRAY に変換できる
データ型であることが必要です。
SQL 関数、演算子、式および述部
203
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE
• scope_reference または array_index を指定しない場合、array_expr 内のすべての
構成要素が new_value の値に更新されます。
• scope_reference を指定すると、array_expr の適用範囲の参照内の構成要素のみ
が new_value の値に更新されます。scope_reference は配列内の連続する構成要
素を参照する必要があります。
• array_index を指定すると、array_index で指定した単一の構成要素のみが、
array_expr 内の new_value の値に更新されます。
• 更新する構成要素が NULL の場合、NULL は array_expr 内の new_value の値で置
換されます。
• 1 つ以上の構成要素が変更され、更新する構成要素より前に ARRAY 値内に初期化
されていない構成要素がある場合、ARRAY_UPDATE はそれ以前の初期化されて
いない構成要素に NULL に設定します。この動作は、ARRAY 構成要素値を設定す
る通常の SQL UPDATE 文の動作と同じです。
結果のタイプと値
ARRAY_UPDATE は、新しい値に更新された指定の構成要素を使って array_expr で
指定した配列の新しいコピーを返します。
例
例: ARRAY_UPDATE を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS CHAR(10) ARRAY[20];
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
次の問合わせは、すべての構成要素が新しい値に更新された phonelist 配列の更新後
のコピーを返します。
SELECT ARRAY_UPDATE(phonelist, '9095551234')
FROM employee_info;
次の問合わせは、適用範囲の参照で指定したように、構成要素のサブセットが新し
い値に更新された phonelist 配列の更新後のコピーを返します。その結果、構成要素
2、3、および 4 は新しい値に更新されます。配列内の残りの構成要素は元の値のま
まです。
SELECT ARRAY_UPDATE(phonelist, '9095551234', 2, 4)
FROM employee_info;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT phonelist.ARRAY_UPDATE('9095551234', 2, 4)
FROM employee_info;
204
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE_STRIDE
例: ARRAY_UPDATE を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、すべての構成要素は新しい値に更新された short1 配列の更新後の
コピーを返します。
SELECT ARRAY_UPDATE(shot1, 0)
FROM seismic_data;
次の問合わせは、適用範囲の参照で指定したように、構成要素のサブセットが新し
い値に更新された short1 配列の更新後のコピーを返します。その結果、適用範囲の
参照範囲[5:10][5:10]内にある構成要素は新しい値に更新されます。配列内の残りの
構成要素は元の値のままです。
SELECT ARRAY_UPDATE(shot1, 0, NEW arrayVec(5,5), NEW arrayVec(10,10))
FROM seismic_data;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ARRAY_UPDATE_STRIDE
目的
array_expr 内の構成要素のすべてまたはサブセットを、指定した新しい値に更新し
ます。stride 引数は、構成要素を更新するにあたり、構成要素をいくつスキップす
るかを示します。
構文
システム関数の構文
ARRAY_ADD
( expr1, expr2
ARRAY_SUB
)
, scope_reference
ARRAY_MUL
ARRAY_DIV
ARRAY_MOD
メソッドスタイルの構文
SQL 関数、演算子、式および述部
205
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE_STRIDE
array_expr.ARRAY_UPDATE_STRIDE
( new_value, stride
)
,
scope_reference
array_index
構文要素
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
new_value
array_expr のエレメント タイプと同じデータ型を持つ値と評価される式です。
stride
構成要素を更新するにあたり、構成要素をスキップする数を示す符号なし整数値。
scope_reference
ARRAY 適用範囲の参照。
array_index
次のいずれかを指定します:
• 整数値。
• 事前定義された配列タイプ ArrayVec の配列インスタンスで、境界を定義する整
数値のカンマ区切りリストを指定したもの。
• array_index の値は、array_expr の範囲内である必要があります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ARRAY_UPDATE_STRIDE は、引数として配列式を取り、new_value で指定した値で
array_expr 内の構成要素のすべてまたはサブセットを更新します。stride 引数は、
構成要素を更新するにあたり、構成要素をいくつスキップするかを示します。
ARRAY_UPDATE_STRIDE 関数には、次に示すルールが適用されます。
• array_expr が NULL の場合、結果は NULL になります。
• new_value の値は、array_expr のエレメント タイプと同じデータ型と評価される
必要があります。あるいは、暗黙的にエレメント タイプ ARRAY に変換できるデー
タ型であることが必要です。
206
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE_STRIDE
• scope_reference または array_index を指定しない場合、array_expr 内のすべて
の構成要素が new_value の値に更新されます。
• scope_reference を指定すると、array_expr の適用範囲の参照内の構成要素のみ
が new_value の値に更新されます。scope_reference は配列内の連続する構成要
素を参照する必要があります。
• array_index を指定する場合、array_index で指定した単一の構成要素のみが、
array_expr 内の new_value の値に更新されます。この場合、stride_value は影響
しません。
• stride_value 引数は、更新対象の構成要素の間でスキップする構成要素の数を指
定します。例えば、stride_value が 1 の場合、影響を受ける構成要素の範囲内で
1 つおきに更新されます。影響を受ける構成要素の範囲は、scope_reference が
指定されているかどうかによって異なります。多次元配列の場合、構成要素は行
優先順で格納されるので、この順序で進みながら stride_value に従ってスキップ
されます。
• 更新する構成要素が NULL の場合、NULL は array_expr 内の new_value の値で
置換されます。
• 1 つ以上の構成要素が変更され、更新する構成要素より前に ARRAY 値内に初期
化されていない構成要素がある場合、ARRAY_UPDATE_STRIDE はそれ以前の初
期化されていない構成要素に NULL に設定します。この動作は、ARRAY 構成要
素値を設定する通常の SQL UPDATE 文の動作と同じです。
• それまでに初期化されていなかった構成要素をスキップすると、NULL に更新さ
れます。
結果のタイプと値
ARRAY_UPDATE_STRIDE は、新しい値に更新された指定の構成要素を使って
array_expr で指定した配列の新しいコピーを返します。
例
例: ARRAY_UPDATE_STRIDE を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS CHAR(10) ARRAY[20];
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
次の問合わせは、構成要素が 1 つおきに新しい値に更新された phonelist 配列の更
新後のコピーを返します。
SELECT ARRAY_UPDATE_STRIDE(phonelist, '9095551234', 1)
FROM employee_info;
次の問合わせは、適用範囲の参照と STRIDE 値で指定したように、構成要素のサブ
セットが新しい値に更新された phonelist 配列の更新後のコピーを返します。その
SQL 関数、演算子、式および述部
207
第 4 章 ARRAY/VARRAY 関数および演算子
ARRAY_UPDATE_STRIDE
結果、構成要素 2 および 4 は新しい値に更新されます。配列内の残りの構成要素は
元の値のままです。
SELECT ARRAY_UPDATE_STRIDE(phonelist, '9095551234', 1, 2, 4)
FROM employee_info;
例: ARRAY_UPDATE_STRIDE を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS INTEGER ARRAY[1:50][1:50];
CREATE TABLE seismic_data (
id INTEGER,
shot1 shot_ary,
shot2 shot_ary);
次の問合わせは、構成要素が 1 つ置きに新しい値に更新された shot1 配列の更新後
のコピーを返します。
SELECT ARRAY_UPDATE_STRIDE(shot1, 0, 1)
FROM seismic_data;
次の問合わせは、適用範囲の参照と STRIDE 値で指定したように、構成要素のサブ
セットが新しい値に更新された short1 配列の更新後のコピーを返します。その結
果、適用範囲の参照範囲[1:50][1:50]内にある最初の構成要素から始めて、5 つ目ご
との構成要素が新しい値に更新されます。配列内の残りの構成要素は元の値のまま
です。
SELECT ARRAY_UPDATE_STRIDE(shot1, 0, 5, NEW arrayVec(1,1),
NEW arrayVec(50,50))
FROM seismic_data;
次は、メソッドスタイルの構文を使用した同じ問合わせです。
SELECT shot1.ARRAY_UPDATE_STRIDE (0, 5, NEW arrayVec(1,1),
NEW arrayVec(50,50))
FROM seismic_data;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
208
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OEXISTS
OEXISTS
目的
array_expr 内の索引で指定された構成要素が値を含んでいるのか、初期化されてい
ない状態なのかを示す整数値を戻します。
構文
システム関数の構文
OEXISTS
( array_expr,
index_value
)
array_bound
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OEXISTS
(
index_value
)
array_bound
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
index_value
符号なし整数値。
array_bound
事前定義された配列型 ArrayVec の配列インスタンスで、境界を定義する整数値の
カンマ区切りリストを指定したもの。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OEXISTS は、引数として配列式を取り、索引で指定された構成要素は、値が入って
いるのか、初期化されていない状態なのかをチェックします。指定された構成要素
SQL 関数、演算子、式および述部
209
第 4 章 ARRAY/VARRAY 関数および演算子
OEXISTS
に非 NULL または NULL が含まれる場合、OEXISTS は 1 を返します。構成要素が初
期化されていない状態の場合、メソッドは 0 を返します。
index_value または array_bound の値が array_expr の範囲外にある場合、OEXISTS
は 0 を返します。index_value または array_bound が NULL の場合は 0 の値が返さ
れます。array_expr が NULL の場合は、関数が存在しないことを示すエラーが返さ
れます。
array_expr がすべての構成要素が初期化されていない状態にある空の配列を参照し
ている場合、OEXISTS は 0 を返します。整数の index_value 引数を指定した OEXISTS
メソッドは、1 次元 ARRAY タイプの Oracle EXISTS メソッドと互換性があります。
結果のタイプと値
OEXISTS は、1 または 0 の整数値を返します。
例
例: OEXISTS を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update the empty ARRAY instance such that element 3 is set to a value;
then elements 1 and 2 are set to NULL, the rest are uninitialized. */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、phonelist 配列の構成要素 2 に値が含まれているかどうかを確認し
ます。
SELECT eno, phonelist.OEXISTS(2)
FROM employee_info;
問合わせの結果を次に示します。
ENO
---
210
phonelist.OEXISTS(2)
--------------------
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OEXISTS
1
2
1
1
(element 2 contains a value that is non-NULL)
(element 2 contains a NULL)
次の問合わせは、phonelist 配列の構成要素 3 に値が含まれているかどうかを確認し
ます。
SELECT eno, phonelist.OEXISTS(3)
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OEXISTS(3)
-------------------0
(element 3 is in an uninitialized state)
1
(element 3 contains a value that is non-NULL)
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, OEXISTS(phonelist, 3)
FROM employee_info;
例: OEXISTS を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update the empty ARRAY instance such that element [1][3] is set to a
value; then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、shots 配列の構成要素[1][2]に値が含まれているかどうかを確認し
ます。
SELECT id, shots.OEXISTS(NEW arrayVec(1, 2))
FROM seismic_table;
問合わせの結果を次に示します。
SQL 関数、演算子、式および述部
211
第 4 章 ARRAY/VARRAY 関数および演算子
OCOUNTOCOUNT
ID
-1
2
shots.OEXISTS(new arrayVec(1, 2))
--------------------------------1
(element [1][2] contains a value that is non-NULL)
1
(element [1][2] contains a NULL)
次の問合わせは、shots 配列の構成要素[1][3]に値が含まれているかどうかを確認し
ます。
SELECT id, shots.OEXISTS(NEW arrayVec(1, 3))
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
NULL)
shots.OEXISTS(NEW arrayVec(1, 3))
--------------------------------0
(element [1][3] is in an uninitialized state)
1
(element [1][3] contains a value that is non-
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
OCOUNTOCOUNT
目的
NULL または非 NULL 値のいずれかを含む array_expr 内の構成要素の数を返します。
構文
システム関数の構文
OCOUNT
( array_expr )
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OCOUNT
( )
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
212
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OCOUNTOCOUNT
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OCOUNT は、引数として配列式を取り、非 NULL または NULL である値を含む構成
要素の数を返します。初期化されていない状態にある構成要素はカウントされませ
ん。配列が空の(配列のすべての構成要素が初期化されていない状態にある)場合、
OCOUNT は値 0 を返します。
array_expr が NULL の場合は、エラーが返されます。
OCOUNT メソッドは、1 次元 ARRAY タイプの Oracle COUNT メソッドと互換性が
あります。ただし、Teradata 構文では空の括弧が必要とされる点は、Oracle 構文と
は異なります。
結果のタイプ
OCOUNT は符号無し整数値を返します。
例
例: OCOUNT を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update the empty ARRAY instance such that element 3 is set to a
SQL 関数、演算子、式および述部
213
第 4 章 ARRAY/VARRAY 関数および演算子
OCOUNTOCOUNT
value; then elements 1 and 2 are set to NULL, the rest are uninitialized.
*/
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、NULL または非 NULL 値を含む phonelist 配列内の要素の数を返し
ます。
SELECT eno, phonelist.OCOUNT()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
non-NULL)
phonelist.OCOUNT()
-----------------2
(the first 2 elements have values that are non-NULL)
3
(the first 3 elements have NULL or values that are
例: OCOUNT を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update the empty ARRAY instance such that element [1][3] is set to a
value; then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、NULL または非 NULL 値を含む shots 配列内の要素の数を返します。
SELECT id, shots.OCOUNT()
FROM seismic_table;
問合わせの結果を次に示します。
214
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OLIMITOLIMIT
ID
-1
2
non-NULL)
shots.OCOUNT()
-------------2
(the first 2 elements contain values that are non-NULL)
3
(the first 3 elements contain NULL or values that are
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT id, OCOUNT(shots)
FROM seismic_table;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
OLIMITOLIMIT
目的
array_expr 内で取り得る最大の添え字値を、符号なし整数値または事前定義された
ARRAY タイプ ArrayVec の新しいインスタンスとして返します。
構文
システム関数の構文
OLIMIT
( array_expr )
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OLIMIT
( )
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
SQL 関数、演算子、式および述部
215
第 4 章 ARRAY/VARRAY 関数および演算子
OLIMITOLIMIT
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OLIMIT は、引数として配列式を取り、その ARRAY タイプで取り得る最大の添字値
を返します。array_expr が 1 次元 ARRAY タイプの場合、OLIMIT は符号なし
INTEGER 値を返します。array_expr が多次元 ARRAY タイプの場合、OLIMIT は、添
字情報も含めて、事前定義された ARRAY タイプ ArrayVec の新しいインスタンスを
返します。
array_expr が NULL の場合は、エラーが返されます。
OLIMIT メソッドは、1 次元 ARRAY タイプの Oracle LIMIT メソッドと互換性があり
ます。ただし、Teradata 構文では空の括弧が必要とされる点は、Oracle 構文とは異
なります。
結果のタイプ
OLIMIT は、符号なし整数値または事前定義された ARRAY タイプ ArrayVec の新し
いインスタンスを返します。
例
例: OLIMIT を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
次の問合わせは、phonelist 配列で取り得る最大の添字値を返します。
SELECT eno, phonelist.OLIMIT()
FROM employee_info;
問合わせの結果を次に示します。
216
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OFIRST
ENO
--1
2
phonelist.OLIMIT()
-----------------20
20
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, OLIMIT(phonelist)
FROM employee_info;
例: OLIMIT を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
次の問合わせは、shots 配列で取り得る最大の添字値を返します。
SELECT id, shots.OLIMIT()
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
shots.OLIMIT()
-------------NEW arrayVec(50,50)
NEW arrayVec(50,50)
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
OFIRST
目的
array_expr 内で最小の添え字値を、符号なし整数値または事前定義された ARRAY
タイプ型 ArrayVec の新しいインスタンスとして返します。
SQL 関数、演算子、式および述部
217
第 4 章 ARRAY/VARRAY 関数および演算子
OFIRST
構文
システム関数の構文
OFIRST
( array_expr )
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OFIRST
( )
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OFIRST は、引数として配列式を取り、その ARRAY タイプで最小の添字値を返しま
す。array_expr が 1 次元 ARRAY タイプの場合、OFIRST は符号なし整数値を返しま
す。array_expr が多次元 ARRAY タイプの場合、OFIRST は、配列内で最初の構成要
素の添字情報も含めて、事前定義された ARRAY タイプ ArrayVec の新しいインスタ
ンスを返します。配列が空の(配列のすべての構成要素が初期化されていない状態に
ある)場合、OFIRST は NULL を返します。
array_expr が NULL の場合は、エラーが返されます。
OFIRST メソッドは、1 次元 ARRAY タイプの Oracle FIRST メソッドと互換性があり
ます。ただし、Teradata 構文では空の括弧が必要とされる点は、Oracle 構文とは異
なります。
結果のタイプ
OFIRST は、符号なし整数値または事前定義された ARRAY タイプ ArrayVec の新し
いインスタンスを返します。
218
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OFIRST
例
例: OFIRST を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
次の問合わせは、phonelist 配列で最小の添字値を返します。
SELECT eno, phonelist.OFIRST()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OFIRST()
-----------------1
1
例: OFIRST を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
次の問合わせは、shots 配列で最小の添字値を返します。
SELECT id, shots.OFIRST()
FROM seismic_table;
SQL 関数、演算子、式および述部
219
第 4 章 ARRAY/VARRAY 関数および演算子
OLASTOLAST
問合わせの結果を次に示します。
ID
-1
2
shots.OFIRST()
-------------NEW arrayVec(1,1)
NEW arrayVec(1,1)
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT id, OFIRST(shots)
FROM seismic_table;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
OLASTOLAST
目的
array_expr 内に取り込まれた構成要素の最大の添字値を返します。
構文
システム関数の構文
OLAST
( array_expr )
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OLAST
( )
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
220
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OLASTOLAST
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OLAST は、引数として配列式を取り、その ARRAY タイプに取り込まれた構成要素
の最大の添字値を返します。これは、OLIMIT メソッドから返される取り得る最大
の添字値とは異なります。array_expr が 1 次元 ARRAY タイプの場合、OLAST は符
号なし INTEGER 値を返します。array_expr が多次元 ARRAY タイプの場合、OLAST
は、添字情報も含めて、事前定義された ARRAY タイプ ArrayVec の新しいインスタ
ンスを返します。配列が空の(配列のすべての構成要素が初期化されていない状態に
ある)場合、OLAST は NULL を返します。
array_expr が NULL の場合は、エラーが返されます。
OLAST メソッドは、1 次元 ARRAY タイプの Oracle LAST メソッドと互換性があり
ます。ただし、Teradata 構文では空の括弧が必要とされる点は、Oracle 構文とは異
なります。
結果のタイプ
OLAST は、符号なし整数値または事前定義された ARRAY タイプ ArrayVec の新し
いインスタンスを返します。
例
例: OLAST を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
SQL 関数、演算子、式および述部
221
第 4 章 ARRAY/VARRAY 関数および演算子
OLASTOLAST
次の問合わせは、phonelist 配列に取り込まれた構成要素の最大の添字値を返します。
SELECT eno, phonelist.OLAST()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OLAST()
----------------2
3
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, OLAST(phonelist)
FROM employee_info;
例: OLAST を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、shots 配列に取り込まれた構成要素の最大の添字値を返します。
SELECT id, shots.OLAST()
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
222
shots.OLAST()
-----------------NEW arrayVec(1,2)
NEW arrayVec(1,3)
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OPRIOR
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
OPRIOR
目的
array_expr に対して指定された構成要素が現在取り込まれている場合、それより前
の構成要素の添字を返します。
構文
システム関数の構文
OPRIOR
( array_expr,
integer_value
)
array_bound
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.OPRIOR
(
integer_value
)
array_bound
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
integer_value
符号なし整数値。
array_bound
事前定義された配列型 ArrayVec の配列インスタンスで、境界を定義する整数値の
カンマ区切りリストを指定したもの。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
223
第 4 章 ARRAY/VARRAY 関数および演算子
OPRIOR
使用上の注意
OPRIOR は、引数として配列式を取り、integer_value または array_bound で指定さ
れた構成要素が現在取り込まれている場合、それより前の構成要素の添字を返しま
す。その配列の OFIRST 値以下の構成要素の添字を指定すると、NULL が返されま
す。integer_value または array_bound が NULL の場合は、エラーが返されます。
array_expr が 1 次元 ARRAY タイプの場合、OPRIOR は符号なし INTEGER 値を返し
ます。array_expr が多次元 ARRAY タイプの場合、OPRIOR は、添字情報も含めて、
事前定義された ARRAY タイプ ArrayVec の新しいインスタンスを返します。配列が
空の(配列のすべての構成要素が初期化されていない状態にある)場合、OPRIOR は
NULL を返します。
array_expr が NULL の場合は、エラーが返されます。
整数の引数を 1 つ指定した OPRIOR メソッドは、1 次元 ARRAY タイプの Oracle
PRIOR メソッドと互換性があります。
結果のタイプ
OPRIOR は、符号なし整数値または事前定義された ARRAY タイプ ArrayVec の新し
いインスタンスを返します。
例
例: OPRIOR を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、phonelist 配列の構成要素 2 より前の構成要素の添字値を返します。
224
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OPRIOR
SELECT eno, phonelist.OPRIOR(2)
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OPRIOR(2)
------------------1
1
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, OPRIOR(phonelist, 2)
FROM employee_info;
例: OPRIOR を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、shots 配列の構成要素[1][2]より前の構成要素の添字値を返します。
SELECT id, shots.OPRIOR(NEW arrayVec(1, 2))
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
SQL 関数、演算子、式および述部
shots.OPRIOR(NEW arrayVec(1, 2))
-------------------------------NEW arrayVec(1,1)
NEW arrayVec(1,1)
225
第 4 章 ARRAY/VARRAY 関数および演算子
ONEXT
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ONEXT
目的
array_expr に対して指定された構成要素が現在取り込まれている場合、それより後
の構成要素の添字を返します。
構文
システム関数の構文
ONEXT
( array_expr,
integer_value
)
array_bound
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.ONEXT
(
integer_value
)
array_bound
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
詳細については、「ARRAY_Constructor_Expression」を参照してください。
integer_value
符号なし整数値。
array_bound
事前定義された配列型 ArrayVec の配列インスタンスで、境界を定義する整数値のカ
ンマ区切りリストを指定したもの。
詳細については、「ARRAY 適用範囲の参照」を参照してください。
226
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ONEXT
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ONEXT は、引数として配列式を取り、integer_value または array_bound で指定さ
れた構成要素が現在取り込まれている場合、それより後の構成要素の添字を返しま
す。その配列の OLAST 値より大きい構成要素の添字を指定すると、NULL が返され
ます。integer_value または array_bound が NULL の場合は、エラーが返されます。
array_expr が 1 次元 ARRAY タイプの場合、ONEXT は符号なし INTEGER 値を返し
ます。array_expr が多次元 ARRAY タイプの場合、ONEXT は、添字情報も含めて、
事前定義された ARRAY タイプ ArrayVec の新しいインスタンスを返します。配列が
空の(配列のすべての構成要素が初期化されていない状態にある)場合、ONEXT は
NULL を返します。
array_expr が NULL の場合は、エラーが返されます。
整数の引数を 1 つ指定した ONEXT メソッドは、1 次元 ARRAY タイプの Oracle
NEXT メソッドと互換性があります。
結果のタイプ
ONEXT は、符号なし整数値または事前定義された ARRAY タイプ ArrayVec の新し
いインスタンスを返します。
例
例: ONEXT を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SQL 関数、演算子、式および述部
227
第 4 章 ARRAY/VARRAY 関数および演算子
ONEXT
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、phonelist 配列の構成要素 2 より後の構成要素の添字値を返します。
SELECT eno, phonelist.ONEXT(2)
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.ONEXT(2)
-----------------?
(the element following element 2 is unpopulated)
3
例: ONEXT を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、shots 配列の構成要素[1][2]より後の構成要素の添字値を返します。
SELECT id, shots.ONEXT(NEW arrayVec(1, 2))
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
shots.ONEXT(NEW arrayVec(1, 2))
------------------------------?
(The element following element [1][2] is unpopulated)
NEW arrayVec(1,3)
次は、関数スタイルの構文を使用した同じ問合わせです。
228
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OEXTEND
SELECT id, ONEXT(shots, NEW arrayVec(1, 2))
FROM seismic_table;
OEXTEND
目的
array_expr 内に 1 つ以上の新しい構成要素用の領域を割り当てます。
構文
システム関数の構文
OEXTEND
( array_expr
)
, num_spaces
TD_SYSFNLIB.
,
index_value
array_bound
メソッドスタイルの構文
array_expr.OEXTEND
(
)
num_spaces
,
index_value
array_bound
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
num_spaces
array_expr.に追加する NULL 構成要素の数を表わす任意選択の符号なし整数値。
index_value
array_expr 内の構成要素に対する索引として使用する任意選択の符号なし整数値。
array_bound
事前定義された配列型 ArrayVec の配列インスタンスで、境界を定義する整数値の
カンマ区切りリストを指定したもの。
SQL 関数、演算子、式および述部
229
第 4 章 ARRAY/VARRAY 関数および演算子
OEXTEND
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OEXTEND は、引数として配列式を取り、配列に 1 つ以上の新しい構成要素用の領
域を割り当てます。
指定内容
メソッドの動作
OEXTEND()
ARRAY 値に 1 つの NULL 構成要素を追加します。
多次元(n-D)ARRAY の場合、これは行優先順で行な
われます。
OEXTEND(num_spaces)
ARRAY 値に n 個の NULL 構成要素を追加します。
このとき、n = num_spaces になります。n-D
ARRAY の場合、これは行優先順で行なわれます。
OEXTEND(num_spaces,
index_value)
ARRAY 値に index_value または array_bound に
よって索引作成された n 個の構成要素のコピーを
追加します。このとき、n = num_spaces になりま
す。n-D ARRAY の場合、これは行優先順で行なわ
れます。
または
OEXTEND(num_spaces,
array_bound)
整数タイプの引数を指定しない、1 つ指定、または 2 つ指定した OEXTEND メソッ
ドは、1 次元 ARRAY タイプの Oracle EXTEND メソッドと互換性があります。ただ
し、OEXTEND が引数なしで呼び出される場合に空の括弧が必要とされる点は、Oracle
構文とは異なります。
次の場合に、OEXTEND はエラーを返します。
• array_expr が NULL の場合。
• index _value または array_bound のいずれかが NULL の場合。
• OEXTEND により追加された構成要素数が、配列の最大サイズを越える場合。
num_spaces が NULL の場合、エラーは発生しませんが、OEXTEND は何のアクショ
ンも実行しません。
結果のタイプ
OEXTEND は、配列引数の新しい変更後のコピーを返します。
例
例: OEXTEND を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
230
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OEXTEND
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、単一の NULL 構成要素で phonelist 配列を拡張します。
SELECT eno, phonelist.OEXTEND()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OEXTEND()
------------------('1112223333', '6195551234',NULL)
(NULL,NULL,'8584850000',NULL)
次の問合わせは、3 つの NULL 構成要素で phonelist 配列を拡張します。
SELECT eno, phonelist.OEXTEND(3)
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OEXTEND(3)
-------------------('1112223333', '6195551234',NULL,NULL,NULL)
(NULL,NULL,'8584850000',NULL,NULL,NULL)
次の問合わせは、構成要素 1 を 2 つコピーして、phonelist 配列を拡張します。
SELECT eno, phonelist.OEXTEND(2,1)
FROM employee_info
WHERE eno = 1;
問合わせの結果を次に示します。
SQL 関数、演算子、式および述部
231
第 4 章 ARRAY/VARRAY 関数および演算子
OEXTEND
ENO
--1
phonelist.OEXTEND(2,1)
---------------------('1112223333', '6195551234', '1112223333', '1112223333')
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, OEXTEND(phonelist,2,1)
FROM employee_info
WHERE eno = 1;
例: OEXTEND を使用して、構成された ARRAY の最後に NULL 要素を入れる
次の例は、OEXTEND メソッドを使って、構成された ARRAY の最後に NULL 構成要
素を入れ、それらの構成要素が初期化されていない状態でなくなるようにする方法
を示しています。これは、ARRAY を他のシステム関数や演算子の引数として使用で
きる場合に便利です。
CREATE TYPE myarray AS VARRAY(5) OF INTEGER;
CREATE TABLE mytab (id INTEGER, ary myarray);
/* Populate the first 3 elements. The last 2 elements are uninitialized.
*/
INSERT INTO mytab VALUES (1, NEW myarray(1,2,3));
/* Fill the last 2 elements with NULLs. */
UPDATE mytab
SET ary = ary.OEXTEND(2)
WHERE id = 1;
SELECT ary FROM mytab;
問合わせの結果を次に示します。
(1,2,3,NULL,NULL)
例: OEXTEND を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
232
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OEXTEND
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、単一の NULL 構成要素で shots 配列を拡張します。
SELECT id, shots.OEXTEND()
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
shots.OEXTEND()
--------------(11,12,NULL)
(NULL,NULL,1133,NULL)
次の問合わせは、3 つの NULL 構成要素で shots 配列を拡張します。
SELECT id, shots.OEXTEND(3)
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
shots.OEXTEND(3)
---------------(11,12,NULL,NULL,NULL)
(NULL,NULL,1133,NULL,NULL,NULL)
次の問合わせは、構成要素[1][1]を 2 つコピーして shots 配列を拡張します。
SELECT id, shots.OEXTEND(2, NEW arrayVec(1,1))
FROM seismic_table
WHERE id = 1;
問合わせの結果を次に示します。
ID
-1
shots.OEXTEND(2, NEW arrayVec(1,1))
----------------------------------(11,12,11,11)
関連トピック
詳細は、以下を参照してください。
• 「ARRAY 適用範囲の参照」
• 「ARRAY コンストラクタ式」
SQL 関数、演算子、式および述部
233
第 4 章 ARRAY/VARRAY 関数および演算子
OTRIM
OTRIM
目的
取り込まれた構成要素を array_expr の最後から 1 つ以上削除します。
構文
システム関数の構文
OTRIM
( array_expr
TD_SYSFNLIB.
)
, integer_value
メソッドスタイルの構文
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
• UDF 式
• UDM 式
integer_value
任意選択の符号なし INTEGER 値で、配列から削除する取り込まれた要素の数を示し
ます。デフォルトは 1 です。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
OTRIM は、引数として配列式を取り、取り込まれている 1 つ以上の構成要素をその
配列値の最後から削除します。integer_value を指定しない場合、OTRIM は配列値の
最後から取り込まれている構成要素を 1 つ削除します。指定する場合は、OTRIM は
配列値の最後から取り込まれている構成要素を integer_value で指定した数を削除し
ます。多次元 ARRAY タイプの場合、これは行優先順で行なわれます。OTRIM は、
結果として配列値の新しい変更後のコピーを返します。
234
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
OTRIM
array_expr が NULL の場合は、エラーが返されます。integer_value が NULL の場
合、エラーは発生しませんが、OTRIM は何のアクションも実行しません。OTRIM
により削除された構成要素数がその配列の OCOUNT の現在の値より大きい場合、
エラーが返されます。
OTRIM メソッドは、1 次元 ARRAY タイプの Oracle TRIM メソッドと互換性があり
ます。integer_value が指定されていない場合、Teradata 構文では空の括弧が必要と
される点は、Oracle 構文とは異なります。
結果のタイプ
OTRIM は、配列引数の新しい変更後のコピーを返します。
例
例: OTRIM を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
次の問合わせは、取り込まれている最後の構成要素を phonelist 配列から削除します。
SELECT eno, phonelist.OTRIM()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
SQL 関数、演算子、式および述部
phonelist.OTRIM()
----------------('1112223333')
(NULL,NULL)
235
第 4 章 ARRAY/VARRAY 関数および演算子
OTRIM
次の問合わせは、取り込まれている最後の構成要素を 2 つ、phonelist 配列から削除
します。
SELECT eno, phonelist.OTRIM(2)
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.OTRIM(2)
-----------------()
(the only 2 populated elements were removed so we
now have an empty array value)
(NULL)
例: OTRIM を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、取り込まれている最後の構成要素を shots 配列から削除します。
SELECT id, shots.OTRIM()
FROM seismic_table
WHERE id = 1;
問合わせの結果を次に示します。
ID
-1
shots.OTRIM()
------------(11)
次の問合わせは、取り込まれている最後の構成要素を 2 つ、shots 配列から削除しま
す。
236
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ODELETEODELETE
SELECT id, shots.OTRIM(2)
FROM seismic_table;
問合わせの結果を次に示します。
ID
-1
2
shots.OTRIM(2)
-------------()
(the only 2 populated elements were removed so we now
have an empty array value)
(NULL)
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT id, OTRIM(shots, 2)
FROM seismic_table;
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
ODELETEODELETE
目的
array_expr からすべての構成要素を削除します。
構文
システム関数の構文
ODELETE
( array_expr )
TD_SYSFNLIB.
メソッドスタイルの構文
array_expr.ODELETE
( )
構文要素
TD_SYSFNLIB
メソッドが格納されているデータベースの名前。
array_expr
次のいずれかである ARRAY 式。
• ARRAY 列の参照
• ARRAY コンストラクタ式
SQL 関数、演算子、式および述部
237
第 4 章 ARRAY/VARRAY 関数および演算子
ODELETEODELETE
• UDF 式
• UDM 式
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
ODELETE は、引数として配列式を取り、取り込まれている、すべての構成要素をそ
の配列値から削除します。ODELETE は、結果として配列値の新しい変更後のコピー
を返します。
array_expr が NULL の場合は、エラーが返されます。
ODELETE メソッドは、1 次元 ARRAY タイプの Oracle DELETE メソッドと互換性が
あります。ただし、Teradata 構文では空の括弧が必要とされる点は、Oracle 構文と
は異なります。
結果のタイプ
ODELETE は、配列引数の新しい変更後のコピーを返します。
例
例: ODELETE を使用した、1-D ARRAY データ型とテーブルへの問合わせ
次の 1 次元の ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE phonenumbers AS VARRAY(20) OF CHAR(10);
CREATE TABLE employee_info (eno INTEGER, phonelist phonenumbers);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO employee_info VALUES (1,
phonenumbers('1112223333', '6195551234'));
/* Empty ARRAY instance */
INSERT INTO employee_info VALUES (2,
phonenumbers());
/* Update empty ARRAY instance such that element 3 is set to a value;
Then elements 1 and 2 are set to NULL, the rest are uninitialized */
UPDATE employee_info
SET phonelist[3] = '8584850000'
WHERE id = 2;
238
SQL 関数、演算子、式および述部
第 4 章 ARRAY/VARRAY 関数および演算子
ODELETEODELETE
次の問合わせは、取り込まれているすべての構成要素を phonelist 配列から削除し、
すべての構成要素が初期化されていない状態になります。
SELECT eno, phonelist.ODELETE()
FROM employee_info;
問合わせの結果を次に示します。
ENO
--1
2
phonelist.ODELETE()
------------------()
()
次は、関数スタイルの構文を使用した同じ問合わせです。
SELECT eno, ODELETE(phonelist)
FROM employee_info;
例: ODELETE を使用した、2-D ARRAY データ型とテーブルへの問合わせ
次の 2-D ARRAY データ タイプおよび表について考えてみましょう。
CREATE TYPE shot_ary AS VARRAY(1:50)(1:50) OF INTEGER;
CREATE TABLE seismic_table (
id INTEGER,
shots shot_ary);
テーブルには次の値が取り込まれます。
/* The first 2 elements are populated; the rest are uninitialized. */
INSERT INTO seismic_table VALUES (1, shot_ary(11, 12));
/* Empty ARRAY instance */
INSERT INTO seismic_table VALUES (2, shot_ary());
/* Update empty ARRAY instance such that element [1][3] is set to a
value; Then elements [1][1] and [1][2] are set to NULL, the rest are
uninitialized */
UPDATE seismic_table
SET shots[1][3] = 1133
WHERE id = 2;
次の問合わせは、取り込まれているすべての構成要素を shots 配列から削除し、配
列のすべての構成要素が初期化されていない状態になります。
SELECT id, shots.ODELETE()
FROM seismic_table;
問合わせの結果を次に示します。
ID
--
SQL 関数、演算子、式および述部
shots.ODELETE()
---------------
239
第 4 章 ARRAY/VARRAY 関数および演算子
ODELETEODELETE
1
2
()
()
関連トピック
詳細は、「ARRAY コンストラクタ式」を参照してください。
240
SQL 関数、演算子、式および述部
第5章
属性関数
概要
この章では、SQL 属性関数について説明します。
属性関数は、オペランドに関する記述情報を戻します。DEFAULT 関数を除いて、オ
ペランドは列参照である必要はありません。数学的に評価されない一般的な式であっ
てもかまいません。
要求の中で属性関数を使うと、応答では、検索条件にかなった各データ行ごとに 1
つの行が戻されます。
これらの関数のうちのいくつかは、ANSI SQL に対する拡張機能です。
データ タイプ属性のリストは、< SQL データ型とリテラル、B035-1143>の「デー
タ タイプ句」を参照してください。
各属性関数について、この後の項目で 1 つずつ説明します。
Teradata 属性関数に相当する ANSI の属性関数
Teradata 属性関数のいくつかは、ANSI SQL:2011 規格の拡張機能です。
ANSI との互換性を維持するために、ANSI の等価関数があれば、Teradata 属性関数
ではなく、それを使用してください。
変更する Teradata 関数
新規アプリケーションで使用する ANSI 関数
CHARACTERS
CHARS
CHAR
CHARACTER_LENGTH
MCHARACTERS†
† この関数の記述はなくなりました。この関数の使用は推奨されません。KANJI1 のサポー
トが停止された後はサポートされなくなるためです。
以下の Teradata 関数には、ANSI の等価関数がありません。
• BYTES
• FORMAT
• TYPE
SQL 関数、演算子、式および述部
241
第 5 章 属性関数
BYTES
BYTES
目的
指定のバイト文字列に含まれているバイト数を戻します。
構文
BYTE
( byte_expression (
BYTES
構文要素
byte_expression
バイト数を戻すバイト文字列。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
byte_expression のデータ型は、以下のものに限られます。
• BYTE、VARBYTE、および BLOB
• 事前定義されたバイト タイプへの暗黙 CAST を持つ UDT
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 構文規則および例、B035-1144>を参照してください。
BYTES を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI SQL
標準の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
長さには後続ゼロが含まれる
後続ダブル ゼロ バイトもバイトとしてみなされるので、固定長列の値の長さは、常
にその列に定義されている長さと等しくなります。
可変長列の値の長さは、常にその値に含まれているバイト数(後続ダブル ゼロ バイ
トも含む)と等しくなります。
データ値のバイト カウントに後続ブランクを含めないようにするには、BYTES への
引数に TRIM 関数を使用します。たとえば、
242
SQL 関数、演算子、式および述部
第 5 章 属性関数
CHARACTER LENGTH
SELECT BYTES( TRIM( TRAILING FROM byte_col ) ) FROM table1;
例: BYTE を使用した、社員証のバイト数の取得
以下の文では、BYTES 関数を BadgePic 列(タイプは VARBYTE(32000))に適用し、
社員証の写真のバイト数を取得します。
SELECT BadgePic, BYTES(BadgePic)
FROM Employee;
結果は、以下のとおりです。
BadgePic
-------------20003BA0
9A3243F805
EEFF08C3441900
Bytes(BadgePic)
--------------4
5
7
関連トピック
詳細は、以下を参照してください。
• 「データ型の変換」
• ユーティリティ 、B035-1102
• 「TRIM」
CHARACTER LENGTH
目的
論理文字数またはバイト数として文字列の長さを戻します。
構文
CHARACTER_LENGTH
CHAR_LENGTH
(string_expression)
構文要素
string_expression
長さを戻す文字列式。
SQL 関数、演算子、式および述部
243
第 5 章 属性関数
CHARACTER LENGTH
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
CHARACTER_LENGTH は、Teradata の CHARACTERS 関数の ANSI 版です。ANSI
SQL:2011 に適合させるには、CHARACTERS の代わりに CHARACTER_LENGTH を使
用します。
MCHARACTERS の代わりに CHARACTER_LENGTH を使用してください。(このマニュ
アルでの MCHARACTERS の記述はなくなりました。この関数の使用は推奨されませ
ん。KANJI1 のサポートが停止された後はサポートされなくなるためです。)
引数のタイプ
string_expression の型は、CHARACTER、VARCHAR、または CLOB でなければなり
ません。文字以外のデータ型の場合は、エラーが戻されます。
Teradata Database はデフォルトで、UDT と、事前定義文字列タイプの間でキャスト
を行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行ないます。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。
CHARACTER_LENGTH を含め、システム演算子および関数用の UDT の暗黙の型変換
は、ANSI SQL 標準の Teradata 拡張機能です。この拡張を無効にするには、DBS 制
御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
結果
KANJI1 以外のすべてのサーバー文字セットの場合、CHARACTER_LENGTH は、
string_expression の長さを文字数として戻します。
string_expression 引数が NULL の場合、結果は NULL になります。
KANJI1 の場合は以下の結果が得られます。
クライアント文字セット
CHARACTER_LENGTH が戻す値
KanjiEBCDIC
バイト数による string_expression の長さ。
1 バイト文字とマルチバイト文字の混合値が予想されます。
シフトアウト/シフトイン文字が存在すれば、それも結果の
カウントに含まれます。
KanjiEUC
KanjiShift-JIS
244
クライアント セッション文字セットに基づく、論理文字数
による string_expression の長さ。
SQL 関数、演算子、式および述部
第 5 章 属性関数
CHARACTER LENGTH
クライアント文字セット
CHARACTER_LENGTH が戻す値
1 バイト文字とマルチバイト文字の混合値が予想されます。
ASCII EBCDIC
バイト数による string_expression の長さ。
注:
Teradata の国際化計画に従って、KANJI1 のサポートはサポート外になりました。
このサポートは、近い将来に廃止される予定です。KANJI1 はデフォルトの文字セッ
トとして許可されません。システムはデフォルトの KANJI1 文字セットを UNICODE
文字セットに変更します。KANJI1 の新規オブジェクトの作成は、高度に制限され
ています。KANJI1 を使用する問合わせやアプリケーションの多くは、従来通り動
作しますが、KANJI1 を使用するサイトはできるだけ早く別の文字セットに変換す
る必要があります。詳細については、<国際文字セットのサポート、B035-1125>の
KANJI1 文字セットを参照してください。
後続埋め込み文字も文字としてみなされるので、CHARACTER 列の値の長さは、常
にその列に定義されている長さと等しくなります。
VARCHAR または CLOB 列の値の長さは、常にその値に含まれている文字の数(後続
埋め込み文字も含む)と等しくなります。
後続の埋め込み文字の抑止
データ値の文字カウントから後続の埋め込み文字を抑止するには、
CHARACTER_LENGTH への引数に TRIM 関数を使用します。たとえば、
SELECT CHARACTER_LENGTH( TRIM( TRAILING FROM Name ) )
FROM Employee;
例
以下の文は、各社員名の文字数を調べるために、CHARACTER_LENGTH 関数を
VARCHAR(30) CHARACTER SET LATIN タイプの Name 列に適用します。
SELECT Name, CHARACTER_LENGTH(Name)
FROM Employee;
結果は以下のようになります(区切り文字のブランクも文字とみなされます)。
Name
-------Smith T
Newman P
Omura H
.
SQL 関数、演算子、式および述部
Character_Length(Name)
---------------------7
8
7
.
245
第 5 章 属性関数
DEFAULT
セット 1 の例: KanjiEBCDIC
サーバー文字セット
例
CHARACTER_LENGTH が戻す値
GRAPHIC
ABC
3
KANJI1
De<MNP >
10
<><>
4
サーバー文字セット
例
CHARACTER_LENGTH が戻す値
KANJI1
<><>
10
D eF
3
UNICODE
ABC
3
GRAPHIC
ABC
3
サーバー文字セット
例
CHARACTER_LENGTH が戻す値
KANJI1
ss3 C ss3 D
2
セット 2: KanjiShift-JIS
セット 3: KanjiEUC
GRAPHIC
UNICODE
LATIN
2
<><>
0
dA ss2 B ss3 E
4
ABC
3
関連トピック
詳細は、以下を参照してください。
• 「データ型の変換」。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• ユーティリティ 、B035-1102。
• <国際文字セットのサポート、B035-1125>の「KANJI1 文字セット」。
DEFAULT
目的
指定された列または派生した列の現在のデフォルト値を返します。
246
SQL 関数、演算子、式および述部
第 5 章 属性関数
DEFAULT
構文
DEFAULT
( column_name )
構文要素
column_name
基本テーブル、ビュー、キュー テーブル、または派生テーブルの列の名前。
列名は、修飾されていてもいなくてもかまいません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
結果のタイプと属性
次の表に、DEFAULT(x)の結果タイプ、形式、およびタイトルを示します。
データ タイプ
書式
タイトル
指定された列のデータ タイプ
指定された列の形式
Default(x)
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
結果値
DEFAULT 関数は、指定された列または派生した列(列名が省略された場合)のデフォ
ルト値を返します。
指定された列または派生した列がビュー列または派生したテーブルの列である場合
は、DEFAULT 関数は基礎となるテーブル列のデフォルト値を戻します。
たとえば、デフォルト値が CURRENT_TIME または USER の場合のように、列のデ
フォルト値がシステム変数に評価されると 、DEFAULT 関数は文が実行されたときに
システム変数の値を返します 。
DEFAULT は次のいずれかの条件が真の場合に NULL を返します。
•
•
•
•
指定された列または派生した列が DEFAULT NULL 句を使用して定義されている
指定された列または派生した列に明示的なデフォルト値がない
指定された列または派生した列のデータ タイプが UDT である
指定された列または派生した列が、明示的なデフォルト値を持たない単一の基礎
となるテーブルの列から派生したビュー列の名前である
例については、「ビューの列名の指定」を参照してください。
SQL 関数、演算子、式および述部
247
第 5 章 属性関数
DEFAULT
• たとえば、ビュー列がリテラル式から派生した場合などのように、指定された列
または派生した列が、単一の基礎となるテーブルの列から派生したものではない
ビュー列の名前である
列名の省略
INSERT、UPDATE、または MERGE 文の特定の条件下、あるいは比較演算子が含ま
れた述部の句では、列名を省略した DEFAULT の形式を使用できます。列名を省略し
た DEFAULT の形式は式の一部にはできません。
DEFAULT 関数で列名が指定されないとき、Teradata Database は列を文脈に基づい
て派生します。たとえば、以下のテーブル定義があるとします。
CREATE TABLE Manager
(Emp_ID
INTEGER
,Dept_No
INTEGER DEFAULT 99
);
たとえば次の INSERT 文では、列名のない DEFAULT を使用して、Dept_No 列にデ
フォルト値を挿入しています。
INSERT INTO Manager VALUES (103499, DEFAULT);
列名を指定しないで DEFAULT 関数を使用する場合、Teradata Database が列の文脈
を派生できないとエラーが発生します。
比較演算子が含まれた述部の句で DEFAULT 関数を使用するときに列名を省略する例
については、「例: 述部での DEFAULT の使用」を参照してください。
INSERT、UPDATE、および MERGE 文で DEFAULT 関数を使用する場合の詳細は、<
SQL データ操作言語、B035-1146>を参照してください。
修飾された列名の使用
テーブルの名前を含む限定された列名を指定する場合、FROM 句のない SELECT 文
で DEFAULT を使用できます。たとえば、次の文を使用して、Manager テーブルの
Dept_No 列のデフォルト値を取得できます。
SELECT DEFAULT(Manager.Dept_No);
制約事項
DEFAULT 関数は、PPI を定義するための区分化式として使用することはできません。
エラー条件
DEFAULT 関数は次のいずれかの条件の場合にエラーになることがあります。
248
SQL 関数、演算子、式および述部
第 5 章 属性関数
DEFAULT
• 列名が省略されているために、Teradata Database が列の文脈を派生できない
• DEFAULT 関数が、PPI を定義するための区分化式に使用されている
• 列名が省略されており、列名なしでは DEFAULT 関数をサポートしていない式に
DEFAULT 関数が使用されている
• DEFAULT 関数が、結果タイプに互換性がない式に使用されている
たとえば、次のテーブル定義の場合を考えてみましょう。
CREATE TABLE Parts_Table
(Part_Code
INTEGER DEFAULT 9999
,Part_Name
CHAR(20)
);
次の文の結果はエラーになります。これは、DEFAULT 関数の結果タイプが、結
果が比較される列と互換性がないからです。
SELECT * FROM Parts_Table WHERE Part_Name = DEFAULT(Part_Code);
例
例: 特定の条件下でのデフォルト値の挿入
次の Employee テーブル定義を考えます。
CREATE TABLE Employee
(Emp_ID
INTEGER
,Last_Name
VARCHAR(30)
,First_Name VARCHAR(30)
,Dept_No
INTEGER DEFAULT 99
);
たとえば次の式では、入力された値が負の場合に、Dept_No 列にデフォルト値を挿
入するために DEFAULT 関数を使用しています。
USING (id INTEGER, n1 VARCHAR(30), n2 VARCHAR(30), dept INTEGER)
INSERT INTO Employee VALUES
(:id
,:n1
,:n2
,CASE WHEN (:dept < 0) THEN DEFAULT(Dept_No) ELSE :dept END
);
例: 述部での DEFAULT の使用
次の文では、DEFAULT 関数を使用して Dept_No 列の値と Dept_No 列のデフォルト
値を比較しています。比較操作には、単一の列参照が含まれるため、列名が省略さ
れていても、Teradata Database は DEFAULT 関数の列の文脈を派生できます。
SELECT * FROM Employee WHERE Dept_No < DEFAULT;
SQL 関数、演算子、式および述部
249
第 5 章 属性関数
DEFAULT
DEFAULT 関数が NULL と評価されると、述部は不明になり、WHERE 条件は FALSE
になります。
例: ビューの列名の指定
次の定義のある DBC.HostsInfo システム ビューについて考慮します。
REPLACE VIEW DBC.HostsInfo (LogicalHostId, HostName, DefaultCharSet)
AS SELECT
LogicalHostId
,HostName
,DefaultCharSet
FROM DBC.Hosts WITH CHECK OPTION;
基礎となるテーブルの DBC.Hosts には、次の定義があります。
CREATE SET TABLE DBC.Hosts, FALLBACK, NO BEFORE JOURNAL,
NO AFTER JOURNAL, CHECKSUM = DEFAULT
(LogicalHostId SMALLINT FORMAT 'ZZZ9' NOT NULL
,HostName VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC NOT
NULL
,DefaultCharSet VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC
NOT NULL)
UNIQUE PRIMARY INDEX (LogicalHostId)
UNIQUE INDEX (HostName);
次の文では、DEFAULT 関数に DBC.HostsInfo.HostName ビュー列名を使用していま
す。
SELECT DISTINCT DEFAULT(HostName) FROM DBC.HostsInfo;
DEFAULT 関数の結果は NULL になります。これは、HostName ビュー列が、明示的
なデフォルト値のないテーブル列から派生しているからです 。
関連トピック
詳細情報:
• 述部の使用については、「論理述語」を参照してください。
• 述部の比較演算については、「比較演算子と関数」を参照してください。
• DEFAULT 値が制御する句については、< SQL データ型とリテラル、B035-1143>
を参照してください。
• INSERT、UPDATE、および MERGE 文については、< SQL データ操作言語、
B035-1146>を参照してください。
250
SQL 関数、演算子、式および述部
第 5 章 属性関数
FORMAT
FORMAT
目的
指定の式に宣言されている書式を戻します。
構文
FORMAT
( expression )
構文要素
expression
形式が報告される式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
FORMAT は 30 文字までの CHAR(n)文字列を返します。次の表に、FORMAT の結果
タイプ、文字セット、書式、およびタイトルを示します。
データ タイプ
書式
タイトル
CHAR(n) CHARACTER SET UNICODE
X(30)
Format(named_expression
)
例: Salary 列のフォーマットの要求
以下の文は、Employee テーブルの Salary 列の書式を要求します。
SELECT FORMAT(Employee.Salary);
結果は、以下のようになります。
Format(Salary)
-----------------------------ZZZ,ZZ9.99
関連トピック
詳細については、< SQL データ型とリテラル、B035-1143>の「データ型の書式お
よび書式句」を参照してください。
SQL 関数、演算子、式および述部
251
第 5 章 属性関数
OCTET LENGTH
OCTET LENGTH
目的
指定の文字セット(エクスポート幅の値も考慮する)に変換した場合の
string_expression の長さをオクテット単位で戻します。
構文
OCTET_LENGTH
(
string_expression
)
, character_set_name
構文要素
string_expression
オクテット単位の数が必要な文字列。
character_set_name
結果を戻す文字セット。character_set_name を指定しない場合は、セッション文字
セットが使用されます。
character_string_expression 引数が NULL の場合、結果は NULL になります。
Teradata 提供の文字セットのリストについては、「使用上の注意」のテーブルを参
照してください。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
引数のタイプ
string_expression のデータ型は、以下のいずれかでなければなりません。
• CHARACTER または VARCHAR
• 事前定義された文字タイプへの暗黙 CAST を持つ UDT
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。
OCTET_LENGTH を含め、システム演算子および関数用の UDT の暗黙の型変換
は、ANSI SQL 標準の Teradata 拡張機能です。この拡張を無効にするには、DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定し
ます。
string_expression 引数が NULL の場合、結果は NULL になります。
252
SQL 関数、演算子、式および述部
第 5 章 属性関数
OCTET LENGTH
使用上の注意
シフトアウト/シフトイン文字や後続 GRAPHIC 埋め込み文字も結果のカウントに含
まれます。
OCTET_LENGTH は、Teradata モードでも ANSI モードでも同じように動作します。
string_expression が次の場
合:
結果
KANJI1 タイプ
結果は、character_set_name に依存しません。
CHARACTER 以外のデータ
エラーが生成されます。
OCTET_LENGTH はエクスポート幅の値を考慮します。エクスポート幅の詳細は<SQL
データ定義言語 - 構文規則および例、B035-1144>の「CREATE USER」を参照して
ください。
以下の表は、Teradata に用意されているクライアント文字セットをまとめたもので
す。これらの文字セットはシステムに付属していますが 、システム管理者が個別に
導入しないと使用可能になりません。
サイトによっては、 サイト定義の文字セットがあるかもしれません。それぞれのサ
イトで使用できる文字セットの完全リストについては、システム管理者に確認して
ください。
ビルトインで見つかった文字セット:
•
•
•
•
ASCII
EBCDIC
UTF8
UTF16
DBC.CharTranslationsV で見つかった文字セット:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
EBCDIC037_0E
EBCDIC273_0E
EBCDIC277_0E
HANGULEBCDIC933_1II
HANGULKSC5601_2R4
KANJIEBCDIC5026_0I
KANJIEBCDIC5035_0I
KANJIEUC_0U
KANJISJIS_0S
KATAKANAEBCDIC
LATIN1252_0A
LATIN1_0A
LATIN9_0A
SCHEBCDIC935_2IJ
SQL 関数、演算子、式および述部
253
第 5 章 属性関数
OCTET LENGTH
• SCHGB2312_1T0
• TCHBIG5_1R0
• TCHEBCDIC937_3IB
Windows コード ページと互換性のあるセッション文字セットとともに、
DBC.CharTranslationsV で見つかった文字セット:
•
•
•
•
•
•
•
•
•
•
•
•
ARABIC1256_6A0
CYRILLIC1251_2A0
HANGUL949_7R0
HEBREW1255_5A0
KANJI932_1S0
LATIN1250_1A0
LATIN1252_0A
LATIN1254_7A0
LATIN1258_8A0
SCHINESE936_6R0
TCHINESE950_8R0
THAI874_4A0
例: OCTET_LENGTH からの出力
OCTET_LENGTH の出力例を以下の表に示します。
クライアント文字
セット
サーバー文字セット string_expression
結果
EBCDIC
LATIN
abcdefgh
8
ASCII
KANJI1
abcdefgh
8
KanjiEBCDIC
KANJI1
AB<CDE >P
11
KanjiEBCDIC
GRAPHIC
MNOP
8 (レコード モード)
10 (フィールド モー
ド)
KanjiEUC
KANJISJIS
dA ss2 B ss3 E
8
KanjiShift-JIS
KANJISJIS
D eF
5
KanjiShift-JIS
UNICODE
ABC
6
関連トピック
詳細は、以下を参照してください。
• 概要
• ユーティリティ 、B035-1102。
254
SQL 関数、演算子、式および述部
第 5 章 属性関数
TITLE
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
TITLE
目的
表示結果または印刷結果の見出しに現われる式のタイトルを戻します。
構文
( expression )
TITLE
構文要素
expression
タイトルを戻す式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
TITLE は 60 文字までの CHAR(n)文字列を返します。次の表に、TITLE の結果タイ
プ、文字セット、書式、およびタイトルを示します。
データ タイプ
書式
タイトル
CHAR(n) CHARACTER SET UNICODE
X(60)
Title(named_expression)
使用上の注意
表示結果または印刷結果の見出しを列名(デフォルトの見出し)と異なるものに変更
する場合、TITLE 句を使用してください。
例: Salary 列のタイトルの要求
以下の文は、Employee テーブルの Salary 列のタイトルを要求します。
SELECT TITLE(Employee.Salary);
結果は、以下のようになります。
SQL 関数、演算子、式および述部
255
第 5 章 属性関数
TYPE
Title(Salary)
-----------------------------------------------------------Salary
関連トピック
詳細は、以下を参照してください。
• < SQL データ型とリテラル、B035-1143>の「データ型の書式および書式句」
• SQL データ型とリテラル、B035-1143.
TYPE
目的
式に定義されているデータ タイプを戻します。
構文
( expression )
TYPE
構文要素
expression
データ型を戻す式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
TYPE は、式のデータ タイプの名前を含む CHAR(n)文字列を戻します。
引数が関数または演算の場合、TYPE は、関数または演算の結果タイプを示す文字列
を戻します。演算または関数の結果タイプの規則については、該当する関数または
演算の資料を参照してください。
次の表に、TYPE の結果タイプ、文字セット、書式、およびタイトルを示します。
256
データ タイプ
書式
タイトル
CHAR(n) CHARACTER SET LATIN
X(39)
Type(named_expression)
SQL 関数、演算子、式および述部
第 5 章 属性関数
TYPE
サポートされるデータ型のリストについては、<SQL データ タイプおよびリテラル
>を参照してください。地理空間タイプについては、<SQL 地理空間タイプ>を参照
してください。
文字タイプの引数
文字タイプの引数のサーバー文字セットがユーザーのデフォルト サーバー文字セッ
トと異なる場合、結果の文字セットには CHARACTER SET 句と、引数のサーバー文
字セットの名前が含まれることになります。
例
例 1: ユーザーのデフォルトのサーバー文字セットが LATIN である場合
次のテーブル定義の Name 列を考慮します。
CREATE TABLE Employee
(EmployeeID INTEGER
,Name
CHARACTER(30) CHARACTER SET LATIN
,Salary
DECIMAL(8,2));
ユーザーのデフォルト サーバー文字セットが LATIN の場合、TYPE が戻す Name 列
に関する文字列には CHARACTER SET 句が含まれていません。
SELECT TYPE(Employee.Name);
Type(Name)
---------CHAR(30)
例 2: ユーザーのデフォルトのサーバー文字セットが LATIN だが、Name 列のサーバー文字
セットが UNICODE である場合
ユーザーのデフォルト サーバー文字セットが LATIN であっても、Name 列のサー
バー文字セットが UNICODE である場合、結果の列には CHARACTER SET 句が入り
ます。
CREATE TABLE Employee
(EmployeeID INTEGER
,Name VARCHAR(30) CHARACTER SET UNICODE
,Salary
DECIMAL(8,2));
SELECT TYPE(Employee.Name);
Type(Name)
--------------------------------VARCHAR(30) CHARACTER SET UNICODE
例 3: Name 列と Salary 列の型を返す
次の文は Name 列と Salary 列のタイプを戻します。
SQL 関数、演算子、式および述部
257
第 5 章 属性関数
TYPE
SELECT TYPE(Employee.Name), TYPE(Employee.Salary);
Type(Name)
Type(Salary)
----------- -----------VARCHAR(30) DECIMAL(8,2)
例 4: TYPE を使用して、2 つの列のデータ型を要求する
TYPE を使って、それぞれ GRAPHIC と LONG VARCHAR CHARACTER SET GRAPHIC
として定義されている 2 つの列のデータ型を要求する場合、結果は以下のようにな
ります。
TYPE(GColName)
----------------------------CHAR(4) CHARACTER SET GRAPHIC
TYPE(LVGColName)
-----------------------------------VARCHAR(32000) CHARACTER SET GRAPHIC
LONG VARCHAR CHARACTER SET GRAPHIC 列の場合、返される長さは最大長の
32000 です。
例 5: TYPE 関数の使用
以下の TYPE 関数について考えてみましょう。
SELECT TYPE(SUBSTR(Employee.Name,3,2));
SUBSTR の結果タイプはセッション モードに応じて異なります。
セッションが ANSI モードに設定されている場合、戻される結果は次のようになりま
す。
Type(Substr(Name,3,2))
---------------------VARCHAR(30)
セッションが Teradata モードに設定されている場合、戻される結果は次のようにな
ります。
Type(Substr(Name,3,2))
---------------------VARCHAR(2)
例 6: BLOB 列への TYPE 関数の適用
次のテーブル定義を考えます。
CREATE TABLE images
(imageid INTEGER
,imagedesc VA
RCHAR(50)
,image BLOB(2K))
UNIQUE PRIMARY INDEX (imageid);
次の文は、TYPE 関数を BLOB 列に適用します。
SELECT TYPE(images.image) FROM images;
結果は以下のようになります。
258
SQL 関数、演算子、式および述部
第 5 章 属性関数
TYPE
Type(image)
----------BLOB(2048)
結果が通常の整数長になることと、CREATE TABLE 文の中で BLOB 列を定義するた
めに使用した K オプションを使用していないことに注意してください。
関連トピック
詳細は、以下を参照してください。
• <SQL 地理空間タイプ>。
• <SQL データ タイプおよびリテラル>。
SQL 関数、演算子、式および述部
259
第 5 章 属性関数
TYPE
260
SQL 関数、演算子、式および述部
第6章
ビット/バイト操作関数
概要
この章では、バイト/ビット操作の演算をサポートする関数について説明します。
前提条件
この章で取り上げるバイト/ビット操作関数は、埋め込みサービス システム関数で
す。埋め込みサービス関数の有効化と呼び出しについて、詳細は埋め込みサービス
システム関数 を参照してください。
ビットおよびバイトの番号付けモデル
次の図は、この章で説明するバイト/ビット操作関数で採用している、ビットおよび
バイトの論理的な番号付けモデルです。
このモデルは、ビッグ エンディアンまたはリトル エンディアンとは無関係なもの
です。数値データ型に使用する番号方式は、バイト列に使用する番号方式と同じで
す。これにより、目的に適ったビット マスクの作成が容易になります。
バイト/ビット操作関数を使用するときには、数値データ タイプと BYTE データ タ
イプを下図のように思い描きながら、どのようなマスク(bit_mask_arg)を対象デー
タ(target_arg)に適用するかについて考えてください。
BYTEINT
msb
MSB
lsb
LSB
BYTE 1
Bit 7
...
: most and least significant bits
: Most and Least Significant Bytes
: Computer Science binary representation
Bit 0
: Bit Numbering
例: BYTEINT 値
BYTEINT 値が 40、バイナリ表現で 00101000 の場合:
SQL 関数、演算子、式および述部
261
第 6 章 ビット/バイト操作関数
概要
msb
MSB
lsb
LSB
00101000
Bit 7
...
Bit 0
SMALLINT
msb
MSB
lsb
LSB
BYTE 1
Bit 15
: most and least significant bits
: Most and Least Significant Bytes
BYTE 2
...
: Computer Science binary representation
Bit 0
: Bit Numbering
例: SMALLINT 値
SMALLINT 値が 10,280、バイナリ表現で 0010100000101000 の場合:
msb
MSB
lsb
LSB
00101000
00101000
Bit 15
...
Bit 0
INTEGER
msb
MSB
lsb
LSB
BYTE 1 BYTE 2 BYTE 3 BYTE 4
: Computer Science binary representation
Bit 31
: Bit Numbering
...
Bit 0
例: 整数値
INTEGER 値が 673,720,360、バイナリ表現で 00101000 00101000 00101000
00101000 の場合:
msb
MSB
lsb
LSB
00101000
Bit 32
00101000
00101000
00101000
...
Bit 0
BIGINT
msb
MSB
lsb
LSB
BYTE 1
Bit 7
262
...
: most and least significant bits
: Most and Least Significant Bytes
: Computer Science binary representation
Bit 0
: Bit Numbering
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
概要
例: BIGINT 値
BIGINT 値が 2,893,606,913,523,066,920、バイナリ表現で?00101000 00101000
00101000 00101000 00101000 00101000 00101000 00101000 の場合:
msb
MSB
lsb
LSB
00101000
Bit 7
...
Bit 0
BYTE および VARBYTE
例: VARBYTE 値
VARBYTE(8)、8 バイトの場合:
msb
MSB
lsb
LSB
BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5 BYTE 6 BYTE 7 BYTE 8
Bit 63
...
Bit 0
例: 3 バイトの VARBYTE 値
VARBYTE(8)、3 バイトの場合:
msb
MSB
lsb
LSB
BYTE 1 BYTE 2 BYTE 3
Bit 23
...
Bit 0
// Bit Numbering
例: VARBYTE 値
BYTE(4)の例:
lsb
LSB
msb
MSB
BYTE 1 BYTE 2 BYTE 3 BYTE 4
Bit 31
...
Bit 0
16 進数バイト リテラル
バイト/ビット体系の関数では、16 進数バイト リテラルを次に示すように解釈しま
す。
2 バイト 16 進数バイト リテラル: '00FF'XB
SQL 関数、演算子、式および述部
263
第 6 章 ビット/バイト操作関数
概要
msb
MSB
lsb
LSB
00
FF
Bit 15
...
Bit 0
4 バイト 16 進数バイト リテラル:'01020304'XB
msb
MSB
01
lsb
LSB
02
Bit 31
03
...
04
Bit 0
16 進数バイト リテラルは、偶数個の 16 進数字によって表記されます。数字の数が
奇数の場合、16 進数リテラルの右側に 0 が付加されます。たとえば、
3 バイト 16 進数バイト リテラル'112233'XB は、4 バイト 16 進数バイト リテラル
では'11223300'XB になります。
msb
MSB
11
Bit 31
lsb
LSB
22
33
...
00
Bit 0
詳細については、< SQL データ型とリテラル、B035-1143>の「16 進数バイト リテ
ラル」を参照してください。
長さの等しくない引数に対するビット/バイト演算の実行
このトピックの説明は、BITOR 関数、BITXOR 関数および BITAND 関数にのみ適用
されます。
長さが異なる引数 target_arg と bit_mask_arg が上記の関数に渡された場合:
• 引数 target_arg と bit_mask_arg を、それぞれの最下位のバイトまたはビットで
整列する。
• 短い方の引数には、長い方の引数と同じサイズになるまで、左側に 0 を埋め込む。
Teradata Database は、右側ではなく左側に埋め込みを実行します。このように
すると、バイト列のサイズが変更される度に、ビット マスクとして利用する 16
進数バイト リテラルを変更する必要がなくなります。
例: INTEGER 型に対する BITAND 演算の問合わせ
次の問合わせでは、INTEGER 型と 1 バイトの 16 進数バイト リテラルに対して
BITAND 演算を実行します。
SELECT BITAND(287454020, 'FFFF'XB);
INTEGER 値の 287,454,020 は、16 進数値では 0x11223344 になり、そのビット番
号表現は次のようになります。
264
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
概要
msb
MSB
lsb
LSB
11
22
Bit 31
33
...
44
Bit 0
16 進数バイト リテラル 0xFFFF は、ビット番号表現では、次のようになります。
msb
MSB
lsb
LSB
FF
Bit 15
FF
...
Bit 0
BITAND 演算を処理するために、2 つの引数は、それぞれの最下位バイトまたはビッ
トで整列されます。
MSB
LSB
11
22
Bit 31
33
...
MSB
44
Bit 0
LSB
FF
Bit 15
FF
...
Bit 0
短い方の 16 進数バイト リテラル 0xFFFF には、INTEGER 値 287,454,020 と同じ長
さになるまで、左側に 0 が埋め込まれます。
MSB
11
LSB
22
Bit 31
33
...
Bit 0
MSB
00
44
LSB
00
Bit 31
FF
...
FF
Bit 0
両方のオペランドが同じサイズになったときに、BITAND 演算が実行され、次に示
す結果が生成されます。
MSB
00
LSB
00
Bit 31
SQL 関数、演算子、式および述部
33
...
44
Bit 0
265
第 6 章 ビット/バイト操作関数
BITAND
BITAND
目的
2 つの入力引数を基に、対応するビットの論理積演算を実行します。
構文
BITAND
( target_arg, bit_mask_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
bit_mask_arg
固定長バイト値、可変長バイト値、または数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
この関数は、同じ長さの 2 つのビット パターンを受け取り、対応するビットのペア
ごとに論理積演算を実行します。同じ位置のビットがどちらも 1 の場合、結果は 1
になります。それ以外の場合の結果は、0 になります。入力引数のどちらかが NULL
の場合、この関数は NULL を返します。
引数 target_arg と bit_mask_arg の長さが異なる場合、これらの引数は次に示すよう
に処理されます。
• 引数 target_arg と bit_mask_arg を、それぞれの最下位のバイトまたはビットで
整列する。
• 短い方の引数には、長い方の引数と同じサイズになるまで、左側に 0 を埋め込む。
引数のタイプと規則
BITAND は、オーバーロード スカラー関数です。target_arg パラメータのデータ型
は、以下のいずれかになります。
266
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
BITAND
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
VARBYTE(n)
bit_mask_arg パラメータのデータ型は、target_arg パラメータのデータ型に応じて
多様に変化します。次に示す入力の組み合わせ(target_arg, bit_mask_arg)が許容さ
れています。
target_arg 型
bit_mask_arg 型
BYTEINT
BYTE(1)
BYTEINT
BYTEINT
SMALLINT
BYTE(2)
SMALLINT
SMALLINT
INTEGER
BYTE(4)
INTEGER
INTEGER
BIGINT
BYTE(8)
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。たとえば、BITAND(BYTEINT, INTEGER)は、暗黙的に BITAND(INTEGER,
INTEGER)に変換できるため許容されます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」を参照
してください。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
SQL 関数、演算子、式および述部
267
第 6 章 ビット/バイト操作関数
BITNOT
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
BITAND のデフォルト タイトルは、BITAND(target_arg、bit_mask_arg)です。
例: BITAND 関数での問合わせ
次の問合わせの入力引数 23 は、データ タイプが BYTEINT であり、バイナリ表現は
00010111 になります。入力引数 20 は、データ タイプが BYTEINT であり、バイナ
リ表現は 00010100 になります。2 つの引数のビット単位の積の結果は、BYTEINT
値の 20 (つまり、バイナリの 00010100)になります。この値が、問合わせから返さ
れます。
SELECT BITAND(23,20);
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• SQL データ型とリテラル、B035-1143。
• target_arg および bit_mask_arg の詳細については、「長さの等しくない引数に対
するビット/バイト演算の実行」を参照してください。
BITNOT
目的
入力引数のバイナリ表現に対して、ビット単位の補数演算を実行します。
構文
BITNOT
( target_arg )
TD_SYSFNLIB.
268
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
BITNOT
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
ビット単位の否定である補数は、ビットごとの論理否定を実行する単項演算です。
この演算により、指定したバイナリ値自体の補数を生成します。引数の各桁が 0 な
らば 1 になり、1 ならば 0 になります。target_arg が NULL の場合、BITNOT は
NULL を返します。
引数のタイプと規則
BITNOT は、オーバーロード スカラー関数です。この関数は以下に示すパラメータ
のデータ タイプで定義されます。
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数は、明示的にキャストする必要がありま
す。詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換
データ型」と「オーバーロード関数のパラメータ型」を参照してください。
上記に明示したデータ タイプのいずれかに引数が変換できない場合は、実行依頼さ
れた DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
SQL 関数、演算子、式および述部
269
第 6 章 ビット/バイト操作関数
BITOR
オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
BITNOT のデフォルト タイトルは、BITNOT(target_arg)です。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、B035-1143>
を参照してください。
例: BITNOT 関数での問合わせ
次の問合わせの入力引数 2 は、データ タイプが BYTEINT であり、バイナリ表現は
00000010 になります。この値に対して BITNOT 演算を実行すると、結果は
BYTEINT 値の-3 (バイナリでは、11111101)になります。
SELECT BITNOT(2);
BITOR
目的
2 つの入力引数を基に、対応するビットの論理和演算を実行します。
構文
BITOR
( target_arg, bit_mask_arg )
TD_SYSFNLIB.
270
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
BITOR
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
bit_mask_arg
固定長バイト値、可変長バイト値、または数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
この関数は、同じ長さの 2 つのビット パターンを受け取り、次の表に示すように、
対応するビットのペアごとに論理和演算を実行します。
IF...
結果
入力引数を基にしたビットのどち 1
らかが 1
入力引数を基にしたビットの両方 0
が0
入力引数のいずれかが NULL
NULL
引数 target_arg と bit_mask_arg の長さが異なる場合、これらの引数は次に示すよ
うに処理されます。
• 引数 target_arg と bit_mask_arg を、それぞれの最下位のバイトまたはビットで
整列する。
• 短い方の引数には、長い方の引数と同じサイズになるまで、左側に 0 を埋め込む。
詳細については、「長さの等しくない引数に対するビット/バイト演算の実行」を参
照してください。
引数のタイプと規則
BITOR はオーバーロード スカラー関数です。target_arg パラメータのデータ型は、
以下のいずれかになります。
• BYTEINT
• SMALLINT
SQL 関数、演算子、式および述部
271
第 6 章 ビット/バイト操作関数
BITOR
• INTEGER
• BIGINT
• VARBYTE(n)
bit_mask_arg パラメータのデータ型は、target_arg パラメータのデータ型に応じて
多様に変化します。次に示す入力の組み合わせ(target_arg, bit_mask_arg)が許容され
ています。
target_arg 型
bit_mask_arg 型
BYTEINT
BYTE(1)
BYTEINT
BYTEINT
SMALLINT
BYTE(2)
SMALLINT
SMALLINT
INTEGER
BYTE(4)
INTEGER
INTEGER
BIGINT
BYTE(8)
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。たとえば、BITOR(BYTEINT, INTEGER)は、暗黙的に
BITOR(INTEGER,INTEGER)に変換できるため許容されます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。詳細については、<SQL 外部ルーチン プログラミング 、
B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」を参照し
てください。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
272
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
BITXOR
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
BITOR のデフォルト タイトルは、BITOR(target_arg, bit_mask_arg)です。
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
例: BITOR 関数での問合わせ
次の問合わせの入力引数 23 は、データ タイプが BYTEINT であり、バイナリ表現
は 00010111 になります。入力引数 45 は、データ タイプが BYTEINT であり、バ
イナリ表現は 00101101 になります。2 つの引数のビット単位の和の結果は、
BYTEINT 値の 63 (つまり、バイナリの 00111111)になります。この値が、問合わ
せから返されます。
SELECT BITOR(23,45);
BITXOR
目的
2 つの入力引数のバイナリ表現に対して、ビット単位の排他和を実行します。
構文
BITXOR
( target_arg, bit_mask_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
SQL 関数、演算子、式および述部
273
第 6 章 ビット/バイト操作関数
BITXOR
bit_mask_arg
固定長バイト値、可変長バイト値、または数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
ビット単位の排他和は、同じ長さの 2 つのビット パターンを受け取り、対応する
ビットのペアごとに排他的論理和を実行します。実行結果は、各位置の 2 つのビッ
トが異なる場合は 1、2 つのビットが同じ場合は 0 になります。どちらかの入力引
数が NULL の場合、この関数は NULL を返します。
引数 target_arg と bit_mask_arg の長さが異なる場合、これらの引数は次に示すよう
に処理されます。
• 引数 target_arg と bit_mask_arg を、それぞれの最下位のバイトまたはビットで
整列する。
• 短い方の引数には、長い方の引数と同じサイズになるまで、左側に 0 を埋め込む。
引数のタイプと規則
BITXOR はオーバーロード スカラー関数です。target_arg パラメータのデータ型は、
以下のいずれかになります。
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
VARBYTE(n)
bit_mask_arg パラメータのデータ型は、target_arg パラメータのデータ型に応じて
多様に変化します。次に示す入力の組み合わせ(target_arg, bit_mask_arg)が許容され
ています。
274
target_arg 型
bit_mask_arg 型
BYTEINT
BYTE(1)
BYTEINT
BYTEINT
SMALLINT
BYTE(2)
SMALLINT
SMALLINT
INTEGER
BYTE(4)
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
BITXOR
target_arg 型
bit_mask_arg 型
INTEGER
INTEGER
BIGINT
BYTE(8)
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。たとえば、BITXOR(BYTEINT, INTEGER)は、暗黙的に
BITXOR(INTEGER,INTEGER)に変換できるため許容されます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
BITXOR のデフォルト タイトルは、BITXOR(target_arg, bit_mask_arg)です。
例: BITXOR 関数での問合わせ
次の問合わせの入力引数 12 は、データ タイプが BYTEINT であり、バイナリ表現
は 00001100 になります。入力引数 45 は、データ タイプが BYTEINT であり、バ
イナリ表現は 00101101 になります。2 つの引数のビット単位の排他和の結果は、
SQL 関数、演算子、式および述部
275
第 6 章 ビット/バイト操作関数
COUNTSET
BYTEINT 値の 33 (つまり、バイナリの 00100001)になります。この値が、問合わ
せから返されます。
SELECT BITXOR(12,45);
関連トピック
詳細は、以下を参照してください。
• 「長さの等しくない引数に対するビット/バイト演算の実行」。
• SQL データ型とリテラル、B035-1143。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
COUNTSET
目的
target_arg 式内のバイナリのビット数を戻します。カウントされるビットは、
target_value_arg の値に応じて 1 に設定されるか、0 に設定されます。
構文
COUNTSET
( target_arg
TD_SYSFNLIB.
)
, target_value_arg
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
target_value_arg
整数値。許容される値は 0 または 1 のみです。target_value_arg が指定されていな
い場合、デフォルトは 1 になります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
276
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
COUNTSET
説明
COUNTSET は、入力式 target_arg を受け取り、その式内のビット数をカウントしま
す。カウントされるビットは、target_value_arg の値に応じて、1 に設定されるか、
0 に設定されます。
target_value_arg パラメータは、0 または 1 の値のみを受け入れます。
target_value_arg の値が指定されていないと、デフォルトの値 1 が使用され、
COUNTSET は、1 に設定されているビット値をカウントします。
いずれかの入力引数が NULL の場合、この関数は NULL を返します。
引数のタイプと規則
COUNTSET は、オーバーロード スカラー関数です。この関数は、以下に示す入力
パラメータのデータ型の組み合わせ(target_arg [,target_value_arg])に応じて定義さ
れます。
target_arg 型
target_value_arg 型(任意選択)
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ タイプは INTEGER です。
結果の書式は INTEGER のデフォルト書式です。
COUNTSET のデフォルト タイトルは、COUNTSET(target_arg [, target_value_arg])
です。
SQL 関数、演算子、式および述部
277
第 6 章 ビット/バイト操作関数
GETBIT
例: COUNTSET 関数での問合わせ
次の問合わせでは、入力引数 23 を受け取ります。この値のデータ型は BYTEINT で
あり、バイナリ表現は 00010111 になります。target_value_arg が指定されていな
いため、デフォルトの値 1 が使用されます。そのため、この関数は、1 に設定され
ているビット値の数をカウントすることになります。 問合わせの結果は、INTEGER
値の 4 になります。
SELECT COUNTSET(23);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
GETBIT
目的
target_arg バイト式から、target_bit_arg で指定したビットの値を返します。
構文
GETBIT
( target_arg, target_bit_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
target_bit_arg
INTEGER 式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
278
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
GETBIT
説明
GETBIT は、target_bit_arg で指定したビットを、target_arg バイト式から取得し、
そのビットの値を示す 0 または 1 を返します。
target_bit_arg の入力値の範囲は、0 (ビット 0 が最下位ビット)から、
(sizeof(target_arg) - 1)まで許容されます。
target_bit_arg が負であるか、範囲外である(つまり、target_arg のサイズを超過し
ている)場合は、エラーが返されます。
どちらかの入力引数が NULL の場合、この関数は NULL を返します。
引数のタイプと規則
GETBIT は、オーバーロード スカラー関数です。この関数は、以下に示す入力パラ
メータのデータ型の組み合わせ(target_arg, target_bit_arg)に応じて定義されます。
target_arg 型
target_bit_arg 型
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
GETBIT は、0 か 1 の BYTEINT 値を返します。この値は、target_arg バイト式の
target_bit_arg の位置にあるビットの値を反映します。
結果の書式は BYTEINT のデフォルト書式です。
GETBIT のデフォルト タイトルは、GETBIT( target_arg, target_bit_arg)です。
SQL 関数、演算子、式および述部
279
第 6 章 ビット/バイト操作関数
ROTATELEFT
例: GETBIT 関数での問合わせ
次の問合わせでは、入力引数 23 の 3 番目のビットの値を取得します。この入力引
数のデータ タイプは BYTEINT であり、バイナリ表現は 00010111 になります。問
合わせの結果は BYTEINT 値の 1、またはバイナリの 00000001 になります。
SELECT GETBIT(23,2);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
ROTATELEFT
目的
num_bits_arg で指定したビット数だけ右方向に回転させた target_arg 式を返しま
す。最上位ビットは左方向に回り込みます。
構文
ROTATELEFT
( target_arg, num_bits_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
num_bits_arg
回転させるビット位置の数を示す INTEGER 式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
280
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
ROTATELEFT
説明
IF...
関数の動作
num_bits_arg が 0 と等しい場合 未変更の target_arg が返されます。
num_bits_arg が負の場合
ビットが、左ではなく右方向に回転されます。
target_arg および(また
NULL を返します。
は)num_bits_arg が NULL の場合
num_bits_arg が target_arg のサ (num_bits_arg MOD sizeof(target_arg))の数だけビットが
イズより大きい場合
回転されます。
回転操作の適用範囲は、target_arg 式のサイズに制限さ
れます。
注: 整数型の値(BYTEINT、SMALLINT、INTEGER または BIGINT)に対する操作では、
最上位にビットを回転させると、その整数は結果的に負になります。これは、
Teradata Database の INTEGER 型は、すべて符号付き整数だからです。
引数のタイプと規則
ROTATELEFT はオーバーロード スカラー関数です。この関数は、以下に示す入力パ
ラメータのデータ型の組み合わせ(target_arg, num_bits_arg)に応じて定義されます。
target_arg 型
num_bits_arg 型
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
SQL 関数、演算子、式および述部
281
第 6 章 ビット/バイト操作関数
ROTATELEFT
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
ROTATELEFT のデフォルト タイトルは、ROTATELEFT(target_arg, num_bits_arg)で
す。
例
例: ROTATELEFT 関数で入力引数 16 を問合わせる
次の問合わせの入力引数 16 は、データ タイプが BYTEINT であり、バイナリ表現は
00010000 になります。この値が、左方向に 2 ビット回転されると、結果のバイナ
リは 01000000 になります。この値を、BYTEINT 値に変換すると 64 になります。
問合わせは、この値を返します。
SELECT ROTATELEFT(16,2);
例: ROTATELEFT 関数で入力引数 64 を問合わせる
次の問合わせの入力引数 64 は、データ タイプが BYTEINT であり、バイナリ表現は
01000000 になります。この値が、左方向に 3 ビット回転されると、結果のバイナ
リは 00000010 になります。この値を、BYTEINT 値に変換すると 2 になります。
問合わせは、この値を返します。
SELECT ROTATELEFT(64,3);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
282
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
ROTATERIGHT
ROTATERIGHT
目的
num_bits_arg で指定したビット数だけ右方向に回転させた target_arg 式を返しま
す。最下位ビットは左方向に回り込みます。
構文
ROTATERIGHT
( target_arg, num_bits_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
num_bits_arg
回転させるビット位置の数を示す INTEGER 式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
IF...
関数の動作
num_bits_arg が 0 と等しい場合 未変更の target_arg が返されます。
num_bits_arg が負の場合
ビットが、右ではなく左方向に回転されます。
target_arg および(また
NULL を返します。
は)num_bits_arg が NULL の場合
num_bits_arg is larger than the
size of target_arg
(num_bits_arg MOD sizeof(target_arg))の数だけビットが
回転されます。
回転操作の適用範囲は、target_arg 式のサイズに制限さ
れます。
注: 整数型の値(BYTEINT、SMALLINT、INTEGER または BIGINT)に対する操作では、
最上位にビットを回転させると、その整数は結果的に負になります。これは、
Teradata Database の INTEGER 型は、すべて符号付き整数だからです。
SQL 関数、演算子、式および述部
283
第 6 章 ビット/バイト操作関数
ROTATERIGHT
引数のタイプと規則
ROTATERIGHT はオーバーロード スカラー関数です。この関数は、以下に示す入力
パラメータのデータ型の組み合わせ(target_arg, num_bits_arg)に応じて定義されます。
target_arg 型
num_bits_arg 型
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
ROTATERIGHT のデフォルト タイトルは、ROTATERIGHT(target_arg, num_bits_arg)
です。
284
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SETBIT
デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
例
例: ROTATERIGHT 関数で入力引数 32 を問合わせる
次の問合わせの入力引数 32 は、データ タイプが BYTEINT であり、バイナリ表現
は 00100000 になります。この値が、右方向に 2 ビット回転されると、結果のバイ
ナリは 00001000 になります。この値を、BYTEINT 値に変換すると 8 になります。
問合わせは、この値を返します。
SELECT ROTATERIGHT(32,2);
例: ROTATERIGHT 関数で入力引数 4 を問合わせる
次の問合わせの入力引数 4 は、データ タイプが BYTEINT であり、バイナリ表現は
00000100 になります。 この値が、右方向に 4 ビット回転されると、結果のバイ
ナリは 01000000 になります。この値を、BYTEINT 値に変換すると 64 になりま
す。問合わせは、この値を返します。
SELECT ROTATERIGHT(4,4);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• SQL データ型とリテラル、B035-1143。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
SETBIT
目的
target_bit_arg で指定したビットの値を、target_arg バイト式内の target_value_arg
の値に設定します。
構文
SETBIT
TD_SYSFNLIB.
SQL 関数、演算子、式および述部
( target_arg, target_bit_arg
)
, target_value_arg
285
第 6 章 ビット/バイト操作関数
SETBIT
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
target_bit_arg
INTEGER 式。
target_value_arg
整数値。許容される値は 0 または 1 のみです。target_value_arg が指定されていな
い場合、デフォルトは 1 になります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
SETBIT は、入力の target_arg を受け取り、target_bit_arg で指定したビットの値を、
target_value_arg 引数の内容に応じて 0 または 1 に設定します。
target_value_arg パラメータは、0 または 1 の値のみを受け入れます。
target_value_arg の値を指定しないと、デフォルト値の 1 が使用されます。
target_bit_arg の入力値の範囲は、0 (ビット 0 が最下位ビット)から、
(sizeof(target_arg) - 1)まで許容されます。
target_bit_arg が負であるか、範囲外である(つまり、target_arg のサイズを超過して
いる)場合は、エラーが返されます。
いずれかの入力引数が NULL の場合、この関数は NULL を返します。
引数のタイプと規則
SETBIT は、オーバーロード スカラー関数です。この関数は、以下に示す入力パラ
メータのデータ型の組み合わせ(target_arg, target_bit_arg [,target_value_arg])に応じ
て定義されます。
286
target_arg 型
target_bit_arg 型
target_value_arg 型(任意選択)
BYTEINT
INTEGER
INTEGER
SMALLINT
INTEGER
INTEGER
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SETBIT
target_arg 型
target_bit_arg 型
target_value_arg 型(任意選択)
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
INTEGER
VARBYTE(n)
INTEGER
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n )
VARBYTE(n )
VARBYTE(n )
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
SETBIT のデフォルト タイトルは、SETBIT( target_arg,
target_bit_arg[,target_value_arg ])です。
例
例: SETBIT 関数での問合わせ
次の問合わせでは、入力引数 23 を受け取ります。この入力引数のデータ タイプは
BYTEINT であり、バイナリ表現は 00010111 になります。その後で、3 番目のビッ
トの値を 1 に設定します。問合わせの結果は BYTEINT 値の 23 になり、バイナリで
は 00010111 になります。
SQL 関数、演算子、式および述部
287
第 6 章 ビット/バイト操作関数
SHIFTLEFT
SELECT SETBIT(23,2);
例: ROTATERIGHT 関数で入力引数 23 を問合わせる
次の問合わせでは、入力引数 23 を受け取ります。この入力引数のデータ タイプは
BYTEINT であり、バイナリ表現は 00010111 になります。その後で、3 番目のビッ
トの値を 0 に設定します。問合わせの結果は BYTEINT 値の 19 になり、バイナリで
は 00010011 になります。
SELECT SETBIT(23,2,0);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• SQL データ型とリテラル、B035-1143。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
SHIFTLEFT
目的
指定したビット数(num_bits_arg)だけ左方向に桁送りされた、target_arg 式が返され
ます。最上位のビットは失われ、最下位のビットに 0 が補填されます。
構文
SHIFTRIGHT
( target_arg, num_bits_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
num_bits_arg
桁送りするビット位置の数を示す INTEGER 式。
288
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SHIFTLEFT
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
IF...
関数の動作
num_bits_arg が 0 と等しい場合 未変更の target_arg が返されます。
num_bits_arg が負の場合
ビットが、左ではなく右方向に桁送りされます。
target_arg および(また
NULL を返します。
は)num_bits_arg が NULL の場合
num_bits_arg is larger than the
size of target_arg
エラーが返されます。
桁送り操作の適用範囲は、target_arg 式のサイズに制限
されます。target_arg の範囲を超える桁送りを指定する
と、SQL エラーが発生します。
注: 整数型の値(BYTEINT、SMALLINT、INTEGER または BIGINT)に対する操作では、
最上位にビットを桁送りすると、その整数は結果的に負になります。これは、
Teradata Database の INTEGER 型は、すべて符号付き整数だからです。
引数のタイプと規則
SHIFTLEFT はオーバーロード スカラー関数です。この関数は、以下に示す入力パラ
メータのデータ型の組み合わせ(target_arg, num_bits_arg)に応じて定義されます。
target_arg 型
num_bits_arg 型
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
SQL 関数、演算子、式および述部
289
第 6 章 ビット/バイト操作関数
SHIFTLEFT
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
SHIFTLEFT のデフォルト タイトルは、SHIFTLEFT(target_arg, num_bits_arg)です。
例: SHIFTLEFT 関数での問合わせ
次の問合わせの入力引数 3 は、データ タイプが BYTEINT であり、バイナリ表現は
00000011 になります。 この値が、左方向に 2 ビット桁送りされると、結果のバイ
ナリは 00001100 になります。この値を、BYTEINT 値に変換すると 12 になりま
す。問合わせは、この値を返します。
SELECT SHIFTLEFT(3,2);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
290
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SHIFTRIGHT
SHIFTRIGHT
目的
指定したビット数(num_bits_arg)だけ右方向に桁送りされた、target_arg 式が返さ
れます。最下位のビットは失われ、最上位のビットに 0 が補填されます。
構文
SHIFTRIGHT
( target_arg, num_bits_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
num_bits_arg
桁送りするビット位置の数を示す INTEGER 式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
IF...
関数の動作
num_bits_arg が 0 と等しい場合 未変更の target_arg が返されます。
num_bits_arg が負の場合
ビットが、右ではなく左方向に桁送りされます。
target_arg および(また
NULL を返します。
は)num_bits_arg が NULL の場合
num_bits_arg is larger than the
size of target_arg
エラーが返されます。
桁送り操作の適用範囲は、target_arg 式のサイズに制限
されます。target_arg の範囲を超える桁送りを指定する
と、SQL エラーが発生します。
注: 整数型の値(BYTEINT、SMALLINT、INTEGER または BIGINT)に対する操作では、
最上位のビットを送り出すと、その整数は結果的に負になります。これは、Teradata
Database の INTEGER 型は、すべて符号付き整数だからです。
SQL 関数、演算子、式および述部
291
第 6 章 ビット/バイト操作関数
SHIFTRIGHT
引数のタイプと規則
SHIFTRIGHT はオーバーロード スカラー関数です。この関数は、以下に示す入力パ
ラメータのデータ型の組み合わせ(target_arg, num_bits_arg)に応じて定義されます。
target_arg 型
num_bits_arg 型
BYTEINT
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
VARBYTE(n)
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ型は、次の表に示すように、この関数に渡した入力引数 target_arg の
データ型によって異なります。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTEINT
BYTEINT
SMALLINT
SMALLINT
SMALLINT
INTEGER
INTEGER
INTEGER
BIGINT
BIGINT
BIGINT
VARBYTE(n)
VARBYTE(n)
VARBYTE(n)
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
SHIFTRIGHT のデフォルト タイトルは、SHIFTRIGHT(target_arg, num_bits_arg)です。
292
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SUBBITSTR
例: SHIFTRIGHT 関数での問合わせ
次の問合わせの入力引数 3 は、データ タイプが BYTEINT であり、バイナリ表現は
00000011 になります。この値が、右方向に 2 ビット桁送りされると、結果のバイ
ナリは 00000000 になります。この値を、BYTEINT 値に変換すると 0 になります。
問合わせは、この値を返します。
SELECT SHIFTRIGHT(3,2);
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• SQL データ型とリテラル、B035-1143。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
SUBBITSTR
目的
target_arg 入力式から、指定したビット位置に基づいて、サブビット列を抽出します。
構文
SUBBITSTR
( target_arg, position_arg, num_bits_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
数値または可変長バイト式。
position_arg
抽出するサブビット列の開始位置を示す INTEGER 式。
SQL 関数、演算子、式および述部
293
第 6 章 ビット/バイト操作関数
SUBBITSTR
num_bits_arg
抽出するサブビット列の長さを示す INTEGER 式。これにより、関数が返すビット数
を指定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
SUBBITSTR は、target_arg 文字列式から、position_arg で指定したビット位置以降
のサブビット列を抽出します。データ型ごとのビット位置の範囲については、「ビッ
トおよびバイトの番号付けモデル」を参照してください。
抽出するサブビット列の長さを num_bits_arg の値で指定し、この関数が返すべき
ビット数を示します。この関数から返される値は VARBYTE 列なので、返されるビッ
ト数は、要求したビット数より大きなバイト境界に丸められることがあります。
返されるビットは右寄せにされ、余剰なビット(要求したビット数を超えた分)には 0
が補填されます。
position_arg が負であるか、範囲外である(つまり、target_arg のサイズを超過して
いる)場合は、エラーが返されます。
num_bits_arg が負の場合や、開始位置の position_arg を計算に入れると残りのビッ
ト数を超えてしまう場合は、エラーが返されます。
いずれかの入力引数が NULL の場合、この関数は NULL を返します。
引数のタイプと規則
SUBBITSTR はオーバーロード スカラー関数です。この関数は、以下に示す入力パラ
メータのデータ型の組み合わせ(target_arg, position_arg, num_bits_arg)に応じて定
義されます。
target_arg 型
position_arg 型
num_bits_arg 型
BYTEINT
INTEGER
INTEGER
SMALLINT
INTEGER
INTEGER
INTEGER
INTEGER
INTEGER
BIGINT
INTEGER
INTEGER
VARBYTE(n)
INTEGER
INTEGER
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
294
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
SUBBITSTR
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数がある場合は、その引数を明示的にキャス
トする必要があります。
いずれかの引数が、上記に明示したデータ タイプに変換できない場合は、実行依頼
された DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ タイプは VARBYTE 列です。VARBYTE 列のサイズ(バイト数)は、
target_arg 入力引数のデータ型と、要求したビット数に応じて変化します。
以下に例を示します。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
VARBYTE(1)
VARBYTE(1)
SMALLINT
VARBYTE(2)
VARBYTE(2)
INTEGER
VARBYTE(4)
VARBYTE(4)
BIGINT
VARBYTE(8)
VARBYTE(8)
VARBYTE(n)
VARBYTE(m)
VARBYTE(m)
この m は、要求された
ビット数が収まる最小の
バイト数になります。
VARBYTE の(n)に対する最大対応サイズは、8192 バイトです。
SUBBITSTR のデフォルト タイトルは、SUBBITSTR(target_arg, position_arg,
num_bits_arg)です。
例: SUBBITSTR 関数での問合わせ
次の問合わせでは、入力引数 20 を受け取ります。この入力引数のデータ タイプは
BYTEINT であり、バイナリ表現は 00010100 になります。その後で、3 番目のビッ
トから始まる 3 ビットを返すように要求します。返される 3 ビットの 101 は、0 で
充填されたバイト内に右寄せで配置されます。問合わせの結果は、値 5 になり、バ
イナリでは 00000101 になります。結果のデータ タイプは、VARBYTE(1)になりま
す。
SELECT SUBBITSTR(20,2,3);
SQL 関数、演算子、式および述部
295
第 6 章 ビット/バイト操作関数
TO_BYTE
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
TO_BYTE
目的
入力値(数値)のデータ型を Teradata Database サーバーのバイト表現(バイト値)に変
換します。
構文
TO_BYTE
( target_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
target_arg
変換される数値式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
説明
この関数が返すバイト数は、target_arg 値のデータ型によって変化します。
target_arg が NULL の場合、この関数は NULL を返します。
引数のタイプと規則
TO_BYTE はオーバーロード スカラー関数です。この関数は以下に示すパラメータの
データ タイプで定義されます。
296
SQL 関数、演算子、式および述部
第 6 章 ビット/バイト操作関数
TO_BYTE
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
この関数に渡す式は、上記に明示したデータ タイプと一致するか、UDF に適用され
る暗黙のデータ タイプ変換規則を使用して、上記のタイプに変換できる必要があり
ます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って上記に明示したデー
タ タイプのいずれかに変換できない引数は、明示的にキャストする必要があります。
上記に明示したデータ タイプのいずれかに引数が変換できない場合は、実行依頼さ
れた DML UDF 式と一致する関数が存在しないことを示すエラーが返されます。
結果のタイプと属性
結果のデータ タイプは、BYTE 値になります(固定バイト データ タイプ)。返される
バイト列のサイズは、次の表に示すように、target_arg 入力引数によって多様に変
化します。
target_arg のデータ型
結果のタイプ
デフォルト書式となる結果の書式
BYTEINT
BYTE(1)
BYTE(1)
SMALLINT
BYTE(2)
BYTE(2)
INTEGER
BYTE(4)
BYTE(4)
BIGINT
BYTE(8)
BYTE(8)
TO_BYTE のデフォルト タイトルは、TO_BYTE(target_arg))です。
例: TO_BYTE 関数での問合わせ
次の問合わせの入力引数 23 は、データ タイプが BYTEINT であり、バイナリ表現
は 00010111 になります。この値に対して TO_BYTE 演算を実行すると、結果とし
て値 00010111 が BYTE(17)のデータ タイプで返されます。
SELECT TO_BYTE(23);
関連トピック
詳細は、以下を参照してください。
• 整数値のサーバー表現については、 SQL データ型とリテラル、B035-1143 を参
照してください。
SQL 関数、演算子、式および述部
297
第 6 章 ビット/バイト操作関数
TO_BYTE
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング、B035-1147>の「互換データ型」と「オーバーロード関数のパラメータ型」
を参照してください。
298
SQL 関数、演算子、式および述部
第7章
組み込み関数
概要
ニラディック(引数を持たない)であるビルトイン関数は、システムに関するさまざ
まな情報を返します。組み込み関数は、特殊レジスターと呼ばれることもあります。
組み込み関数は、リテラルを使用できる場所であれば、どこでも使用できます。
組み込み関数を含んだ SELECT 文がテーブル名を参照する場合、問合わせの結果に
は、検索条件にかなったテーブルの各行ごとに 1 つの行が含まれます。
ACCOUNT
目的
現在のユーザーのアカウント文字列を戻します。
構文
ACCOUNT
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
ACCOUNT のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Account
SQL 関数、演算子、式および述部
299
第 7 章 組み込み関数
CURRENT_DATE
使用上の注意
SET SESSION ACCOUNT 文によって現在のアカウント文字列が変更されている場合
は、ACCOUNT 関数によって、要求レベルに基づく新しいアカウント文字列が戻さ
れます。つまり、セッション全体か、個別要求か、というレベルです。
例: ユーザーのアカウント文字列の要求
次の文は、現在のユーザーのアカウント文字列を要求します。
SELECT ACCOUNT;
システム応答は 、以下のようになります。
Account
-----------------------------$M_D2102
CURRENT_DATE
目的
現在日付を戻します。
構文
CURRENT_DATE
AT
LOCAL
expression
TIME ZONE
time_zone_string
構文要素
AT LOCAL
DBS 制御フラグ TimeDateWZControl が有効な場合は、セッションの時間とセッショ
ンのタイムゾーンを基にして構築された値が返されます。
TimeDateWZControl が無効な場合は、Teradata Database サーバー ローカルの時間
値とセッションのタイムゾーンを基にして構成された値が返されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
300
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_DATE
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
使用上の注意
CURRENT_DATE は、要求が開始された時点での日付を返します。要求が終了する
までに、CURRENT_DATE が複数回呼び出された場合でも、同じ日付が返されます。
返される日付が、要求の継続中に変更されることはありません。
AT 句なしで CURRENT_DATE を指定した場合や、CURRENT_DATE AT LOCAL を指
定した場合、返される値は、DBS 制御フラグ TimeDateWZControl の設定に応じて、
次に示すように変化します。
• TimeDateWZControl フラグが有効な場合、CURRENT_DATE は、セッションの時
間とセッションのタイムゾーンを基にして構築された日付を返します。
• TimeDateWZControl フラグが無効な場合、CURRENT_DATE は、Teradata
Database サーバーのローカルな時間値と、セッションのタイムゾーンを基にし
て構築された日付を返します。
詳細は、<ユーティリティ 、B035-1102>の「DBS 制御(dbscontrol)」を参照してく
ださい。
CURRENT_DATE は、夏時間(DST)の開始と終了を考慮に入れて調整された値を返し
ます。ただし、この調整が実行されるのは、次の場合に限られます。
• CURRENT_DATE が AT [TIME ZONE] time_zone_string とともに指定されていて、
time_zone_string が、個別の DST と標準タイムゾーン変位に対応している。
• CURRENT_DATE が AT LOCAL とともに指定されているか、AT 句なしで指定され
ていて、セッションのタイムゾーンが、個別の DST と標準のタイムゾーン変位
に対応しているタイムゾーン文字列で定義されている。
結果のタイプと属性
CURRENT_DATE の、結果のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ 書式
タイトル
DATE
DATE
SQL 関数、演算子、式および述部
DATE データ タイプのデフォルト書式(Dateform モードが
IntegerDate に設定されている場合)。
301
第 7 章 組み込み関数
CURRENT_DATE
データ タイプ 書式
タイトル
デフォルト書式の詳細については、< SQL データ型とリテ
ラル、B035-1143>の「データ タイプの書式および書式句」
を参照してください。
CURRENT_DATE を変換するには、Teradata の明示変換構文または ANSI CAST 構文
を使用します。
CURRENT_DATE と DATE
CURRENT_DATE は、Teradata 関数である DATE と同様の機能を持っており、ANSI
準拠の構文を使用します。Teradata の DATE 関数の詳細については、「DATE」を参
照してください。
例
例: INTERVAL -'08:00' HOUR TO MINUTE の現在の日付を返す
この例では、DATE 値のデフォルト フォーマットが'yy/mm/dd'だと仮定しています。
次の文を考えます。
SET TIME ZONE INTERVAL
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
SELECT CURRENT_DATE AT
'01:00' HOUR TO MINUTE;
TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
INTERVAL -'08:00' HOUR TO MINUTE;
TIME ZONE INTERVAL -'08' HOUR;
INTERVAL -'08' HOUR;
TIME ZONE '-08:00';
'-08:00';
TIME ZONE '-8';
'-8';
TIME ZONE -8;
-8;
-8.0;
上記の SELECT 文は、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE を基
にして現在の日付を返します。現在のタイムスタンプが TIMESTAMP '2008-06-01
06:30:00.000000+00:00' (UTC)だとすると、上記の SELECT 文は日付として
'08/05/31'を返します。
SELECT 文が AT 句なしで指定されるか、AT LOCAL 句とともに指定されていて、DBS
制御フラグ TimeDateWZControl が有効な場合、この文は現在の日付として
'08/06/01'を返します。この日付は、現行セッションの時間とタイムゾーン変位
INTERVAL '01:00' HOUR TO MINUTE に基づいています。たとえば、
SELECT CURRENT_DATE;
SELECT CURRENT_DATE AT LOCAL;
302
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_DATE
返される日付には、夏時間の開始や終了を考慮した調整が行なわれません。
例: INTERVAL -'09:00' HOUR TO MINUTE の現在の日付を返す
この例では、DATE 値のデフォルト フォーマットが'yy/mm/dd'だと仮定していま
す。次の文を考えます。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CURRENT_DATE AT INTERVAL '09:00' HOUR TO MINUTE;
上記の SELECT 文は、タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を基
にして現在の日付を返します。現在のタイムスタンプが TIMESTAMP '2008-06-01
19:30:00.000000+00:00' (UTC)だとすると、上記の SELECT 文は日付として
'08/06/02'を返します。
SELECT 文が AT 句なしで指定されるか、AT LOCAL 句とともに指定されていて、
DBS 制御フラグ TimeDateWZControl が有効な場合、この文は現在の日付として
'08/06/01'を返します。この日付は、現行セッションの時間とタイムゾーン変位
INTERVAL '01:00' HOUR TO MINUTE に基づいています。
返される日付には、夏時間の開始や終了を考慮した調整が行なわれません。
例: INTERVAL -'05:45' HOUR TO MINUTE の現在の日付を返す
この例では、DATE 値のデフォルト フォーマットが'yy/mm/dd'だと仮定していま
す。次の文を考えます。
SET TIME ZONE INTERVAL '10:00' HOUR TO MINUTE;
SELECT CURRENT_DATE AT '05:45';
SELECT CURRENT_DATE AT 5.75;
上記の SELECT 文は、タイムゾーン変位 INTERVAL '05:45' HOUR TO MINUTE を基
にして現在の日付を返します。現在のタイムスタンプが TIMESTAMP '2008-06-01
17:30:00.000000+00:00' (UTC)だとすると、上記の SELECT 文は日付として
'08/06/01'を返します。
SELECT 文が AT 句なしで指定されるか、AT LOCAL 句とともに指定されていて、
DBS 制御フラグ TimeDateWZControl が有効な場合、この文は現在の日付として
'08/06/02'を返します。この日付は、現行セッションの時間とタイムゾーン変位
INTERVAL '10:00' HOUR TO MINUTE に基づいています。
返される日付には、夏時間の開始や終了を考慮した調整が行なわれません。
例: タイムゾーン文字列'America Pacific'の現在の日付を返す
次の問合わせは、タイムゾーン文字列'America Pacific'を基にしたタイムゾーン変位
での、現在の日付を返します。Teradata Database は、タイムゾーン文字列と、
CURRENT_TIMESTAMP AT '00:00'(UTC)を基にしてタイムゾーン変位を決定します。
返される日付は、夏時間の開始と終了を考慮に入れて自動的に調整されます。
SQL 関数、演算子、式および述部
303
第 7 章 組み込み関数
CURRENT_ROLE
SELECT CURRENT_DATE AT TIME ZONE 'America Pacific';
SELECT CURRENT_DATE AT 'America Pacific';
例: デフォルトの出力フォーマットの変更
CURRENT_DATE の結果のデフォルト出力書式を変更するには、Teradata 明示変換
構文を使用して、FORMAT 句を指定します。たとえば、次の文で現在の日付を要求
し、デフォルトとは異なる書式を指定するとします。
SELECT CURRENT_DATE (FORMAT 'MMMBDD,BYYYY');
結果は以下のようになります。
Date
-----------May 31, 2007
関連トピック
詳細は、以下を参照してください。
• デフォルトのデータ タイプの書式と FORMAT 句の詳細については、< SQL デー
タ型とリテラル、B035-1143>の「データ タイプの書式および書式句」を参照し
てください。
• Teradata 明示変換構文を使用してデフォルトの出力書式を変更する例について
は、例: デフォルトの出力フォーマットの変更を参照してください。
• タイムゾーン文字列の詳細については、AT LOCAL および AT TIME ZONE タイム
ゾーン指定子を参照してください。
CURRENT_ROLE
目的
現在許可されているユーザーの現在のロールを戻します。
構文
CURRENT_ROLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
304
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_ROLE
結果のタイプと属性
CURRENT_ROLE のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Current_Role
結果値
プロキシ接続経由で Teradata Database にアクセスしているのではない場合、
CURRENT_ROLE 関数は、ROLE ビルトイン関数と全く同じくセッションの現在の
ロールを返します。これは、セッション ユーザーの現在のロールです。詳細は、
「ROLE」を参照してください。
プロキシ接続経由で Teradata Database にアクセスしている場合、CURRENT_ROLE
は、次の表に示すようにプロキシ ユーザーの現在のロールを返します。
セッションの現在のロール
結果のタイプ
PROXYROLE で設定したロール
ロールの名前。
デフォルト
プロキシ ユーザーの CONNECT THROUGH 権
限にプロキシ ロールが 1 つある場合、結果値
はそのロール名になります。
プロキシ ユーザーの CONNECT THROUGH 権
限にプロキシ ロールが複数ある場合、結果値
は ALL になります。
PROXYROLE=ALL
ALL
PROXYROLE=NONE または NULL
NULL
使用上の注意
CURRENT_ROLE は、FastLoad および MultiLoad ユーティリティではサポートされ
ません。
例: CURRENT_ROLE の選択
以下の文を使って、現在許可されているユーザーの現在のロールを識別できます。
SELECT CURRENT_ROLE;
次のような応答が表示されます。
Current_Role
-----------------------------Buyers_role
SQL 関数、演算子、式および述部
305
第 7 章 組み込み関数
CURRENT_TIME
CURRENT_TIME
目的
現在の時間を返します。
構文
CURRENT_TIME
(fractional_precision )
AT
LOCAL
expression
TIME ZONE
time_zone_string
構文要素
fractional_precision
返される値の精度範囲。有効な範囲は、0~6 です。デフォルトは 0 です。
AT LOCAL
DBS 制御フラグ TimeDateWZControl が有効な場合は、セッションの時間とセッショ
ンのタイムゾーンを基にして構築された値が返されます。
TimeDateWZControl が無効な場合は、Teradata Database サーバー ローカルの時間
値とセッションのタイムゾーンを基にして構成された値が返されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
使用上の注意
CURRENT_TIME は、要求が開始された時点での現在の時間を返します。要求が終了
するまでに、CURRENT_TIME が複数回呼び出された場合でも、同じ時間が返されま
す。返される時間が、要求の継続中に変更されることはありません。
306
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_TIME
AT 句なしで CURRENT_TIME を指定した場合や、CURRENT_TIME AT LOCAL を指
定した場合、返される値は、DBS 制御フラグ TimeDateWZControl の設定に応じて、
次に示すように変化します。
• TimeDateWZControl フラグが有効な場合、CURRENT_TIME は、セッションの時
間とセッションのタイムゾーンを基にして構築された時間を返します。
• TimeDateWZControl フラグが無効な場合、CURRENT_TIME は、Teradata
Database サーバーのローカルな時間値と、セッションのタイムゾーンを基にし
て構築された時間を返します。
CURRENT_TIME は、夏時間(DST)の開始と終了を考慮に入れて調整された値を返し
ます。ただし、この調整が実行されるのは、次の場合に限られます。
• CURRENT_TIME が AT [TIME ZONE] time_zone_string とともに指定されていて、
time_zone_string が、個別の DST と標準タイムゾーン変位に対応している。
• CURRENT_TIME が AT LOCAL とともに指定されているか、AT 句なしで指定され
ていて、セッションのタイムゾーンが、個別の DST と標準のタイムゾーン変位
に対応しているタイムゾーン文字列で定義されている。
注: ストアド プロシージャで CURRENT_TIME を使用する場合、DBS 制御フィール
ドの System TimeZone Hour または System TimeZone Minute を変更するときには、
常にそのプロシージャを再コンパイルする必要があります。タイムゾーン文字列が
tdlocaledef ユーティリティを使用して設定されている場合は 、ストアド プロシー
ジャを再コンパイルする必要はありません。
結果のタイプと属性
CURRENT_TIME の、結果のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
TIME WITH TIME ZONE
TIME WITH TIME ZONE データ タイプ Current Time
のデフォルト書式。
(fractional_precision)
タイトル
CURRENT_TIME を変換するには、Teradata の明示変換構文または ANSI CAST 構文
を使用します。
精度
CURRENT_TIME の結果の秒精度は秒の 100 分の 1 に制限されます。
CURRENT_TIME は、秒の小数点以下 2 桁の有効数字よりも右側の部分については
ゼロを戻します。
CURRENT_TIME のフィールド
CURRENT_TIME のフィールドは、以下のとおりです。
• HOUR
SQL 関数、演算子、式および述部
307
第 7 章 組み込み関数
CURRENT_TIME
•
•
•
•
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
CURRENT_TIME と TIME
CURRENT_TIME は、Teradata 関数である TIME と同様の機能を持っており、ANSI
準拠の構文を使用します。Teradata の TIME 関数の詳細については、TIME を参照し
てください。
例
例: 現在の時間の要求
DBS 制御フラグ TimeDateWZControl が有効な場合、次に示す文は、現在のセッショ
ンの時間とタイムゾーンを基にした、現在の時間を要求します。
SELECT CURRENT_TIME;
SELECT CURRENT_TIME AT LOCAL;
結果は以下のようになります。
Current Time(0)
--------------15:53:34+00:00
セッションのタイムゾーンが、個別の DST と標準タイムゾーン変位に対応する、タ
イムゾーン文字列で定義されている場合は、夏時間の開始と終了を考慮に入れて自
動的に調整された時間が戻されます。それ以外の場合は、夏時間についての調整は
実行されません。
例: タイムゾーン文字列を使用した現在の時間の要求
次の問合わせは、タイムゾーン文字列'America Pacific'を基にしたタイムゾーン変位
での、現在の時間を返します。返される時間は、夏時間の開始と終了を考慮に入れ
て自動的に調整されます。
SELECT CURRENT_TIME AT TIME ZONE 'America Pacific';
SELECT CURRENT_TIME AT 'America Pacific';
例: デフォルトの出力フォーマットの変更
CURRENT_TIME の結果のデフォルト出力書式を変更するには、Teradata 明示変換構
文を使用して、FORMAT 句を指定します。たとえば、次の文で現在 時間を要求し、
デフォルトとは異なる書式を指定するとします。
SELECT CURRENT_TIME (FORMAT 'HH:MIBT');
308
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_TIMESTAMP
結果は次のようになります。
Current Time(0)
--------------02:29 PM
関連トピック
詳細は、以下を参照してください。
• 詳細は、AT LOCAL および AT TIME ZONE タイムゾーン指定子を参照してくださ
い。
• デフォルトのデータ タイプの書式と FORMAT 句の詳細については、< SQL デー
タ型とリテラル、B035-1143>の「データ タイプの書式および書式句」を参照し
てください。
• Teradata 明示変換構文を使用してデフォルトの出力書式を変更する例について
は、例: デフォルトの出力フォーマットの変更を参照してください。
• 詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>の「CREATE
PROCEDURE (SQL 形式)」および<ユーティリティ 、B035-1102>の「DBS 制御
(dbscontrol)」を参照してください。
CURRENT_TIMESTAMP
目的
現在のタイムスタンプを返します。
構文
CURRENT_TIMESTAMP
(fractional_precision )
AT
LOCAL
expression
TIME ZONE
time_zone_string
構文要素
fractional_precision
返される値の精度範囲。有効な範囲は、0~6 です。デフォルトは 0 です。
AT LOCAL
DBS 制御フラグ TimeDateWZControl が有効な場合は、セッションの時間とセッショ
ンのタイムゾーンを基にして構築された値が返されます。
SQL 関数、演算子、式および述部
309
第 7 章 組み込み関数
CURRENT_TIMESTAMP
TimeDateWZControl が無効な場合は、Teradata Database サーバー ローカルの時間
値とセッションのタイムゾーンを基にして構成された値が返されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
使用上の注意
CURRENT_TIMESTAMP は、要求が開始された時点での現在のタイムスタンプを返
します。要求が終了するまでに、CURRENT_TIMESTAMP が複数回呼び出された場
合でも、同じタイムスタンプが返されます。返されるタイムスタンプが、要求の継
続中に変更されることはありません。
AT 句なしで CURRENT_TIMESTAMP を指定した場合や、CURRENT_TIMESTAMP AT
LOCAL を指定した場合、返される値は、DBS 制御フラグ TimeDateWZControl の設
定に応じて、次に示すように変化します。
• TimeDateWZControl フラグが有効な場合、CURRENT_TIMESTAMP は、セッショ
ンの時間とセッションのタイムゾーンを基にして構築されたタイムスタンプを返
します。
• TimeDateWZControl フラグが無効な場合、CURRENT_TIMESTAMP は、Teradata
Database サーバーのローカルな時間値と、セッションのタイムゾーンを基にして
構築されたタイムスタンプを返します。
CURRENT_TIMESTAMP は、夏時間(DST)の開始と終了を考慮に入れて調整された値
を返します。ただし、この調整が実行されるのは、次の場合に限られます。
• CURRENT_TIMESTAMP が AT [TIME ZONE] time_zone_string とともに指定され
ていて、time_zone_string が、個別の DST と標準タイムゾーン変位に対応してい
る。
• CURRENT_TIMESTAMP が AT LOCAL とともに指定されているか、AT 句なしで指
定されていて、セッションのタイムゾーンが、個別の DST と標準のタイムゾーン
変位に対応しているタイムゾーン文字列で定義されている。
注: ストアド プロシージャで CURRENT_TIMESTAMP を使用する場合、DBS 制御
フィールドの System TimeZone Hour または System TimeZone Minute を変更する
ときには、常にそのプロシージャを再コンパイルする必要があります。タイムゾー
310
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_TIMESTAMP
ン文字列が tdlocaledef ユーティリティを使用して設定されている場合は 、ストア
ド プロシージャを再コンパイルする必要はありません。
結果のタイプと属性
CURRENT_TIMESTAMP の、結果のデータ タイプ、書式、およびタイトルは次のと
おりです。
データ タイプ
書式
タイトル
TIMESTAMP WITH
TIME ZONE
TIMESTAMP WITH TIME ZONE データ タイプ Current TimeStamp
のデフォルト書式。
(fractional_precisio
n)
デフォルト書式の詳細については、< SQL デー
タ型とリテラル、B035-1143>の「データ タ
イプの書式および書式句」を参照してくださ
い。
CURRENT_TIMESTAMP を変換するには、Teradata の明示変換構文または ANSI
CAST 構文を使用します。Teradata 明示変換構文を使用してデフォルトの出力書式
を変更する例については、「例: デフォルトの出力書式の変更」を参照してください。
精度
CURRENT_TIMESTAMP の結果の秒精度は秒の 100 分の 1 に制限されます。
CURRENT_TIMESTAMP は、秒の小数点以下 2 桁の有効数字よりも右側の部分につ
いてはゼロを戻します。
CURRENT_TIMESTAMP のフィールド
CURRENT_TIMESTAMP のフィールドは、以下のとおりです。
•
•
•
•
•
•
•
•
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
例
例: 現在のタイムスタンプの要求
DBS 制御フラグ TimeDateWZControl が有効な場合、次に示す文は、現在のセッショ
ンの時間とタイムゾーンを基にした、現在のタイムスタンプを要求します。
SQL 関数、演算子、式および述部
311
第 7 章 組み込み関数
CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP AT LOCAL;
結果は以下のようになります。
Current TimeStamp(6)
-------------------------------2001-11-27 15:53:34.910000+00:00
セッションのタイムゾーンが、個別の DST と標準タイムゾーン変位に対応する、タ
イムゾーン文字列で定義されている場合は、夏時間の開始と終了を考慮に入れて自
動的に調整されたタイムスタンプが戻されます。それ以外の場合は、夏時間につい
ての調整は実行されません。
例: CURRENT_TIMESTAMP および TimeDateWZControl フラグ
この例では、CURRENT_TIMESTAMP が AT 句なしか、AT LOCAL 句とともに指定さ
れているときに、DBS 制御フラグ TimeDateWZControl が、この関数の返す値に与え
る効果を示しています。
次のように仮定します。
• Teradata Database サーバーのローカル時間は、協定世界時(UTC)で 2010 年 1 月
31 日の 11:59:00 です。
• ユーザー TK は、東京で暮らしています。東京は UTC からのオフセットが+9 時
間と定義されています。
• ユーザー LA は、ロサンゼルスで暮らしています。ロサンゼルスは UTC からのオ
フセットが-8 時間と定義されています。
• ユーザー TK とユーザー LA は、CURRENT_TIMESTAMP 関数をまったく同時に実
行しました。
TimeDateWZControl フラグが有効な場合
ユーザー TK の CURRENT_TIMESTAMP 関数は、以下を返します。
2010-02-01 10:59:00.000000+09:00
ユーザー LA の CURRENT_TIMESTAMP 関数は、以下を返します。
2010-01-31 16:59:00.000000-08:00
TimeDateWZControl フラグが無効な場合
ユーザー TK の CURRENT_TIMESTAMP 関数は、以下を返します。
2010-01-31 11:59:00.000000+09:00
ユーザー LA の CURRENT_TIMESTAMP 関数は、以下を返します。
2010-01-31 11:59:00.000000-08:00
312
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
CURRENT_USER
例: タイムゾーン文字列を使用した現在のタイムスタンプの要求
次の問合わせは、タイムゾーン文字列'America Pacific'を基にしたタイムゾーン変位
での、現在のタイムスタンプを返します。返されるタイムスタンプは、夏時間の開
始と終了を考慮に入れて自動的に調整されます。
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'America Pacific';
SELECT CURRENT_TIMESTAMP AT 'America Pacific';
例: デフォルトの出力フォーマットの変更
CURRENT_TIMESTAMP の結果のデフォルト出力書式を変更するには、Teradata 明
示変換構文を使用して、FORMAT 句を指定します。たとえば、次の文で現在のタイ
ムスタンプを要求し、デフォルトとは異なる書式を指定するとします。
SELECT CURRENT_TIMESTAMP (FORMAT 'MMMBDD,BYYYYBHH:MIBT');
結果は次のようになります。
Current TimeStamp(6)
--------------------Feb 19, 2002 07:45 am
関連トピック
詳細は、以下を参照してください。
• タイムゾーン文字列の詳細については、AT LOCAL および AT TIME ZONE タイム
ゾーン指定子を参照してください。
• 例: デフォルトの出力フォーマットの変更
• <SQL データ定義言語 - 構文規則および例、B035-1144>の「CREATE PROCEDURE
(SQL 形式)」
• <ユーティリティ 、B035-1102>の「DBS 制御(dbscontrol)」
• デフォルトのデータ タイプの書式と FORMAT 句の詳細については、< SQL デー
タ型とリテラル、B035-1143>の「データ タイプの書式および書式句」を参照し
てください。
CURRENT_USER
目的
現在許可されているユーザーのユーザー名を戻します。
構文
CURRENT_USER
SQL 関数、演算子、式および述部
313
第 7 章 組み込み関数
DATABASE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
結果のタイプと属性
CURRENT_USER のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Current_User
結果値
プロキシ接続経由で Teradata Database にアクセスしている場合、CURRENT_USER
は、プロキシ ユーザー名を返します。それ以外の場合、USER ビルトイン関数と全
く同じように機能し、セッションのユーザー名を返します。詳細は、「USER」を参
照してください。
例
例: 現在のユーザーの識別
以下の文を使って、現在許可されているユーザーを識別できます。
SELECT CURRENT_USER;
システム応答は 、以下のようになります。
Current_User
-----------------------------BO-JSMITH
例: 現在のユーザーの肩書の選択
以下の例は、現在許可されているユーザーのジョブ タイトルを取り出します。
SELECT JobTitle FROM Employee WHERE Name = CURRENT_USER;
DATABASE
目的
現在のユーザーのデフォルト データベースの名前を戻します。
314
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
DATE
構文
DATABASE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
DATABASE のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Database
使用上の注意
DATABASE 要求によって現在のデフォルト データベースが変更されている場合は、
DATABASE 関数によって、デフォルトの新しい名前が戻されます。
例: デフォルトのデータベースの名前の要求
次の文は、デフォルト データベースの名前を要求します。
SELECT DATABASE;
システム応答は 、以下のようになります。
Database
-----------------------------Customer_Service
DATE
目的
現在日付を戻します。
構文
DATE
AT
LOCAL
expression
TIME ZONE
SQL 関数、演算子、式および述部
time_zone_string
315
第 7 章 組み込み関数
DATE
構文要素
AT LOCAL
DBS 制御フラグ TimeDateWZControl が有効な場合は、セッションの時間とセッショ
ンのタイムゾーンを基にして構築された値が返されます。
TimeDateWZControl が無効な場合は、Teradata Database サーバー ローカルの時間
値とセッションのタイムゾーンを基にして構成された値が返されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
使用上の注意
DATE は、要求が開始された時点での日付を返します。要求が終了するまでに、DATE
が複数回呼び出された場合でも、同じ日付が返されます。返される日付が、要求の
継続中に変更されることはありません。
AT 句なしで DATE を指定した場合や、DATE AT LOCAL を指定した場合、返される
値は、DBS 制御フラグ TimeDateWZControl の設定に応じて、次に示すように変化し
ます。
• TimeDateWZControl フラグが有効な場合、DATE は、セッションの時間とセッ
ションのタイムゾーンを基にして構築された日付を返します。
• TimeDateWZControl フラグが無効な場合、DATE は、Teradata Database サーバー
のローカルな時間値と、セッションのタイムゾーンを基にして構築された日付を
返します。
DATE は、夏時間(DST)の開始と終了を考慮に入れて調整された値を返します。ただ
し、この調整が実行されるのは、次の場合に限られます。
• DATE が AT [TIME ZONE] time_zone_string とともに指定されていて、
time_zone_string が、個別の DST と標準タイムゾーン変位に対応している。
• DATE が AT LOCAL とともに指定されているか、AT 句なしで指定されていて、
セッションのタイムゾーンが、個別の DST と標準のタイムゾーン変位に対応して
いるタイムゾーン文字列で定義されている。
DATE をユーザー定義メソッド呼出しの最初の引数として使用することはできません。
316
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
DATE
結果のタイプと属性
DATE のデフォルトの書式は、Dateform モードの値に応じて異なります。DATE の
データ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ 書式
DATE
タイトル
日付形式モード
DATE 関数書式
INTEGERDATE
SDF で指定された DATE データ タ DATE
イプのデフォルトの書式
ANSIDATE
'YYYY-MM-DD'
DATE と CURRENT_DATE
DATE の使用はお勧めしません。その代わりに、ANSI SQL:2011 準拠の
CURRENT_DATE 関数を使用してください。
例
例 1: INTERVAL -'08:00:00' HOUR TO MINUTE を基に現在の日付を返す
この例では、DATE 値のデフォルト フォーマットが'yy/mm/dd'だと仮定していま
す。次の文を考えます。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT DATE AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT DATE AT INTERVAL -'08:00' HOUR TO MINUTE;
SELECT DATE AT TIME ZONE INTERVAL -'08' HOUR;
SELECT DATE AT INTERVAL -'08' HOUR;
SELECT DATE AT TIME ZONE '-08:00';
SELECT DATE AT '-08:00';
SELECT DATE AT TIME ZONE '-8';
SELECT DATE AT '-8';
SELECT DATE AT TIME ZONE -8;
SELECT DATE AT -8;
SELECT DATE AT -8.0;
上記の SELECT 文は、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE を基
にして現在の日付を返します。現在のタイムスタンプが TIMESTAMP '2008-06-01
06:30:00.000000+00:00' (UTC)だとすると、上記の SELECT 文は日付として
'08/05/31'を返します。
SELECT 文が AT 句なしで指定されるか、AT LOCAL 句とともに指定されていて、
DBS 制御フラグ TimeDateWZControl が有効な場合、この文は現在の日付として
'08/06/01'を返します。この日付は、現行セッションの時間とタイムゾーン変位
INTERVAL '01:00' HOUR TO MINUTE に基づいています。たとえば、
SELECT DATE;
SELECT DATE AT LOCAL;
返される日付には、夏時間の開始や終了を考慮した調整が行なわれません。
SQL 関数、演算子、式および述部
317
第 7 章 組み込み関数
PROFILE
例 2: 'mm-dd-yy'への表示変更
FORMAT 句を使って、表示形式を変更してみましょう。
SELECT DATE (FORMAT 'mm-dd-yy');
Date
-------03-30-96
例: タイムゾーン文字列'America Pacific'に基づいて現在の日付を返す
次の問合わせは、タイムゾーン文字列'America Pacific'を基にしたタイムゾーン変位
での、現在の日付を返します。Teradata Database は、タイムゾーン文字列と、
CURRENT_TIMESTAMP AT '00:00'(UTC)を基にしてタイムゾーン変位を決定します。
返される日付は、夏時間の開始と終了を考慮に入れて自動的に調整されます。
SELECT DATE AT TIME ZONE 'America Pacific';
SELECT DATE AT 'America Pacific';
例 4: 表示を'mmmbdd,byyyy'に変更する
別の形式にします。
SELECT DATE (FORMAT 'mmmbdd,byyyy');
Date
-----------Mar 30, 1996
関連トピック
詳細は、以下を参照してください。
• dbscontrol の詳細については、<ユーティリティ 、B035-1102>の「DBS 制御
(dbscontrol)」を参照してください。
• タイムゾーン文字列の詳細については、AT LOCAL および AT TIME ZONE タイム
ゾーン指定子を参照してください。
• デフォルトのデータ タイプ書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
• DATE と CURRENT_DATE の詳細については、CURRENT_DATE を参照してくださ
い。
PROFILE
目的
セッションの現在のプロファイルを戻すか、それがない場合は NULL を戻します。
318
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
ROLE
構文
PROFILE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
PROFILE のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Profile
例
以下の文を使って、セッションの現在のプロファイルを識別できます。
SELECT PROFILE ;
ROLE
目的
セッションの現在のロールを戻します。
構文
ROLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
ROLE のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
Role
SQL 関数、演算子、式および述部
319
第 7 章 組み込み関数
ROLE
結果値
セッション ログオンは、ディレクトリ ベースである場合とそうでない場合がありま
す。
プロキシ接続経由で Teradata Database にアクセスしている場合にプロキシ ユーザー
の現在のロールを取得するには、CURRENT_ROLE ビルトイン関数を使用します。
セッション ログオンがディレクトリ ベースでない
セッション ログオンがディレクトリ ベースでない場合は、次の表を参照してくださ
い。
セッションの現行ロール
結果値
既存のロール
そのロールの名前
ALL
'ALL'
NONE または NULL
NULL
セッション ログオンがディレクトリ ベースである
セッション ログオンがディレクトリ ベースである場合は、次の表を参照してくださ
い。
セッション
結果値
ディレクトリ管理ロールのセットが割り当てられていて、現
行ロールを変更しない場合
'EXTERNAL'
SET ROLE EXTERNAL 文を使用する場合
• ディレクトリ管理ロールのセットが割り当てられていない、 永続ユーザーのデフォルト
• デフォルト データベース管理ロールを持つ永続ユーザーに ロールの名前
マップされる、かつ
• 現行ロールを変更しない場合
SET ROLE role_name 文を使用する場合(role_name はディレク 指定したロールの名前
トリ管理ロールまたはデータベース管理ロール)
SET ROLE ALL 文を使用する場合
'ALL'
• ディレクトリ管理ロールのセットが割り当てられていない、 NULL
• 現行ロールを変更しない、および次のいずれかの条件が真
である
ディレクトリ ベース ログオンが永続ユーザーにマップさ
れない
ディレクトリ ベース ログオンがマップされる永続ユーザー
にデフォルト データベース管理ロールがない
SET ROLE NONE 文を使用する場合
320
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
SESSION
セッション
結果値
SET ROLE NULL 文を使用する場合
使用上の注意
ROLE は、FastLoad および MultiLoad ユーティリティではサポートされません。
例: セッションの現在のロールの識別
以下の文を使って、セッションの現在のロールを識別できます。
SELECT ROLE;
システム応答は 、以下のようになります。
Role
-----------------------------EXTERNAL
SESSION
目的
現在のユーザーのセッションの番号を戻します。
構文
SESSION
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果のタイプと属性
SESSION のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ 書式
セッション
INTEGER
Session
INTEGER データ タイプのデフォルト書式。
デフォルト書式の詳細については、< SQL データ型とリテ
ラル、B035-1143>の「データ タイプの書式および書式句」
を参照してください。
SQL 関数、演算子、式および述部
321
第 7 章 組み込み関数
TEMPORAL_DATE
例: 現在のユーザーのセッション番号の識別
次の文は、現在のユーザーのセッションの番号を識別します。
SELECT SESSION;
システム応答は 、以下のようになります。
Session
----------1048
TEMPORAL_DATE
目的
セッションのタイムゾーンに基づいて評価した、現在のトランザクションの日付を
返します。
構文
TEMPORAL_DATE
結果のタイプと属性
TEMPORAL_DATE の、結果のデータ タイプ、書式、およびタイトルは次のとおりで
す。
データ タイプ
書式
DATE
DATE データ タイプのデフォルト書式(Dateform DATE
モードが IntegerDate に設定されている場合)。
タイトル
デフォルト書式の詳細については、< SQL デー
タ型とリテラル、B035-1143>の「データ タイ
プの書式および書式句」を参照してください。
使用上の注意
TEMPORAL_DATE の値は、単一のトランザクション内で実行された要求すべてに対
して同じになります。
システムは、セッションのタイムゾーンを使用して TEMPORAL_DATE を評価します。
CHECK 制約または DEFAULT 句に TEMPORAL_DATE があると、結果値が評価され
る時期は、この要求が CHECK 制約を適用したとき(挿入時または更新時)か、この要
求が特定の列の DEFAULT 値を使用したときになります。
322
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
TEMPORAL_TIMESTAMP
制約事項
パーティション基本索引を定義する PARTITION BY 句のパーティション式内では、
TEMPORAL_DATE はサポートされません。
TEMPORAL_TIMESTAMP
目的
セッションのタイムゾーンに基づいて評価した、現在のトランザクションのタイム
スタンプを返します。
構文
TEMPORAL_TIMESTAMP
( precision )
構文要素
precision
返される値の精度範囲。有効な範囲は、0~6 です。デフォルトは 0 です。
結果のタイプと属性
TEMPORAL_TIMESTAMP の、結果のデータ タイプ、書式、およびタイトルは次の
とおりです。
データ タイプ
書式
TIMESTAMP(n) WITH TIME
ZONE、ただし、n は precision
引数と同じになる(省略時は 6)
TIMESTAMP WITH TIME ZONE タイプのデ Timestamp
フォルト書式。
タイトル
使用上の注意
TEMPORAL_TIMESTAMP の値は、単一のトランザクション内で実行された要求す
べてに対して同じになります。
システムは 、セッションのタイムゾーンを使用して TEMPORAL_TIMESTAMP を評
価します。
CHECK 制約または DEFAULT 句に TEMPORAL_TIMESTAMP があると、結果値が評
価される時期は、この要求が CHECK 制約を適用したとき(挿入時または更新時)か、
この要求が特定の列の DEFAULT 値を使用したときになります。
SQL 関数、演算子、式および述部
323
第 7 章 組み込み関数
TIME
精度
TEMPORAL_TIMESTAMP の結果の秒精度は秒の 100 分の 1 に制限されます。
TEMPORAL_TIMESTAMP は、秒の小数点以下 2 桁の有効数字よりも右側の部分につ
いてはゼロを戻します。
関連トピック
詳細は、以下を参照してください。
• ANSI テンポラル テーブル サポート<一時テーブルのサポート 、B035-1182>。
• デフォルト書式の詳細については、< SQL データ型とリテラル、B035-1143>の
「データ タイプの書式および書式句」を参照してください。
TIME
目的
現在の時間を返します。
構文
TIME
AT
LOCAL
expression
TIME ZONE
time_zone_string
構文要素
AT LOCAL
DBS 制御フラグ TimeDateWZControl が有効な場合は、セッションの時間とセッショ
ンのタイムゾーンを基にして構築された値が返されます。
TimeDateWZControl が無効な場合は、Teradata Database サーバー ローカルの時間
値とセッションのタイムゾーンを基にして構成された値が返されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
324
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
TIME
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
使用上の注意
TIME は、要求が開始された時点での現在の時間を返します。要求が終了するまで
に、TIME が複数回呼び出された場合でも、同じ時間が返されます。返される時間
が、要求の継続中に変更されることはありません。
AT 句なしで TIME を指定した場合や、TIME AT LOCAL を指定した場合、返される
値は、DBS 制御フラグ TimeDateWZControl の設定に応じて、次に示すように変化
します。
• TimeDateWZControl フラグが有効な場合、TIME は、セッションの時間とセッ
ションのタイムゾーンを基にして構築された時間を返します。
• TimeDateWZControl フラグが無効な場合、TIME は、Teradata Database サー
バーのローカルな時間値と、セッションのタイムゾーンを基にして構築された時
間を返します。
TIME データは内部的に UTC で格納されます。UTC は TIME 結果値の並替えに影響
することがあります。
TIME は、夏時間(DST)の開始と終了を考慮に入れて調整された値を返します。ただ
し、この調整が実行されるのは、次の場合に限られます。
• TIME が AT [TIME ZONE] time_zone_string とともに指定されていて、
time_zone_string が、個別の DST と標準タイムゾーン変位に対応している。
• TIME が AT LOCAL とともに指定されているか、AT 句なしで指定されていて、
セッションのタイムゾーンが、個別の DST と標準のタイムゾーン変位に対応し
ているタイムゾーン文字列で定義されている。
TIME をユーザー定義メソッド呼出しの最初の引数として使用することはできません。
結果のタイプと属性
TIME のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
FLOAT
HHMMSS.CC (時間、分、秒、100 分の 1 秒)
Time
TIME と CURRENT_TIME
TIME の使用はお勧めしません。その代わりに、ANSI SQL:2011 準拠の
CURRENT_TIME 関数を使用してください。
SQL 関数、演算子、式および述部
325
第 7 章 組み込み関数
TIME
例
例 1: セッションの時間とタイムゾーンを基にした、現在の時間の要求
DBS 制御フラグ TimeDateWZControl が有効な場合、次に示す文は、現在のセッショ
ンの時間とタイムゾーンを基にした、現在の時間を要求します。
SELECT TIME;
SELECT TIME AT LOCAL;
結果は以下のようになります。
Time
-------16:20:20
セッションのタイムゾーンが、個別の DST と標準タイムゾーン変位に対応する、タ
イムゾーン文字列で定義されている場合は、夏時間の開始と終了を考慮に入れて自
動的に調整された時間が戻されます。それ以外の場合は、夏時間についての調整は
実行されません。
例 2: タイムゾーン文字列'America Pacific'に基づいて現在の時間を返す
次の問合わせは、タイムゾーン文字列'America Pacific'を基にしたタイムゾーン変位
での、現在の時間を返します。返される時間は、夏時間の開始と終了を考慮に入れ
て自動的に調整されます。
SELECT TIME AT TIME ZONE 'America Pacific';
SELECT TIME AT 'America Pacific';
例 3: 100 分の 1 秒の表示
100 分の 1 秒単位の部分は、デフォルト書式では表示されませんが、FORMAT 句を
使用すると表示できます。
SELECT TIME (FORMAT '99:99:99.99');
システム応答は 、以下のようになります。
Time
----------16:26:30.19
例 4: テーブルへの行の挿入
以下の例は、仮想上のテーブル(InsertTime 列のデータ タイプは FLOAT)に行を挿入
し、その行が挿入された時刻を記録します。
INSERT INTO HypoTable (ColumnA, ColumnB, InsertTime)
VALUES ('Abcde', 12345, TIME);
関連トピック
詳細は、以下を参照してください。
326
SQL 関数、演算子、式および述部
第 7 章 組み込み関数
USER
• 詳細は、<ユーティリティ 、B035-1102>の「DBS 制御(dbscontrol)」を参照して
ください。
• TIME データが内部的に UTC で格納される詳細については、< SQL データ操作言
語、B035-1146>の「ORDER BY 句」を参照してください。
• タイムゾーン文字列の詳細については、「AT LOCAL および AT TIME ZONE タイ
ムゾーン指定子」を参照してください。
• TIME と CURRENT_TIME の詳細については、「CURRENT_TIME」を参照してく
ださい。
USER
目的
セッションのユーザー名を戻します。
構文
USER
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
結果のタイプと属性
USER のデータ タイプ、書式、およびタイトルは次のとおりです。
データ タイプ
書式
タイトル
VARCHAR(30) CHARACTER SET UNICODE
X(30)
User
結果値
セッション ログ
オン
結果
非ディレクトリ
ベース
結果値は、セッションのユーザー名です。
ディレクトリ ベー セッションが永久テーブルにマップされる場合、結果値は永続ユーザー
ス
の名前になります。
セッションが永続ユーザーにマップされない場合、結果値は外部ユー
ザーの認証 ID になります。
SQL 関数、演算子、式および述部
327
第 7 章 組み込み関数
USER
プロキシ接続経由で Teradata Database にアクセスしている場合にプロキシ ユーザー
の現在の名前を取得するには、CURRENT_USER ビルトイン関数を使用します。
例
例: ユーザー名の識別
以下の文を使って、セッションのユーザー名を識別できます。
SELECT USER;
システム応答は 、以下のようになります。
User
-----------------------------JJ43901
例: ユーザーの肩書の選択
以下の例では、セッション ユーザーのジョブ タイトルを選択します。
SELECT JobTitle FROM Employee WHERE Name = USER;
関連トピック
詳細は、「CURRENT_USER」を参照してください。
328
SQL 関数、演算子、式および述部
第8章
ビジネス カレンダ
概要
この章では、システム定義のビジネス カレンダと、このカレンダの操作に使用でき
るマクロ、およびビジネス カレンダのテーブルとビューについて説明します。ま
た、システム定義のビジネス カレンダをサポートする埋め込みサービス システム
関数についても説明します。
ビジネス カレンダについて
ビジネス カレンダでは、営業日と休業日を定義します。営業日または休業日にする
日の意味はユーザーが決定します。たとえば、営業日を就業日にすることも、休業
日を非就業日、週末、祝祭日または長期休業日にすることもできます。システム定
義のカレンダに対して、さまざまな週のパターン(平日や週末)と、例外(祝祭日や開
休業日)を定義することができます。
セッションに設定できる Teradata システム定義のビジネス カレンダは 3 つあります。
• TERADATA
• ISO
• COMPATIBLE
これら 3 つのカレンダは、いずれも事実上の国際規格であるグレゴリオ暦に基づい
ています。グレゴリオ暦には、365 日の通常年と、366 日のうるう年があります。
これらのカレンダは、週の定義の方法や、部分的な週を認めるかどうかが異なりま
す。マクロを使用することで、平日/週末のパターンと、そのパターンに対する例外
を指定できます。
これらのカレンダは、1900 年 1 月 1 日から 2100 年 12 月 31 日までをサポートし
ます。デフォルトのセッション カレンダは、Teradata です。各カレンダは、すべて
日のが営業日になるようにデフォルト設定されています。このパターンは、マクロ
を使用することで変更できます。「ビジネス カレンダのマクロについて」を参照し
てください。
カレンダの相違点
カレンダ
第 1 週の起点
TERADATA
日曜日。
SQL 関数、演算子、式および述部
329
第 8 章 ビジネス カレンダ
計算
カレンダ
第 1 週の起点
その年の日曜より前の日は第 0 週に属します。
たとえば、その年の始まりが 2004 年 1 月 1 日(木曜日)だとする
と、1 月 1 日から 1 月 3 日までが第 0 週になります。第 1 週は、
1 月 4 日の日曜から始まります。
ISO
月曜日。
4 日間以上が含まれる最初の週が、その年の最初の週になります。
4 日間より少なくなる週は、前年の最後の週に属することになりま
す。部分的な週はありません。
このカレンダは、ISO 規格および欧州規格に準じています。たとえ
ば、その年の始まりが 2008 年 1 月 1 日(火曜日)だとすると、週は
月曜日から始まるため、2008 年の第 1 週は 20007 年 12 月 31 日
から 2008 年 1 月 6 日までになります。
COMPATIBLE
曜日に関係なく、1 月 1 日から始まります。
年の終わりに 1 日(通常年)または 2 日(うるう年)の部分的な週が存
在します。週の始まる曜日は、年ごとに変わります。
このカレンダは、Oracle との互換性があります。たとえば、2011
年 1 月 1 日は土曜日なので、その年の最初の週は 2011 年 1 月 1
日の土曜日から 2011 年 1 月 7 日の金曜日までになります。
計算
ISO 計算について
ISO カレンダで週、月、四半期および年を定義する方法は、Teradata カレンダや
COMPATIBLE カレンダとは異なります。ISO では、週は完全な(7 日間の)週に限られ
ます。すべてのビジネス カレンダ関数とビューは、ISO の計算に次のルールを使用
します。
週
ISO の週は常に 7 日あります。部分的な週はありません。ISO の週は常に月曜日から
始まり、日曜日で終わります。
年
各年には、52~53 の完全な週があります。年の開始と終了は、年境界の週に ISO の
木曜日ルールを適用することで判断します。グレゴリオ暦で木曜日が旧年側に入る
場合、その年境界の週は ISO カレンダでは旧年の一部に含まれます。グレゴリオ暦
で木曜日が新年側に入る場合、その年境界の週は ISO カレンダでは新年の一部に含
330
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
計算
まれます。たとえば、2009 年 12 月 31 日は木曜日です。そのため、ISO カレンダ
では、2009 年 12 月 28 日の月曜日から 2010 年 1 月 3 日の日曜日までが、2009
年の最後週になります。ISO カレンダでの 2010 年の最初の週は、2010 年 1 月 4
日の月曜日から始まります。それに対し、Teradata カレンダの 2010 年の最初の週
は 1 月 1 日の金曜日から始まります。
図 1 : 2009 年 12 月最終週 ISO
図 2 : 2010 年 1 月第 1 週 ISO
SQL 関数、演算子、式および述部
331
第 8 章 ビジネス カレンダ
計算
月
各月には、4~5 の完全な週があります。その月の開始と終了は、月境界の週に ISO
の木曜日ルールを適用することで判断します。例えば、ISO カレンダでは、2012 年
10 月は 10 月 28 日の日曜日が月の終わりになります。これは、月境界の週の木曜
日が 11 月 1 日にあたるためです。10 月 29 日の月曜日から始まる新しい週は、11
月の一部分になります。
図 3 : 2012 年 10 月最終週 ISO
図 4 : 2012 年 11 月第 1 週 ISO
四半期
ISO の年は 4 つの四半期に分割されます。各四半期には 13 の週があります。1 年が
53 週になる場合には、最後の四半期は 14 週になります。四半期は、4、4、5 週ま
332
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
計算
たは 4、5、4 週あるいは 5、4、4 週のパターンで 3 ヶ月に分割されます。1 年が
53 週の場合、最後の四半期は 4、5、5 週または 5、4、5 週または 5、5、4 週のパ
ターンの 3 ヶ月になります。四半期の開始または終了は、その四半期の最後の月に
あたる月境界の週に ISO の木曜日ルールを適用することで決定されます。月境界の
週は、その週の木曜日を含む月に属します。例えば、2016 年 1 月 1 日の金曜日は、
木曜日が含まれる 2015 年の最終四半期の最終週の一部になります。そのため、
2016 年 1 月 1 日の金曜日は、ISO カレンダでは 2015 年の最後の四半期に属する
ことになり、Teradata カレンダでは 2016 年の最初の四半期に属することになりま
す。
図 5 : 2015 年 12 月最終四半期週 ISO
SQL 関数、演算子、式および述部
333
第 8 章 ビジネス カレンダ
ビジネス カレンダのマクロについて
図 6 : 2016 年 1 月第 1 四半期週 ISO
ビジネス カレンダのマクロについて
システム ビジネス マクロを使用すると、管理者およびユーザーは次の処理を実行し
てシステム ビジネス カレンダ(Teradata、ISO、および COMPATIBLE)を構成できます。
• カレンダのパターンを作成します。
• カレンダの例外を作成します。
• カレンダから既存の例外を削除します。
これらのマクロは DIP スクリプトを実行すると作成され、DBC データベースに保持
されます。
注: マクロを表示するには、DIP スクリプトを使用します。
マクロ名
目的
CreateBusinessCalendarPattern ビジネス カレンダのパターンを作成します。
334
CreateException
特定のビジネス カレンダの例外リストを定義します。この
リストでは、カレンダの日のうち、カレンダに対して定義
されているパターンの例外となる日をすべて特定します。
DeleteException
特定のビジネス カレンダから特定の例外を削除します。
DeleteAllExceptions
特定のビジネス カレンダから例外をすべて削除します。
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダのマクロについて
CreateBusinessCalendarPattern
このマクロを使用すると、ビジネス カレンダのパターンを作成できます。パターン
は、カレンダ全体およびカレンダが基づく基本構造単位(たとえば、週、月、四半
期、年)を対象とした営業日および休業日のテンプレートです。
注: 現時点では、週単位のパターンのみがサポートされています。各曜日を営業日ま
たは休業日と定義できます。特定の営業日を休業日(例えば祝日)にするには、
CreateException マクロを使用できます(「CreateException」を参照)。
このマクロを実行すると、カレンダのパターンが作成され、パターンに関する情報
が DBC.BusinessCalendarPattern テーブルに格納されます。
CreateBusinessCalendarPattern、必須パラメータ
パラメータ
データ タイプ
書式
説明
CalendarName
VARCHAR(256)
CHARACTER SET
UNICODE
X(128)
ビジネス カレンダの名前。シス
テム ビジネス カレンダの場合
は、Teradata、ISO、または
COMPATIBLE である必要があり
ます。
NOT CASESPECIFIC
NOT NULL
DayName
CHAR(10)
X(10)
カレンダ曜日の名前。SUNDAY、
MONDAY、TUESDAY、
WEDNESDAY、THURSDAY、
FRIDAY、SATURDAY のいずれか
である必要があります。
Pattern
CHAR(5)
X(5)
カレンダ曜日のパターン。ON (営
業日)または OFF (休業日)である
必要があります。
PatternComment
VARCHAR(2048)
X(1024)
カレンダ曜日のパターン(ON また
は OFF)の理由または根拠。
例: 休業日の設定
次の例では、Teradata ビジネス カレンダの各週の土曜日と日曜日を休業日と定義し
(休業日はステータスが OFF となります)、この情報を DBC.BusinessCalendarPattern
テーブルに追加しています。
注: デフォルトでは、Teradata ビジネス カレンダの週の各日が営業日となっています。
EXEC DBC.CreateBusinessCalendarPattern
('TERADATA', ‘SATURDAY’,’OFF’, ‘Non-work Day’);
EXEC DBC.CreateBusinessCalendarPattern
('TERADATA', ‘SUNDAY’,’OFF’, ‘Non-work Day’);
SQL 関数、演算子、式および述部
335
第 8 章 ビジネス カレンダ
ビジネス カレンダのマクロについて
例: 営業日の指定
次の例では、SUNDAY および MONDAY を営業日に指定して、ISO ビジネス カレン
ダを変更します。
EXEC DBC.CreateBusinessCalendarPattern
('ISO', 'SUNDAY','ON', 'Work Day');
EXEC DBC.CreateBusinessCalendarPattern
('ISO', 'MONDAY', 'ON', 'Work Day');
CreateException
このマクロを使用すると、特定のビジネス カレンダの例外リストを定義できます。
このリストでは、カレンダの日のうち、カレンダに対して定義されているパターン
の例外となる日(日付順)をすべて特定します。
このマクロを実行すると、リストの例外がカレンダおよび
DBC.BusinessCalendarException テーブルに挿入されます。
すでに例外となっている特定の日付に対して例外を定義しようとすると 、エラーが
返されます。既存の例外を置き換えるには、まず既存の例外を削除し、その後、目
的の日付について新しい例外を再定義する必要があります。
CreateException、必須パラメータ
パラメータ
書式
データ タイプ
説明
CalendarName
VARCHAR(256)
CHARACTER SET
UNICODE
X(128)
ビジネス カレンダの名前。シス
テム ビジネス カレンダの場合
は、Teradata、ISO、または
COMPATIBLE である必要があ
ります。
NOT CASESPECIFIC
NOT NULL
ExceptionIndicator
CHAR(5)
X(5)
例外の日のタイプ。ON (営業
日)または OFF (休業日)である必
要があります。
ExceptionDate
DATE
YYYY-MM-DD
例外の日付(その例外がすでに作
成されている日以外)。
PatternComment
VARCHAR(2048)
X(1024)
カレンダ曜日のパターン(ON ま
たは OFF)の理由または根拠。
CreateException、使用上の注意
CalendarPeriod 境界を超える例外を挿入しようとすると、挿入がアボートします。
例外としてすでに定義されている日に対して例外を挿入する場合は 、その日につい
ての既存の例外を削除した後、新しい例外に置き換える必要があります。
336
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダのマクロについて
例: OFF および ON 例外の定義
この例では、Teradata ビジネス カレンダに OFF と ON の例外を定義し、それらの
情報を DBC.BusinessCalendarException テーブルに追加しています。OFF ステータ
スの日は休業日です。ON ステータスの日は営業日です。
EXEC DBC.CreateException
('Teradata', ’OFF’, DATE '2008-03-03', 'Holiday');
EXEC DBC.CreateException
('Teradata', ’ON’, DATE '2008-06-07', 'Holiday make up day');
例外が 2 つ、Teradata ビジネス カレンダに挿入されます。最初の例外は、2008 年
3 月 3 日が休業日になったことを示しています(コメントに祝祭日であると注記され
ています)。2 つ目の例外は、2008 年 6 月 7 日が営業日になったことを示していま
す(前回の祝祭日を設けるための日であるとコメントに注記されています)。
Teradata カレンダの CalendarPeriod は、1900 年 1 月 1 日から 2100 年 12 月 31
日までです。CalendarPeriod 境界を超えた祝日を挿入しようとすると、挿入がア
ボートします。
DeleteException
このマクロを使用すると、特定のビジネス カレンダから特定の例外を削除できま
す。例外を削除すると、その例外日のステータスが、カレンダのパターンでその日
に対して定義されているステータスに自動的に戻ります。
このマクロを実行すると、例外がカレンダおよび DBC.BusinessCalendarException
テーブルから削除されます。
カレンダから例外をすべて削除する必要がある場合は、DeleteAllExceptions マクロ
を使用します(「DeleteAllExceptions」を参照)。
DeleteException、必須パラメータ
パラメータ
データ タイプ
書式
説明
CalendarName
VARCHAR(256)
CHARACTER SET
UNICODE
X(128)
ビジネス カレンダの名前。システ
ム ビジネス カレンダの場合は、
Teradata、ISO、または
COMPATIBLE である必要がありま
す。
YY/MM/DD
例外の日付(その例外がすでに作成
されている日以外)。
NOT CASESPECIFIC
NOT NULL
ExceptionDate
SQL 関数、演算子、式および述部
DATE
337
第 8 章 ビジネス カレンダ
ビジネス カレンダのテーブルについて
例: 例外の削除。
この例では、2009 年 1 月 1 日の日付に対する例外を ISO ビジネス カレンダおよび
DBC.BusinessCalendarException テーブルから削除しています。
EXEC DBC.DeleteException('ISO', DATE '2009-01-01');
DeleteAllExceptions
このマクロを使用すると、特定のビジネス カレンダからすべての例外を削除できま
す。すべての例外を削除すると、すべての例外日のステータスが、カレンダのパター
ンのそれぞれの日に対して定義されているステータスに自動的に戻ります。
このマクロを実行すると、すべての例外がカレンダおよび
DBC.BusinessCalendarException テーブルから削除されます。
カレンダから特定の例外を削除する必要がある場合は、DeleteException マクロを使
用します(「DeleteException」を参照)。
DeleteAllExceptions、必須パラメータ
パラメータ
データ タイプ
CalendarName VARCHAR(128)
CHARACTER SET
UNICODE
書式
説明
X(128)
ビジネス カレンダの名前。システム
ビジネス カレンダの場合は、
Teradata、ISO、または
COMPATIBLE である必要があります。
NOT CASESPECIFIC
NOT NULL
例: ISO ビジネス カレンダからの例外の削除
この例では、すべての例外を ISO ビジネス カレンダおよび
DBC.BusinessCalendarException テーブルから削除しています。
EXEC DBC.DeleteAllExceptions('ISO');
ビジネス カレンダのテーブルについて
ビジネス カレンダのテーブルを問合わせると、ビジネス関連のカレンダ情報を確認
できます。
DBC.BusinessCalendarPattern テーブル
この表には、営業日と休業日のパターンに関するカレンダ情報を記録します。
338
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダのテーブルについて
列名
列の説明
CalendarName
ビジネス カレンダの名前。
PatternType
週単位、月単位、四半期単位、または年単位としてパターン
を特定します。現時点では、週単位のパターンのみがサポー
トされています。パターン"W"は、週単位のパターンを意味
します。
DayNumber
週の中の日には 1~7 の番号が付けられており、開始は日曜
日(1)、終了は土曜日(7)です。この表には、日付ごとに行が
1 行あり、Pattern 列には日付の ON/OFF ステータスが格納
されます。
Pattern
週単位のパターンでは、1 または 0 に設定された 7 つの行を
記述します。DayNumber ごとに、営業日(1)または休業日(0)
のどちらかを示すステータスをこの列に格納します。
PatternComment
パターンの説明。
CreatorName
パターンを作成または変更したユーザーの名前。システム定
義のビジネス カレンダの場合、これは DBC になります。
LastModified
最後にパターンを変更したときのタイムスタンプ。
DBC.BusinessCalendarException テーブル
この表には、営業日と休業日のパターンの例外となる日付のリストが含まれています。
列名
列の説明
CalendarName
例外が表示されるビジネス カレンダの名前。
ExceptionIndicator
値 0 は ExceptionDate が休業日であることを示し、値 1 は
ExceptionDate が営業日であることを示します。
ExceptionDate
ExceptionDate は Teradata カレンダの範囲内(1900 年 1 月
1 日~2100 年 12 月 31 日)に含まれる必要があります。こ
の期間から外れた場合、ExceptionDate は受け入れられませ
ん。
ExceptionReason
例外の理由。例えば、2012 年 12 月 25 日(火曜日)は通常で
は営業日ですが、クリスマス休暇でもあります。このため、
ExceptionReason は「Christmas」になります。
ExceptionReason は NULL でもかまいません。
CreatorName
例外を作成したユーザーの名前。
CreationTime
例外を作成したときのタイムスタンプ。
例外には 2 つのタイプがあります。
SQL 関数、演算子、式および述部
339
第 8 章 ビジネス カレンダ
ビジネス カレンダのビューについて
• OFF 例外: 典型的な営業日が休日になる(たとえば、2011 年 9 月 5 日月曜日は
Labor Day で休日)。
• ON 例外: 典型的な休日が営業日になる(たとえば、事業所の職員全員が 2011 年 7
月 30 日土曜日に業務に就くことを求められる)。
OFF 例外が営業日にあたるかどうかや、ON 例外が休業日にあたるかどうかを確認す
る必要はありません。例外を設定して、ExceptionReason を指定するだけでかまい
ません。たとえば、7 月 4 日の月曜日は祝祭日ですが、Barbeque Bonanza ストアは
営業日であり、ExceptionReason は独立記念日セールになります。
ビジネス カレンダのビューについて
ビジネス カレンダのビューを問合わせることで、ビジネスに関連する情報(週の最初
の営業日など)を取得できます。
Sys_Calendar.BusinessCalendarExceptions
このビューからは、カレンダに定義した例外(普段は営業日にあたる月曜日の祝祭日
など)についての情報が得られます。このビューを問合わせると、例外を確認できま
す。
ビューの列名
説明
データ タイプ
書式
CalendarName
カレンダの名前。
VARCHAR(128)
X(128)
ExceptionIndicator 営業日には ON、休業日には OFF を返し VARCHAR(3)
ます。
X(3)
ExceptionDate
カレンダに設定された例外日。
DATE
YY/MM/DD
ExceptionReason
例外の理由。
VARCHAR(1024)
X(1024)
CreatorName
例外を作成したユーザー。
VARCHAR(128)
X(128)
CreationTime
例外を作成したときのタイムスタンプ。 TIMESTAMP(0)
YYYY-MM-DDBHH:MI:SS
Sys_Calendar.BusinessCalendarPatterns
このビューからは、カレンダに定義したパターン(平日/週末のパターンなど)につい
ての情報が得られます。
ビューの列名
説明
データ タイプ
書式
CalendarName
カレンダの名前。
VARCHAR(128)
X(128)
DayName
曜日名。たとえば金曜日。
VARCHAR(9)
X(9)
Pattern
ON または OFF パターンの設定。
VARCHAR(3)
X(3)
340
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダのビューについて
ビューの列名
説明
データ タイプ
書式
PatternComment
パターンの各日のコメント。
VARCHAR(1024)
X(1024)
CreatorName
パターンを作成したユーザー。
VARCHAR(128)
X(128)
LastModified
最後にパターンを変更したときのタイム TIMESTAMP(0)
スタンプ。
YYYY-MM-DD:HH:MI:SS
Sys_Calendar.BusinessCalendar
この Sys_Calendar ビューは、システム定義された 3 つのビジネス カレンダにビジ
ネス機能を提供します。
ビューの列名
説明
データ タイプ
書式
Calendar_Date
日付。
DATE
YY/MM/DD
Day_of_Week
INTEGER 値。範囲は 1~7。
INTEGER
-(10)9
Day_of_Month
整数値。範囲は 1~31。
INTEGER
-(10)9
Day_of_Year
INTEGER 値。範囲は 1~366。
INTEGER
-(10)9
Day_of_Calendar
カレンダの初日からの日数。
INTEGER
-(10)9
Weekday_of_Month
その月の、n 番目の平日が現れる位置
(1-5)。
INTEGER
-(10)9
Week_of_Month
その月の週の番号。範囲は 0~5。
INTEGER
-(10)9
Week_of_Quarter
四半期の週の番号。範囲は 0~14。
INTEGER
-(10)9
Week_of_Year
その年の週の番号。範囲は 0~53。
INTEGER
-(10)9
Week_of_Calendar
カレンダ内の、特定の日付が現れる週の INTEGER
番号。
-(10)9
Month_of_Quarter
その四半期の、特定の日付が現れる月の INTEGER
番号。
-(10)9
Month_of_Year
その年の、特定の日付が現れる月の番号。 INTEGER
-(10)9
Month_of_Calendar
カレンダ内の、特定の日付が現れる月の INTEGER
番号。
-(10)9
Quarter_of_Year
特定の日付が現れる、年の四半期。
INTEGER
-(10)9
Quarter_of_Calendar
特定の日付が現れる、カレンダの四半期 INTEGER
の番号。
-(10)9
Year_of_Calendar
特定の日付が現れる、カレンダの年の番 INTEGER
号。
-(10)9
SQL 関数、演算子、式および述部
341
第 8 章 ビジネス カレンダ
ビジネス カレンダのビューについて
ビューの列名
説明
データ タイプ
書式
WeekEnd
特定の日付のある週の終わり。
DATE
YY/MM/DD
WeekBegin
特定の日付のある週の初め。
DATE
YY/MM/DD
MonthBegin
特定の日付のある月の初め。
DATE
YY/MM/DD
MonthEnd
特定の日付のある月の終わり。
DATE
YY/MM/DD
QuarterBegin
特定の日付のある四半期の初め。
DATE
YY/MM/DD
QuarterEnd
特定の日付のある四半期の終わり。
DATE
YY/MM/DD
YearBegin
特定の日付のある年の初め。
DATE
YY/MM/DD
YearEnd
特定の日付のある年の終わり。
DATE
YY/MM/DD
IsBusinessDay
特定の日付が営業日であるかどうか。
BYNET
-(3)9
BusinessWeekBegin
特定の日付が現れる週の最初の営業日。 DATE
YY/MM/DD
BusinessWeekEnd
特定の日付が現れる週の最後の営業日。 DATE
YY/MM/DD
BusinessMonthBegin
特定の日付が現れる月の最初の営業日。 DATE
YY/MM/DD
BusinessMonthEnd
特定の日付が現れる月の最後の営業日。 DATE
YY/MM/DD
BusinessQuarterBegin
特定の日付が現れる四半期の最初の営業 DATE
日。
YY/MM/DD
BusinessQuarterEnd
特定の日付が現れる四半期の最後の営業 DATE
日。
YY/MM/DD
BusinessYearBegin
特定の日付が現れる年の最初の営業日。 DATE
YY/MM/DD
BusinessYearEnd
特定の日付が現れる年の最後の営業日。 DATE
YY/MM/DD
例: ISO カレンダを使用した曜日の問合わせ
次の問合わせは、ISO カレンダを使用して曜日を返します。
Set session calendar = iso;
Sel day_of_week from Sys_Calendar.Calendar where calendar_date = date
'2011-01-01';
day_of_week
----------6
例
例: ISO カレンダを使用した曜日の問合わせ
次の問合わせは、ISO カレンダを使用して曜日を返します。
342
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダのビューについて
Set session calendar = iso;
Sel day_of_week from Sys_Calendar.Calendar where calendar_date = date
'2011-01-01';
day_of_week
----------6
例: COMPATIBLE カレンダを使用した曜日の問合わせ
次の問合わせは、COMPATIBLE カレンダを使用して曜日を返します。
Set session calendar = compatible;
Sel day_of_week from Sys_Calendar.Calendar where calendar_date = date
'2011-01-01';
day_of_week
----------1
例: ISO カレンダを使用した週初めの問合わせ
次の問合わせは、ISO カレンダを使用して週初めを返します。
Set session calendar = iso;
Sel weekBegin from Sys_Calendar.BusinessCalendar where calendar_date =
date '2011-01-01';
WeekBegin
----------10/12/27
例: COMPATIBLE カレンダを使用した週初めの問合わせ
次の問合わせは、COMPATIBLE カレンダを使用して週初めを返します。
Set session calendar = compatible;
Sel weekBegin from Sys_Calendar.BusinessCalendar where calendar_date =
date '2011-01-01';
WeekBegin
----------11/01/01
例: OFF 例外日の追加
デフォルトでは、ISO カレンダの月曜日は営業日です。次の問合わせでは、2007 年
1 月 1 日月曜日に OFF 例外を追加します。
Exec DBC.CreateException('ISO', 'OFF', date '2007-01-01',
Day');
'Newyear
次の問合わせでは、2007 年 1 月 1 日の後の、次の営業日を返します。
SQL 関数、演算子、式および述部
343
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
Sel BusinessWeekBegin from Sys_Calendar.BusinessCalendar where
calendar_date = date '2007-01-01';
BusinessWeekBegin
----------07/01/02
例: 週初めおよび週番号の問合わせ
次の問合わせは、2009 年の週初めと週番号を返します。このとき、セッションに設
定されているカレンダがないと仮定します。このセッションでは、デフォルトのビ
ジネス カレンダである“Teradata”が使用されます。
SEL WeekBegin, week_of_year FROM Sys_Calendar.BusinessCalendar WHERE
calendar_date = DATE '2009-03-15';
Week_begin
week_of_year
----------------------------09/03/15
11
ビジネス カレンダ関数
ビジネス カレンダ関数について
SQL 文内で UDF を指定できる部分(INSERT 文、UPDATE 文、DELETE 文、MERGE
文、SELECT 文など)にはビジネス カレンダ関数を指定できます。
ビジネス カレンダ関数には、次の事項が適用されます。
• カレンダ名を指定していないと、そのカレンダのデフォルトはセッションのカレ
ンダになります。
• 年に関連するすべての関数(MonthNumber_Of_Year など)は、その年の 1 月 1 日
から相対的に計算されます。
• カレンダに関連するすべての関数(DayNumber_Of_Calendar など)は、カレンダの
始まる 1900-01-01 から相対的に計算されます。
• これらの関数は、DML 文内、および DDL 文内の CHECK CONSTRAINTS 内のどこ
にでも指定できます。それ以外にも、SQL 文内で UDF を指定できるすべての場所
でも、これらの関数を指定できます。
• ビジネス カレンダ関数のすべての定義は、TD_SYSFNLIB データベースに格納さ
れています。SELECT 文で使用するビジネス カレンダ関数の書式とタイトルは、
通常の UDF スタイルに準じます。
• これらの関数は、すべての Teradata ユーザーが使用可能なものであり、権限は必
要ありません。
• 関数内部では、すべての計算が UTC で行なわれます(入力のタイプが、TIMESTAMP
または TIMESTAMP WITH TIME ZONE の場合)。
344
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
ビジネス カレンダ関数を使用するための前提条件
これらの関数を使用する前に、データベース初期化プログラム(DIP)ユーティリティ
を実行し、DIPSYSFNC スクリプトを実行する必要があります。DIPALL または
DIPSYSFNC スクリプトにより、カレンダ関数が SYSLIB データベース内に作成され
ます。DIP ユーティリティの詳細は、<ユーティリティ、B035-1102>を参照してく
ださい。
ビジネス カレンダ関数と同じ名前の、ユーザーが開発した UDF を持っている場合
は、ビジネス カレンダ関数を呼び出す前に、ユーザーが開発した UDF を通常の UDF
検索パスから削除する必要があります。現在のデータベースでビジネス カレンダ関
数を見つけられない場合、Teradata Database は TD_SYSFNLIB データベースで関数
を検索します。この代わりに、完全修飾した構文
(TD_SYSFNLIB.calendar_function_name)を使用して、カレンダ関数を呼び出すこと
もできます。
例: 全四半期の第 1 週の累積売上げ
この例では、全四半期の第 1 週の品目の累積売上げを検索します。カレンダ設定ご
とに結果を表示します。
SEL Item_Code, SUM(Sale_Amt) FROM Sales_Tbl
WHERE WeekNumber_Of_Quarter(Sale_Date) = 1
GROUP BY Item_Code;
SET SESSION calendar = Teradata;
Item_Code
SUM(Sale_Amt
)
101
225
102
120
SET SESSION calendar = Compatible
Item_Code
SUM(Sale_Amt
)
101
245
102
100
SET SESSION calendar = ISO;
Item_Code
SUM(Sale_Amt
)
101
135
102
30
Sales_Tbl
SQL 関数、演算子、式および述部
345
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
Item_Cod Sale_Am Sale_Date
e
t
101
10
2008-12-30
101
15
2008-12-31
101
20
2009-01-01
101
25
2009-01-02
101
30
2009-01-03
101
35
2009-01-04
101
40
2009-01-05
101
45
2009-01-06
101
50
2009-01-07
101
55
2009-01-08
102
10
2009-01-01
102
20
2009-01-03
102
30
2009-01-05
102
40
2009-01-07
102
50
2009-01-09
Jan 2009 Calendar
S
M T
W T
F
S
1
2
3
8
9
1
0
4
5
6
7
1
1
1
2
13 1
4
15 1
6
1
7
1
8
1
9
20 2
1
22 2
3
2
4
2
5
2
6
27 2
8
29 3
0
3
1
例
例: 全四半期の第 1 週の累積売上げ - Teradata カレンダ
この例では、Teradata カレンダを使用して、全四半期の第 1 週の累積売上げをどの
ように集計するかを示します。
SET SESSION calendar = Teradata;
SEL Item_Code, SUM(Sale_Amt) FROM Sales_Tbl
346
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
WHERE WeekNumber_Of_Quarter(Sale_Date) = 1
GROUP BY Item_Code;
SET SESSION calendar = Teradata;
Item_Code
SUM(Sale_Amt
)
101
225
102
120
Sales_Tbl
Item_Code Sale_Amt
Sale_Date
101
10
2008-12-3
0
101
15
2008-12-3
1
101
20
2009-01-0
1
101
25
2009-01-0
2
101
30
2009-01-0
3
101
35
2009-01-0
4
101
40
2009-01-0
5
101
45
2009-01-0
6
101
50
2009-01-0
7
101
55
2009-01-0
8
102
10
2009-01-0
1
102
20
2009-01-0
3
SQL 関数、演算子、式および述部
347
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
102
30
2009-01-0
5
102
40
2009-01-0
7
102
50
2009-01-0
9
Jan 2009 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
例: 全四半期の第 1 週の累積売上げ - ISO カレンダ
この例では、ISO カレンダを使用して、全四半期の第 1 週の累積売上げをどのよう
に集計するかを示します。
SET SESSION calendar = ISO;
SEL Item_Code, SUM(Sale_Amt) FROM Sales_Tbl
WHERE WeekNumber_Of_Quarter(Sale_Date) = 1
GROUP BY Item_Code;
SET SESSION calendar = ISO;
Item_Code
SUM(Sale_Amt
)
101
135
102
30
Sales_Tbl
348
Item_Code
Sale_Amt
Sale_Date
101
10
2008-12-30
101
15
2008-12-31
101
20
2009-01-01
101
25
2009-01-02
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
101
30
2009-01-03
101
35
2009-01-04
101
40
2009-01-05
101
45
2009-01-06
101
50
2009-01-07
101
55
2009-01-08
102
10
2009-01-01
102
20
2009-01-03
102
30
2009-01-05
102
40
2009-01-07
102
50
2009-01-09
Jan 2009 Calendar
S
4
M
5
T
6
W
7
T
F
S
1
2
3
8
9
10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
例: 全四半期の第 1 週の累積売上げ - COMPATIBLE カレンダ
この例では、COMPATIBLE カレンダを使用して、全四半期の第 1 週の累積売上げを
どのように集計するかを示します。
SET SESSION calendar = Compatible;
SEL Item_Code, SUM(Sale_Amt) FROM Sales_Tbl
WHERE WeekNumber_Of_Quarter(Sale_Date) = 1
GROUP BY Item_Code;
SET SESSION calendar = Compatible;
Item_Code
SUM(Sale_Amt
)
101
245
102
100
SQL 関数、演算子、式および述部
349
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
Sales_Tbl
Item_Co Sale_Am Sale_Date
de
t
101
10
2008-1230
101
15
2008-1231
101
20
2009-0101
101
25
2009-0102
101
30
2009-0103
101
35
2009-0104
101
40
2009-0105
101
45
2009-0106
101
50
2009-0107
101
55
2009-0108
102
10
2009-0101
102
20
2009-0103
102
30
2009-0105
102
40
2009-0107
102
50
2009-0109
Jan 2009 Calendar
S
350
M
T
W
T
F
S
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
4
5
6
7
1
2
3
8
9
10
11 12 13
14 15
16 17
18 19 20
21 22
23 24
25 26 27
28 29
30 31
例: 全四半期の第 1 週の平日累積売上げ - Teradata カレンダ
この例では、全四半期の第 1 週の平日における品目の累積売上げを検索します。
SET SESSION calendar = Teradata;
/* Setting SUNDAY and SATURDAY as weekend days. */
exec dbc.createbusinesscalendarpattern('teradata','SUNDAY','OFF',);
exec dbc.createbusinesscalendarpattern('teradata','SATURDAY','OFF',);
SEL Item_Code, SUM(Sale_Amt) FROM Sales_Tbl,
Sys_Calendar.BusinessCalendar
WHERE WeekNumber_Of_Quarter(Sale_Date) = 1
AND calendar_date = Sale_Date
AND IsBusinessDay = 1
GROUP BY Item_Code
ORDER BY 1;
SET SESSION calendar = Teradata;
Item_Code
SUM(Sale_Amt)
101
190
102
120
Sales_Tbl
Item_Cod Sale_Amt
e
Sale_Date
101
10
2008-12-3
0
101
15
2008-12-3
1
101
20
2009-01-0
1
101
25
2009-01-0
2
SQL 関数、演算子、式および述部
351
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
101
30
2009-01-0
3
101
35
2009-01-0
4
101
40
2009-01-0
5
101
45
2009-01-0
6
101
50
2009-01-0
7
101
55
2009-01-0
8
102
10
2009-01-0
1
102
20
2009-01-0
3
102
30
2009-01-0
5
102
40
2009-01-0
7
102
50
2009-01-0
9
Jan 2009 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
例: 2011 年 9 月の第 1 週の表示
この例では、ビジネス カレンダ設定ごとに 2011 年 9 月の第 1 週を表示します。
SEL calendar_date, week_of_month FROM Sys_Calendar.BusinessCalendar
WHERE week_of_month = 1
AND month_of_year = 9
352
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
AND year_of_calendar = 2011
ORDER BY 1;
SET SESSION calendar = ISO;
Sep-2011 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
calendar_date
------------11/08/29
11/08/30
11/08/31
11/09/01
11/09/02
11/09/03
week_of_month
------------1
1
1
1
1
1
11/09/04 1
SET SESSION calendar = Teradata;
Sep-2011 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
calendar_date
------------11/09/04
11/09/05
11/09/06
11/09/07
11/09/08
11/09/09
SQL 関数、演算子、式および述部
week_of_month
------------1
1
1
1
1
1
353
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
11/09/10
1
SET SESSION calendar = Compatible;
Sep-2011 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
calendar_date
------------11/09/01
11/09/02
11/09/03
11/09/04
11/09/05
11/09/06
11/09/07
week_of_month
------------1
1
1
1
1
1
1
例: 月の毎週初めの在庫ステータス
次の例では、ビジネス カレンダ設定ごとに 2011 年 9 月の毎週初めの在庫ステータ
スを表示します。
SEL Item, BEGIN(week_duration) AS WeekBegin, Inventory
FROM Inventory_Tbl
EXPAND ON Duration AS week_duration
BY ANCHOR WEEK_BEGIN;
Inventory_Tbl
354
Item
Duration
Inventor
y
101
2011-09-01,
2011-09-05
12
101
2011-09-05,
2011-09-12
18
101
2011-09-12,
2011-09-18
15
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
101
2011-09-18,
2011-09-21
11
Sep-2011 Calendar
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SET SESSION CALENDAR = Teradata;
Item
WeekBegin
Inventory
101
2011-09-04
12
101
2011-09-11
18
101
2011-09-18
11
SET SESSION CALENDAR = ISO;
Item
WeekBegin
Inventory
101
2011-09-05
18
101
2011-09-12
15
101
2011-09-19
11
SET SESSION CALENDAR = Compatible;
Item
WeekBegin
Inventory
101
2011-09-03
12
101
2011-09-10
18
101
2011-09-17
15
例: 2004 年の各四半期の週数
次の例では、2004 年の各四半期の週の数を表示します。
SEL quarter_of_year, MAX(week_of_quarter)
FROM Sys_Calendar.BusinessCalendar
WHERE year_of_calendar=2004
GROUP BY 1 ORDER BY 1;
SQL 関数、演算子、式および述部
355
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
SET SESSION CALENDAR = Teradata;
Quarter_of_Y Maximum(Week_of_Qu
ear
arter)
1
13
2
13
3
13
4
13
SET SESSION CALENDAR = ISO;
Quarter_of_Ye Maximum(Week_of_Qua
ar
rter)
1
13
2
13
3
13
4
14
SET SESSION CALENDAR =
COMPATIBLE;
Quarter_of_Y Maximum(Week_of_Qu
ear
arter)
1
13
2
13
3
14
4
14
例: 四半期別の売上げ
次の例では、ビジネス カレンダ設定ごとに四半期別の売上げをどのように計算する
かを示します。
SEL QuarterNumber_Of_Year(Sale_Date) Quarter_No,
Item_Code, SUM(Sale_Amt) FROM Sales_Tbl
GROUP BY 1,2
ORDER BY 1,2;
SET SESSION calendar = ISO;
Quarter_No Item_Code SUM(Sale_Amt
)
356
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
ビジネス カレンダ関数
1
101
325
1
102
150
SET SESSION calendar = Teradata;
Quarter_No Item_Code SUM(Sale_Amt)
1
101
300
1
102
150
4
101
25
SET SESSION calendar = COMPATIBLE;
Quarter_No Item_Code SUM(Sale_Amt
)
1
101
300
1
102
150
4
101
25
Sales_Tbl
Item_Co
de
Sale_Am Sale_Date
t
101
10
2008-12-3
0
101
15
2008-12-3
1
101
20
2009-01-0
1
101
25
2009-01-0
2
101
30
2009-01-0
3
101
35
2009-01-0
4
101
40
2009-01-0
5
SQL 関数、演算子、式および述部
357
第 8 章 ビジネス カレンダ
td_week_begin
101
45
2009-01-0
6
101
50
2009-01-0
7
101
55
2009-01-0
8
102
10
2009-01-0
1
102
20
2009-01-0
3
102
30
2009-01-0
5
102
40
2009-01-0
7
102
50
2009-01-0
9
Jan 2009 Calendar
S
M
T
W
T
F
S
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
td_week_begin
目的
expression_1.に指定されている DATE または TIMESTAMP の直前にあたる週初めを
返します。
構文
td_week_begin
TD_SYSFNLIB.
358
( expression_1
)
,
calendar_name
NULL
,
expression_2
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_week_begin
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
SQL 関数、演算子、式および述部
359
第 8 章 ビジネス カレンダ
td_week_end
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の週の問合わせ
次の SQL 文を実行します。
SELECT TD_WEEK_BEGIN(TIMESTAMP'2012-01-15
12:00:00+02:00','ISO',TIME'05:00:00');
2012-01-09 07:00:00+02:00 を返します。
td_week_end
目的
expression_1 に指定されている DATE または TIMESTAMP の直後にあたる週末を返
します。
構文
td_week_end
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
360
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_week_end
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の後の週末の問合わせ
次の SQL 文を実行します。
SELECT TD_WEEK_END(timestamp'2012-05-08 10:00:00');
2012-05-12 23:59:59 を返します。
カレンダを指定していないため、セッション カレンダ、つまりこの例では TERADATA
が使用されることになります。
SQL 関数、演算子、式および述部
361
第 8 章 ビジネス カレンダ
td_sunday
td_sunday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる日曜日を
返します。
構文
td_sunday
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数 expression は、次に示すデータ型で定義されます。
362
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_monday
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の日曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_SUNDAY(timestamp'2012-05-08 10:00:00');
2012-05-06 00:00:00 を返します。
カレンダを指定していないため、セッション カレンダ、つまりこの場合は TERADATA
が使用されることになります。
td_monday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる月曜日を
返します。
構文
td_monday
TD_SYSFNLIB.
SQL 関数、演算子、式および述部
( expression_1
)
,
calendar_name
NULL
,
expression_2
363
第 8 章 ビジネス カレンダ
td_monday
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
364
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_tuesday
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の月曜日の問合わせ
次の SQL 文を実行します。
TD_MONDAY(Date,'TERADATA');
12/05/07 を返します。
td_tuesday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる火曜日を
返します。
構文
td_tuesday
TD_SYSFNLIB.
( expression_1
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
SQL 関数、演算子、式および述部
365
第 8 章 ビジネス カレンダ
td_tuesday
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の火曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_TUESDAY(TIMESTAMP'2012-05-08 10:00:00');
2012-05-08 00:00:00 を返します。
カレンダを指定していないため、セッション カレンダ、つまりこの場合は TERADATA
が使用されることになります。
366
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_wednesday
td_wednesday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる水曜日を
返します。
構文
td_wednesday
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
SQL 関数、演算子、式および述部
367
第 8 章 ビジネス カレンダ
td_thursday
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の水曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_WEDNESDAY(TIMESTAMP'2012-05-08 10:00:00+01:00','ISO');
2012-05-02 01:00:00+01:00 を返します。
td_thursday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる木曜日を
返します。
構文
td_thursday
TD_SYSFNLIB.
( expression_1
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
368
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_thursday
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数は、次のデータ タイプのいずれかになります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数は、次のシステム定義のカレンダのいずれか (TERADATA、ISO、または
COMPATIBLE)または NULL になります。
第 3 引数は、次のデータ タイプのいずれかになります。
• TIME
• TIME WITH TIME ZONE
• NULL
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
SQL 関数、演算子、式および述部
369
第 8 章 ビジネス カレンダ
td_friday
例: DATE または TIMESTAMP より前の木曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_THURSDAY(TIMESTAMP'2012-05-08 10:00:00',NULL,NULL);
2012-05-03 00:00:00 を返します。
NULL を指定しているため、セッション カレンダ、つまりこの場合は TERADATA が
使用されることになります。
td_friday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる金曜日を
返します。
構文
td_friday
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
370
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_friday
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の金曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_FRIDAY(TIMESTAMP'2012-05-08 10:00:00',NULL,TIME'05:00:00');
2012-05-04 05:00:00 を返します。
NULL を指定しているため、セッション カレンダ、つまりこの場合は TERADATA が
使用されることになります。
SQL 関数、演算子、式および述部
371
第 8 章 ビジネス カレンダ
td_saturday
td_saturday
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる土曜日を
返します。
構文
td_saturday
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数 expression は、次に示すデータ型で定義されます。
372
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
DayNumber_Of_Week
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP より前の土曜日の問合わせ
次の SQL 文を実行します。
SELECT TD_SATURDAY(TIMESTAMP'2012-05-08
10:00:00',NULL,TIME'05:00:00+03:00');
2012-05-05 02:00:00 を返します。
NULL を指定しているため、セッション カレンダ、つまりこの場合は TERADATA が
使用されることになります。
DayNumber_Of_Week
目的
週初めから指定された日までの日数を返します。
構文
DAYNUMBER_OF_WEEK
TD_SYSFNLIB.
( expression
,
)
calendar_name
NULL
SQL 関数、演算子、式および述部
373
第 8 章 ビジネス カレンダ
DayNumber_Of_Week
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数は、次のデータ タイプのいずれかになります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数は、次のシステム定義のカレンダのいずれか (TERADATA、ISO、または
COMPATIBLE)または NULL になります。
第 3 引数は、次のデータ タイプのいずれかになります。
• TIME
• TIME WITH TIME ZONE
• NULL
結果
結果は曜日を表わす 1 から 7 の INTEGER 値になります。この値で、週の最初の日は
1、週の最後の日は 7 です。週の最初の日は、セッションが使用しているビジネス
カレンダによって定義されます。たとえば、ISO カレンダでは月曜日は 1、Teradata
ビジネス カレンダでは月曜日は 2 です。
374
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_month_begin
使用上の注意
DayNumber_Of_Week 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 従業員の名前の問合わせ
次の問合わせは、その週の最初の日に入社した従業員の名前を返します。
SELECT empname from emp
WHERE DAYNUMBER_OF_WEEK (date_of_join)= 1;
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
td_month_begin
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる月初めを
返します。
構文
td_month_begin
TD_SYSFNLIB.
( expression_1
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
SQL 関数、演算子、式および述部
375
第 8 章 ビジネス カレンダ
td_month_begin
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の直前にあたる月初の問合わせ
次の SQL 文を実行します。
SELECT TD_MONTH_BEGIN(DATE'2012-01-15');
12/01/01 を返します。
カレンダを指定していないため、セッション カレンダ、つまりこの場合は Teradata
が使用されることになります。
376
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_month_end
td_month_end
目的
expression_1 に指定されている DATE または TIMESTAMP の直後にあたる月末を返
します。
構文
td_month_end
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数 expression は、次に示すデータ型で定義されます。
SQL 関数、演算子、式および述部
377
第 8 章 ビジネス カレンダ
DayNumber_Of_Month
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の直後にあたる月末の問合わせ
次の SQL 文を実行します。
SELECT TD_MONTH_END(DATE'2012-01-15',NULL);
12/01/31 を返します。
NULL を指定しているため、セッション カレンダ、つまりこの場合は Teradata が
使用されることになります。
DayNumber_Of_Month
目的
月初めから指定された日までの日数を返します。
構文
DAYNUMBER_OF_MONTH
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
378
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
DayNumber_Of_Month
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数は、次のデータ タイプのいずれかになります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数は、次のシステム定義のカレンダのいずれか (TERADATA、ISO、または
COMPATIBLE)または NULL になります。
第 3 引数は、次のデータ タイプのいずれかになります。
• TIME
• TIME WITH TIME ZONE
• NULL
結果
結果は 1 から 31 の INTEGER 値になります。
使用上の注意
DayNumber_Of_Month 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
SQL 関数、演算子、式および述部
379
第 8 章 ビジネス カレンダ
DayOccurrence_Of_Month
例: 月の初めからの日数の問合わせ
次に示す例は、どちらもセッションに設定されたビジネス カレンダがありません。
そのため、その問合わせは、システム定義のビジネス カレンダである Teradata を使
用します。
次の問合わせでは、その月の日数として 1 ではなく 31 が得られます。これは、入力
が UTC 2009-12-31 19:00:00 に変換されるためです。
SET TIME ZONE INTERVAL ‘05:00’ HOUR TO MINUTE;
SELECT DAYNUMBER_OF_MONTH (TIMESTAMP‘2010-01-01 00:00:00’);
次の問合わせでは、その月の日数として 1 ではなく 31 が得られます。これは、入力
が UTC 2009-12-31 21:00:00 に変換されるためです。
SEL DAYNUMBER_OF_MONTH (TIMESTAMP’2010-01-01 00:00:00+03:00’);
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
DayOccurrence_Of_Month
目的
指定された日の曜日が、その月の n 番目の出現かを返します。
構文
DAYOCCURRENCE_OF_MONTH
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
380
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
DayOccurrence_Of_Month
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数は、次のデータ タイプのいずれかになります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数は、次のシステム定義のカレンダのいずれか (TERADATA、ISO、または
COMPATIBLE)または NULL になります。
第 3 引数は、次のデータ タイプのいずれかになります。
• TIME
• TIME WITH TIME ZONE
• NULL
結果
結果は 1 から 5 の整数値になります。これは、その月の n 番目の平日が現われる位
置を表わします。
使用上の注意
DayOccurrence_of_Month 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンス
が向上します。
例: ある平日がその月の何週目に属するかを問合わせる
現在の日付が 2010 年 5 月 1 日の場合、次の問合わせは 1 を返します。これは、
2010 年 5 月 1 日が月の最初の土曜日にあたるからです。
SELECT TD_SYSFNLIB.DAYOCCURRENCE_OF_MONTH(CURRENT_DATE);
SELECT TD_SYSFNLIB.DAYOCCURRENCE_OF_MONTH(DATE '2010-05-01');
SQL 関数、演算子、式および述部
381
第 8 章 ビジネス カレンダ
WeekNumber_Of_Month
関連トピック
詳細は、<データ ディクショナリ 、B035-1092>を参照してください。
WeekNumber_Of_Month
目的
月初めから指定された日までの週の数を返します。
構文
WEEKNUMBER_OF_MONTH
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
382
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_year_begin
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 5 の INTEGER 値になります。これは、その月の n 番目の週が現われ
る位置を表わします。値 0 は 7 に満たない週(第 0 週)を意味します。
使用上の注意
WeekNumber_Of_Month 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 月の初めからの週数の問合わせ
現在の日付が 1901 年 1 月 5 日の場合、次の問合わせは 0 を返します。これは、
1901 年 1 月 5 日が Teradata カレンダでは 1 月の第 0 週に含まれるからです。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_MONTH (CURRENT_DATE);
次の問合わせは 1 を返します。これは、1901 年 1 月 5 日が ISO カレンダでは 1 月
の第 1 週に含まれるからです。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_MONTH (DATE ‘1901-01-05’, ‘ISO’);
td_year_begin
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる年初めを
返します。
構文
td_year_begin
TD_SYSFNLIB.
SQL 関数、演算子、式および述部
( expression_1
)
,
calendar_name
NULL
,
expression_2
383
第 8 章 ビジネス カレンダ
td_year_begin
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
384
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_year_end
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の直前に始まる年の問合わせ
次の SQL 文を実行します。
SELECT TD_YEAR_BEGIN(TIMESTAMP'2012-01-15 12:00:00','ISO',NULL);
2012-01-02 00:00:00 を返します。
td_year_end
目的
expression_1 に指定されている DATE または TIMESTAMP の直後にあたる年末を返
します。
構文
td_year_end
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
SQL 関数、演算子、式および述部
385
第 8 章 ビジネス カレンダ
DayNumber_Of_Year
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の後の年末の問合わせ
次の SQL 文を実行します。
SELECT TD_YEAR_END(TIMESTAMP'2012-01-15 10:00:00','ISO');
2012-12-30 23:59:59 を返します。
DayNumber_Of_Year
目的
年初めから指定された日までの日数を返します。
386
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
DayNumber_Of_Year
構文
DAYNUMBER_OF_YEAR
( expression
,
TD_SYSFNLIB.
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
この関数はオーバーロードされ、1~3 個の引数を指定して呼び出すことができます。
第 1 引数は、次のデータ タイプのいずれかになります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数は、次のシステム定義のカレンダのいずれか (TERADATA、ISO、または
COMPATIBLE)または NULL になります。
第 3 引数は、次のデータ タイプのいずれかになります。
• TIME
• TIME WITH TIME ZONE
• NULL
SQL 関数、演算子、式および述部
387
第 8 章 ビジネス カレンダ
WeekNumber_Of_Year
結果
結果は 1 から 366 の INTEGER 値になります。
使用上の注意
DayNumber_Of_Year 関数では、同様の結果を得るために Sys_Calendar.Calendar シ
ステム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: DATE または TIMESTAMP の直後にあたる年末の問合わせ
現在の日付が 2010 年 2 月 10 日の場合、次の問合わせは 41 を返します。これは、
2010 年 2 月 10 日が Teradata カレンダの年初めから 41 番目の日にあたるからです。
SELECT TD_SYSFNLIB.DAYNUMBER_OF_YEAR(CURRENT_DATE);
SELECT TD_SYSFNLIB.DAYNUMBER_OF_YEAR(DATE '2010-02-10');
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
WeekNumber_Of_Year
目的
年初めから指定された日までの週の数を返します。
構文
WEEKNUMBER_OF_YEAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
388
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
WeekNumber_Of_Year
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 0 から 53 の INTEGER 値になります。1 はその年の第 1 週であり、53 はそ
の年の最終週になります。値 0 は、その年に部分的な週(第 0 週)があることを意味
します。
使用上の注意
WeekNumber_Of_Year 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の初めからの週数の問合わせ
現在の日付が 1901 年 1 月 5 日の場合、次の問合わせは 0 を返します。これは、
1901 年 1 月 5 日が Teradata カレンダでは 1901 年の第 0 週に含まれるからです。
SQL 関数、演算子、式および述部
389
第 8 章 ビジネス カレンダ
MonthNumber_Of_Year
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_YEAR (CURRENT_DATE);
次の問合わせは 1 を返します。これは、1901 年 1 月 5 日が COMPATIBLE カレン
ダでは 1901 年の第 1 週に含まれるからです。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_YEAR (DATE ‘1901-01-05’, ‘COMPATIBLE’);
関連トピック
詳細は、<データ ディクショナリ 、B035-1092>を参照してください。
MonthNumber_Of_Year
目的
年初めから指定された日までの月数を返します。
構文
MONTHNUMBER_OF_YEAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
390
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
MonthNumber_Of_Year
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 12 の整数値になります。これは、その年の n 番目の月を表わします。
使用上の注意
MonthNumber_Of_Year 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の初めからの月数の問合わせ
現在の日付が 2011 年 3 月 15 日の場合、次の問合わせは 3 を返します。これは、
2011 年 3 月 15 日が Teradata カレンダの 3 番目の月にあるからです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_YEAR(CURRENT_DATE);
次の問合わせは 3 を返します。これは、2011 年 3 月 15 日が ISO カレンダの 3 番
目の月にあるからです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_YEAR(DATE '2011-03-15', ’ISO’);
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
SQL 関数、演算子、式および述部
391
第 8 章 ビジネス カレンダ
td_quarter_begin
td_quarter_begin
目的
expression_1 に指定されている DATE または TIMESTAMP の直前にあたる四半期初
めを返します。
構文
td_quarter_begin
( expression_1
TD_SYSFNLIB.
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
392
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
td_quarter_end
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
例: DATE または TIMESTAMP の直前にあたる四半期の問合わせ
次の SQL 文を実行します。
SELECT TD_QUARTER_BEGIN(DATE'2012-01-15','COMPATIBLE');
12/01/01 を返します。
td_quarter_end
目的
expression_1 に指定されている DATE または TIMESTAMP の直後にあたる四半期末
を返します。
構文
td_quarter_end
TD_SYSFNLIB.
( expression_1
)
,
calendar_name
NULL
,
expression_2
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
SQL 関数、演算子、式および述部
393
第 8 章 ビジネス カレンダ
td_quarter_end
expression_1
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
expression_1 が DATE である場合は、expression_2 を指定できません。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
expression_2
TIME、TIME WITH TIME ZONE、NULL のいずれかの値。NULL を指定した場合、
TIME は 00:00:00+00:00 であるとみなされます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
戻り値は、次のいずれかのデータ タイプです。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
394
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
WeekNumber_Of_Quarter
例: DATE または TIMESTAMP の直後にあたる四半期末の問合わせ
次の SQL 文を実行します。
SELECT TD_QUARTER_END(TIMESTAMP'2012-01-15 10:00:00','COMPATIBLE');
2012-03-31 23:59:59 を返します。
WeekNumber_Of_Quarter
目的
四半期の初めから指定された日までの週の数を返します。
構文
WEEKNUMBER_OF_QUARTER
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
395
第 8 章 ビジネス カレンダ
MonthNumber_Of_Quarter
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 14 の INTEGER 値になります。これは、その四半期の n 番目の週を表
わします。値 0 は 7 に満たない週(第 0 週)を意味します。
例: 四半期の最初からの週数の問合わせ
現在の日付が 2011 年 4 月 20 日の場合、次の問合わせは 3 because April 20,
2011, is in the third week of the quarter in the Teradata calendar を
返します。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_QUARTER(CURRENT_DATE);
次の問合わせは 3 を返します。これは、2011 年 4 月 20 日が ISO カレンダの四半期
の 3 番目の週にあるからです。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_QUARTER (DATE '2011-04-20', ’ISO’);
MonthNumber_Of_Quarter
目的
四半期の初めから指定された日までの月数を返します。
構文
MONTHNUMBER_OF_QUARTER
TD_SYSFNLIB.
( expression
,
)
calendar_name
NULL
396
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
MonthNumber_Of_Quarter
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 3 の整数値になります。これは、その四半期の n 番目の月を表わしま
す。
SQL 関数、演算子、式および述部
397
第 8 章 ビジネス カレンダ
QuarterNumber_Of_Year
使用上の注意
MonthNumber_Of_Quarter 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンスが
向上します。
例: 四半期の初めからの月数の問合わせ
現在の日付が 2011 年 4 月 20 日の場合、次の問合わせは 1 を返します。これは、
2011 年 4 月 20 日が Teradata カレンダの四半期の 1 番目の月にあるからです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_QUARTER(CURRENT_DATE);
次の問合わせは 1 を返します。これは、2011 年 4 月 20 日が ISO カレンダの四半期
の 1 番目の月にあるからです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_QUARTER(DATE '2011-04-20', ’ISO’);
関連トピック
詳細は、<データ ディクショナリ 、B035-1092>を参照してください。
QuarterNumber_Of_Year
目的
年初めから指定された日までの四半期の数を返します。
構文
QUARTERNUMBER_OF_YEAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
398
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
QuarterNumber_Of_Year
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 4 の整数値になります。これは、その年の n 番目の四半期を表わしま
す。
使用上の注意
QuarterNumber_Of_Year 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の初めからの四半期数の問合わせ
現在の日付が 2010 年 12 月 20 日の場合、次の問合わせは 4 を返します。これは、
2010 年 12 月 20 日が Teradata カレンダの 4 番目の四半期にあるからです。
SELECT TD_SYSFNLIB.QUARTERNUMBER_OF_YEAR(CURRENT_DATE);
SQL 関数、演算子、式および述部
399
第 8 章 ビジネス カレンダ
DayNumber_Of_Calendar
次の問合わせは 4 を返します。これは、2010 年 12 月 10 日が ISO カレンダの 4 番
目の四半期にあるからです。
SELECT TD_SYSFNLIB.QUARTERNUMBER_OF_YEAR(DATE '2010-12-20', ’ISO’);
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
DayNumber_Of_Calendar
目的
ビジネス カレンダの初日から指定された日までの日数を返します。
構文
DAYNUMBER_OF_CALENDAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
400
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
WeekNumber_Of_Calendar
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義
されます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、ビジネス カレンダの初日からの日数(同日を含む)を表わす INTEGER 値です。
使用上の注意
DayNumber_Of_Calendar 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンス
が向上します。
例: ビジネス カレンダの最初からの日数の問合わせ
現在の日付が 1901 年 1 月 5 日の場合、次の問合わせは 370 を返します。これは、
1901 年 1 月 5 日が 1900 年 1 月 1 日から 370 番目の日にあたるからです。
SELECT TD_SYSFNLIB.DAYNUMBER_OF_CALENDAR(CURRENT_DATE);
SELECT TD_SYSFNLIB.DAYNUMBER_OF_CALENDAR(DATE '1901-01-05');
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
WeekNumber_Of_Calendar
目的
ビジネス カレンダの初日から指定された日までの週の数を返します。
SQL 関数、演算子、式および述部
401
第 8 章 ビジネス カレンダ
WeekNumber_Of_Calendar
構文
WEEKNUMBER_OF_CALENDAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
402
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
MonthNumber_Of_Calendar
結果
結果は INTEGER 値になります。値 0 は、その年に 7 に満たない週(第 0 週)があるこ
とを意味します。
使用上の注意
WeekNumber_Of_Calendar 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンス
が向上します。
例: ビジネス カレンダの最初からの週数の問合わせ
現在の日付が 1901 年 1 月 5 日の場合、次の問合わせは 52 を返します。これは、
1901 年 1 月 5 日が Teradata カレンダの開始(1900-01-01)から 52 週目にあるから
です。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_CALENDAR (CURRENT_DATE);
次の問合わせは 53 を返します。これは、1901 年 1 月 5 日が COMPATIBLE カレン
ダの開始(1900-01-01)から 53 週目にあるからです。
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_CALENDAR (DATE ‘1901-01-05’,
‘COMPATIBLE’);
MonthNumber_Of_Calendar
目的
カレンダの初日から指定された日までの月数を返します。
構文
MONTHNUMBER_OF_CALENDAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
SQL 関数、演算子、式および述部
403
第 8 章 ビジネス カレンダ
MonthNumber_Of_Calendar
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、カレンダの初日からの月数(同月を含む)を表わす INTEGER 値です。
使用上の注意
MonthNumber_Of_Calendar 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンスが
向上します。
404
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
QuarterNumber_Of_Calendar
例: カレンダの最初からの月数の問合わせ
現在の日付が 1901 年 5 月 5 日の場合、次の問合わせは 17 を返します。これは、
1901 年 5 月 5 日が Teradata カレンダの開始(1900-01-01)から 17 番目の月にある
からです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_CALENDAR(CURRENT_DATE);
次の問合わせは 17 を返します。これは、1901 年 5 月 5 日が COMPATIBLE カレン
ダの開始(1900-01-01)から 17 番目の月にあるからです。
SELECT TD_SYSFNLIB.MONTHNUMBER_OF_CALENDAR(DATE
'1901-05-05', ’COMPATIBLE’);
関連トピック
詳細は、<データ ディクショナリ 、B035-1092>を参照してください。
QuarterNumber_Of_Calendar
目的
カレンダの初日から指定された日までの四半期の数を返します。
構文
QUARTERNUMBER_OF_CALENDAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
SQL 関数、演算子、式および述部
405
第 8 章 ビジネス カレンダ
QuarterNumber_Of_Calendar
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、カレンダの初日からの四半期の数(同四半期を含む)を表わす INTEGER 値です。
使用上の注意
QuarterNumber_Of_Calendar 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンスが
向上します。
例: カレンダの最初からの四半期数の問合わせ
現在の日付が 1901 年 5 月 5 日の場合、次の問合わせは 6 を返します。これは、
1901 年 5 月 5 日が Teradata カレンダの初日(1900-01-01)から 6 番目の四半期にあ
るからです。
SELECT TD_SYSFNLIB.QUARTERNUMBER_OF_CALENDAR(CURRENT_DATE);
次の問合わせは 6 を返します。これは、1901 年 5 月 5 日が COMPATIBLE カレンダ
の初日(1900-01-01)から 6 番目の四半期にあるからです。
SELECT TD_SYSFNLIB.QUARTERNUMBER_OF_CALENDAR (DATE
'1901-05-05', ’COMPATIBLE’);
406
SQL 関数、演算子、式および述部
第 8 章 ビジネス カレンダ
YearNumber_Of_Calendar
関連トピック
CALENDAR システム ビューについて、詳細は<データ ディクショナリ、B035-1092>
を参照してください。
YearNumber_Of_Calendar
目的
指定した日の年を返します。
構文
YEARNUMBER_OF_CALENDAR
( expression
TD_SYSFNLIB.
,
)
calendar_name
NULL
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
calendar_name
カレンダ名。使用可能な値は Teradata、ISO、および COMPATIBLE です。
この引数は文字リテラルでなければなりません。また、この引数をテーブルの列や
式にすることはできません。カレンダに名前を付けていない場合、Teradata はセッ
ションのカレンダを使用します。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
NULL
セッションのビジネス カレンダ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
第 1 引数 expression は、次に示すデータ型で定義されます。
• DATE
SQL 関数、演算子、式および述部
407
第 8 章 ビジネス カレンダ
YearNumber_Of_Calendar
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
第 2 引数 calendar_name は任意選択であり、次に示す引数のデータ タイプで定義さ
れます。
• VARCHAR
• NULL
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、年を表わす 4 桁書式の INTEGER 値になります。
使用上の注意
YearNumber_Of_Calendar 関数では、同様の結果を得るために
Sys_Calendar.Calendar システム ビューを使用する方法に比べて、パフォーマンスが
向上します。
例: 指定した日の年の問合わせ
現在の日付が 1906 年 6 月 14 日の場合、次の問合わせは 1906 を返します。
SELECT TD_SYSFNLIB.YEARNUMBER_OF_CALENDAR(CURRENT_DATE);
SELECT TD_SYSFNLIB.YEARNUMBER_OF_CALENDAR (DATE
'1906-06-14', ’COMPATIBLE’);
関連トピック
詳細は、以下を参照してください。
• データ ディクショナリ 、B035-1092
408
SQL 関数、演算子、式および述部
第9章
CALENDAR 関数
概要
この章では、カレンダ属性を使用する日時操作をサポートする関数について説明し
ます。
前提条件
これらの関数を使用する前に、データベース初期化プログラム(DIP)ユーティリティ
を実行し、DIPUDT スクリプトを実行する必要があります。DIPALL および DIPUDT
スクリプトにより、カレンダ関数が SYSLIB データベース内に作成されます。DIP
ユーティリティの詳細は、<ユーティリティ 、B035-1102>を参照してください。
カレンダ関数と同じ名前の、ユーザーが開発した UDF を持っている場合は、カレン
ダ関数を呼び出す前に、ユーザーが開発した UDF を通常の UDF 検索パスから削除
する必要があります。現在のデータベースでカレンダ関数を見つけられない場合、
Teradata Database は SYSLIB データベースで関数を検索します。この代わりに、完
全修飾した構文(SYSLIB.calendar_function_name)を使用して、カレンダ関数を呼び
出すこともできます。
td_day_of_week
目的
指定された日の曜日を返します。
構文
td_day_of_week
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
SQL 関数、演算子、式および述部
409
第 9 章 CALENDAR 関数
td_day_of_month
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
引数のタイプ
td_day_of_week はオーバーロード スカラー関数です。この関数は以下に示すパラ
メータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は曜日を表わす 1 から 7 の INTEGER 値になります。この値で、日曜日は 1、土
曜日は 7 です。
使用上の注意
td_day_of_week 関数では、同様の結果を得るために Sys_Calendar.Calendar システ
ム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 指定した日が該当する曜日の問合わせ
現在の日付が 2010 年 10 月 18 日月曜日の場合、次の問合わせは結果として値 2 を
返します。これは、月曜日が週の 2 番目の日にあたるからです。
SELECT td_day_of_week(CURRENT_DATE);
SELECT td_day_of_week(DATE '2010-10-18');
td_day_of_month
目的
月初めから指定された日までの日数を返します。
構文
td_day_of_month
(expression)
SYSLIB.
410
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_day_of_month
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_day_of_month はオーバーロード スカラー関数です。この関数は以下に示すパラ
メータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 31 の INTEGER 値になります。
使用上の注意
td_day_of_month 関数では、同様の結果を得るために Sys_Calendar.Calendar シス
テム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 月の最初からの日数の問合わせ
現在の日付が 2010 年 5 月 27 日の場合、次の問合わせは結果として値 27 を返しま
す。これは、2010 年 5 月 27 日が 5 月の月初めから 27 番目の日にあたるからです。
SELECT td_day_of_month(CURRENT_DATE);
SELECT td_day_of_month(DATE '2010-05-27');
SQL 関数、演算子、式および述部
411
第 9 章 CALENDAR 関数
td_day_of_year
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• CALENDAR システム ビューについて、詳細は<データ ディクショナリ 、
B035-1092>を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
td_day_of_year
目的
年初め(1 月 1 日)から指定された日までの日数を返します。
構文
td_day_of_year
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_day_of_year はオーバーロード スカラー関数です。この関数は以下に示すパラ
メータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
412
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_weekday_of_month
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 366 の INTEGER 値になります。
使用上の注意
td_day_of_year 関数では、同様の結果を得るために Sys_Calendar.Calendar システ
ム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の最初からの日数の問合わせ
現在の日付が 2010 年 2 月 10 日の場合、次の問合わせは結果として値 41 を返しま
す。これは、2010 年 2 月 10 日が年初めから 41 番目の日にあたるからです。
SELECT td_day_of_year(CURRENT_DATE);
SELECT td_day_of_year(DATE '2010-02-10');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
td_weekday_of_month
目的
指定された日の曜日が、その月の n 番目の出現かを返します。
構文
td_weekday_of_month
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
SQL 関数、演算子、式および述部
413
第 9 章 CALENDAR 関数
td_weekday_of_month
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_weekday_of_month はオーバーロード スカラー関数です。この関数は以下に示す
パラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 5 の整数値になります。これは、その月の n 番目の曜日の出現を表わ
します。
使用上の注意
td_weekday_of_month 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: ある平日がその月の何週目に属するかを問合わせる
現在の日付が 2010 年 5 月 1 日の場合、次の問合わせは結果として値 1 を返しま
す。これは、2010 年 5 月 1 日が月の最初の日曜日にあたるからです。
SELECT td_weekday_of_month(CURRENT_DATE);
SELECT td_weekday_of_month(DATE '2010-05-01');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
414
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_week_of_month
• CALENDAR システム ビューについて、詳細は<データ ディクショナリ 、
B035-1092>を参照してください。
td_week_of_month
目的
指定された日が、月初めから n 番目の週かを返します。
構文
td_week_of_month
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_week_of_month はオーバーロード スカラー関数です。この関数は以下に示すパ
ラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 0 から 5 の整数値になります。これは、月初めから n 番目の週を表わしま
す。最初の 7 日に満たない週は 0 です。
SQL 関数、演算子、式および述部
415
第 9 章 CALENDAR 関数
td_week_of_year
使用上の注意
td_week_of_month 関数では、同様の結果を得るために Sys_Calendar.Calendar シス
テム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 月の最初から n 番目の週であるかを問合わせる
現在の日付が 2010 年 5 月 1 日の場合、次の問合わせは結果として値 0 を返しま
す。これは 2010 年 5 月 1 日が、5 月の最初の 7 日に満たない週にあたるからです。
SELECT td_week_of_month(CURRENT_DATE);
SELECT td_week_of_month(DATE '2010-05-01');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• CALENDAR システム ビューについて、詳細は<データ ディクショナリ 、
B035-1092>を参照してください。
td_week_of_year
目的
指定された日が、年初め(1 月 1 日)から n 番目の週かを返します。
構文
td_week_of_year
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
416
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_week_of_calendar
引数のタイプ
td_week_of_year はオーバーロード スカラー関数です。この関数は以下に示すパラ
メータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 0 から 53 の整数値になります。これは、年初めから n 番目の週を表わしま
す。最初の 7 日に満たない週は 0 です。
使用上の注意
td_week_of_year 関数では、同様の結果を得るために Sys_Calendar.Calendar システ
ム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の最初から n 番目の週であるかを問合わせる
現在の日付が 2010 年 5 月 4 日の場合、次の問合わせは結果として値 18 を返しま
す。これは、2010 年 5 月 4 日がその年の 18 番目の週にあたるからです。
SELECT td_week_of_year(CURRENT_DATE);
SELECT td_week_of_year(DATE '2010-05-04');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
td_week_of_calendar
目的
1900 年 1 月 1 日から始まるカレンダの最初の日から指定された日までの週の数を
返します。
SQL 関数、演算子、式および述部
417
第 9 章 CALENDAR 関数
td_week_of_calendar
構文
td_week_of_calendar
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_week_of_calendar はオーバーロード スカラー関数です。この関数は以下に示す
パラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、1900 年 1 月 1 日からの週の数を表わす INTEGER 値になります。最初の 7
日に満たない週は 0 です。
使用上の注意
td_week_of_calendar 関数では、同様の結果を得るために Sys_Calendar.Calendar シ
ステム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: カレンダの最初からの週数の問合わせ
現在の日付が 1901 年 1 月 10 日の場合、次の問合わせは結果として値 53 を返しま
す。これは、1901 年 1 月 10 日が 1900 年 1 月 1 日から 53 番目の週にあたるから
です。
418
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_month_of_quarter
SELECT td_week_of_calendar(CURRENT_DATE);
SELECT td_week_of_calendar(DATE '1901-01-10');
関連トピック
詳細は、以下を参照してください。
• オーバーロード関数の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「関数名のオーバーロード」を参照してください。
• データ ディクショナリ 、B035-1092
td_month_of_quarter
目的
四半期の初めから指定された日までの月数を返します。
構文
td_month_of_quarter
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_month_of_quarter はオーバーロード スカラー関数です。この関数は以下に示す
パラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
SQL 関数、演算子、式および述部
419
第 9 章 CALENDAR 関数
td_month_of_year
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 3 の INTEGER 値になります。
使用上の注意
td_month_of_quarter 関数では、同様の結果を得るために Sys_Calendar.Calendar シ
ステム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 四半期の最初からの月数の問合わせ
現在の日付が 2010 年 6 月 12 日の場合、次の問合わせは結果として値 3 を返しま
す。これは、2010 年 6 月 12 日が第 2 四半期の 3 番目の月にあたるからです。
SELECT td_month_of_quarter(CURRENT_DATE);
SELECT td_month_of_quarter(DATE '2010-06-12');
関連トピック
詳細は、以下を参照してください。
• SQL 外部ルーチン プログラミング、B035-1147
• データ ディクショナリ 、B035-1092
td_month_of_year
目的
年初め(1 月 1 日)から指定された日までの月数を返します。
構文
td_month_of_year
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
420
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_month_of_year
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_month_of_year はオーバーロード スカラー関数です。この関数は以下に示すパ
ラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 12 の INTEGER 値になります。
使用上の注意
td_month_of_year 関数では、同様の結果を得るために Sys_Calendar.Calendar シス
テム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 年の最初からの月数の問合わせ
現在の日付が 2010 年 8 月 29 日の場合、次の問合わせは結果として値 8 を返しま
す。これは、2010 年 8 月 29 日がその年の 8 番目の月にあたるからです。
SELECT td_month_of_year(CURRENT_DATE);
SELECT td_month_of_year(DATE '2010-08-29');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
SQL 関数、演算子、式および述部
421
第 9 章 CALENDAR 関数
td_month_of_calendar
td_month_of_calendar
目的
1900 年 1 月 1 日から始まるカレンダの最初の日から指定された日までの月数を返
します。
構文
td_month_of_calendar
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_month_of_calendar はオーバーロード スカラー関数です。この関数は以下に示す
パラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、1900 年 1 月からの月数(同月を含む)を表わす INTEGER 値です。
使用上の注意
td_month_of_calendar 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
422
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_quarter_of_year
例: 暦年の最初からの月数の問合わせ
現在の日付が 1901 年 8 月 29 日の場合、次の問合わせは結果として値 20 を返しま
す。これは、1901 年 8 月 29 日が 1900 年 1 月 1 日から 20 番目の月にあたるから
です。
SELECT td_month_of_calendar(CURRENT_DATE);
SELECT td_month_of_calendar(DATE '1901-08-29');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
td_quarter_of_year
目的
指定された日に対する、その年の四半期の番号を返します。
構文
td_quarter_of_year
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_quarter_of_year はオーバーロード スカラー関数です。この関数は以下に示すパ
ラメータのデータ タイプで定義されます。
SQL 関数、演算子、式および述部
423
第 9 章 CALENDAR 関数
td_quarter_of_calendar
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は 1 から 4 の INTEGER 値になります。これは、年初めからの四半期の数を表わ
します。1 は第 1 四半期(1 月、2 月、3 月)、4 は第 4 四半期(10 月、11 月、12 月)
です。
使用上の注意
td_quarter_of_year 関数では、同様の結果を得るために Sys_Calendar.Calendar シス
テム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: その年の何番目の四半期であるかを問合わせる
現在の日付が 1983 年 11 月 14 日の場合、次の問合わせは結果として値 4 を返しま
す。これは、1983 年 11 月 14 日がその年の第 4 四半期にあたるからです。
SELECT td_quarter_of_year(CURRENT_DATE);
SELECT td_quarter_of_year(DATE '1983-11-14');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
td_quarter_of_calendar
目的
1900 年 1 月 1 日から始まるカレンダの最初の日から指定された日までの四半期の
数を返します。
構文
td_quarter_of_calendar
(expression)
SYSLIB.
424
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_quarter_of_calendar
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_quarter_of_calendar はオーバーロード スカラー関数です。この関数は以下に示
すパラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
結果
結果は、1900 年の第 1 四半期からの四半期の数(当該の四半期を含む)を表わす
INTEGER 値です。
使用上の注意
td_quarter_of_calendar 関数では、同様の結果を得るために Sys_Calendar.Calendar
システム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: カレンダの最初からの四半期数の問合わせ
現在の日付が 1901 年 11 月 14 日の場合、次の問合わせは結果として値 8 を返しま
す。これは、1901 年 11 月 14 日が 1900 年 1 月 1 日から 8 番目の四半期にあたる
からです。
SELECT td_quarter_of_calendar(CURRENT_DATE);
SELECT td_quarter_of_calendar(DATE '1901-11-14');
SQL 関数、演算子、式および述部
425
第 9 章 CALENDAR 関数
td_year_of_calendar
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• データ ディクショナリ 、B035-1092
td_year_of_calendar
目的
指定した日の年を返します。
構文
td_year_of_calendar
(expression)
SYSLIB.
構文要素
SYSLIB
関数が格納されているデータベースの名前。
expression
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプ
td_year_of_calendar はオーバーロード スカラー関数です。この関数は以下に示すパ
ラメータのデータ タイプで定義されます。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
関数に渡される引数が、これらの宣言されたデータ タイプの 1 つと一致しない場
合、関数が存在しないことを示すエラーが返されます。
426
SQL 関数、演算子、式および述部
第 9 章 CALENDAR 関数
td_year_of_calendar
結果
結果は、指定した日の年を表わす、4 桁形式の INTEGER 値です。
使用上の注意
td_year_of_calendar 関数では、同様の結果を得るために Sys_Calendar.Calendar シ
ステム ビューを使用する方法に比べて、パフォーマンスが向上します。
例: 指定した日の年の問合わせ
現在の日付が 1977 年 11 月 14 日の場合、次の問合わせは結果として値 1977 を返
します。これは指定した日の年です。
SELECT td_year_of_calendar(CURRENT_DATE);
SELECT td_year_of_calendar(DATE '1977-11-14');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「関数名のオーバーロード」
• CALENDAR システム ビューについて、詳細は<データ ディクショナリ 、
B035-1092>を参照してください。
SQL 関数、演算子、式および述部
427
第 9 章 CALENDAR 関数
td_year_of_calendar
428
SQL 関数、演算子、式および述部
第 10 章
比較演算子と関数
概要
この章では、SQL 比較演算子について説明します。
比較演算子
目的
比較演算子は論理述部の一種であり(条件式とも呼ばれます)、式間の関係の真偽を
テストします。
• ストアド プロシージャ内の IF、WHILE、REPEAT、および CASE 文
• 検索形式の CASE 式内の WHEN 句
• SELECT 文中の行を修飾または修飾解除するための WHERE、ON、および HAVING
句
• CASE_N 関数
構文
expression_1
operator
expression_2
expression_1
operator
quantifier
expression_1
operator
expression_1
,
literal
)
( subquery )
quantifier
,
(
(
)
operator
( subquery )
quantifier
構文要素
operator
比較演算子のうちの 1 つ。
expression_1,
expression_2
SQL スカラー式。派生 PERIOD 式も含みます。
SQL 関数、演算子、式および述部
429
第 10 章 比較演算子と関数
比較演算子
quantifier
次の数量詞キーワードの 1 つ。
• ANY
• SOME
• ALL
literal
1 つ以上のリテラル値。リテラルは、次のいずれかになります。
• 定義された値
• マクロ パラメータ
• TIME、DATE、または USER などの組み込み値
比較演算では、明示リテラルのリストに対して式を比較することができます。
式およびリテラルのデータ型には、互換性が必要です。オペランドのデータ型が異
なる場合には、Teradata Database は一方のタイプから他方のタイプへの暗黙の変換
を実行することがあります。
subquery
SQL の SELECT 文。
条件の中で subquery を使用することが制限される場合もあります。
scalar_expression
2 番目の scalar_expression との比較で評価される式。派生 PERIOD も含みます。
比較演算子は BLOB または CLOB タイプの式をサポートしていません。BLOB を BYTE
または VARBYTE に、CLOB を CHARACTER または VARCHAR に明示的にキャスト
し、結果を比較演算子と一緒に使用することができます。
結果が UDT データ タイプになる式が比較できるのは、結果が同じ UDT データ タイ
プになる別の式とだけです。
comparison_operator
真偽を評価される比較のタイプ。
結果
比較演算子を使用する論理式は TRUE、FALSE、または UNKNOWN と評価されます。
ANSI への準拠
次の比較演算子は、ANSI SQL:2011 に準拠しています。
• =
• <
• <=
• >
• <>
• >=
次の比較演算子は、ANSI SQL:2011 規格の Teradata 拡張機能です。使用は推奨され
ません。
430
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
比較演算子
• EQ
• NOT=
• GT
• ^=
• LT
• GE
• NE
• LE
サポートされる比較演算子
Teradata Database は次の比較演算子をサポートしています。
ANSI 演算子
Teradata の拡張部分
関数
=
EQ
等しいかどうかをテストします。
<>
^=
NE
NOT=
等しくないかどうかをテストし
ます。
<
LT
より小さいかどうかをテストし
ます。
<=
LE
より小さい、または等しいかど
うかをテストします。
>
GT
より大きいかどうかをテストし
ます。
>=
GE
より大きい、または等しいかど
うかをテストします。
SUBQUERY を使用する比較演算子
Subquery とは、比較演算子の条件を満たすために使用する値を返す SELECT 文で
す。Subquery は、括弧で囲む必要があります。また、末尾にセミコロンを使いませ
ん。
Subquery は、少なくとも 1 つのテーブルを参照する必要があります。WHERE 句に
テーブルを指定した場合、そのテーブルが subquery の他の部分から参照されてい
なければ、その指定はこの条件に当てはまりません。
比較演算子は、修飾子を使うかどうかにかかわりなく、subquery と一緒に使用する
ことができます。ただし、修飾子を使用しない場合、subquery が複数の値を返す
と、エラー条件が発生します。
Subquery が値を返さない場合で、なおかつ修飾子を使用しない場合は、比較の結果
が偽になります。したがって、以下の形式を使用した場合、subquery は、値を返さ
ないか(その場合は比較が偽と評価されます)、1 つの値を返すことになります。
expression > (subquery)
以下の形式の場合、subquery は、式リストで指定する数と同じ数の式を選択する必
要があります。
SQL 関数、演算子、式および述部
431
第 10 章 比較演算子と関数
TRUE の結果を生じる比較
(
,
expression
)
comparison_operator
ALL
ANY
SOME
( subquery )
それぞれの式が等しければ、2 つの式リストは等しいことになります。
それぞれの式が等しくない場合、比較の結果は、比較が真ではない式の最初のペア
(左から見て)を比較することによって判別されます。
比較操作での subquery で SELECT AND CONSUME 文を指定することはできません。
例: ALL 数量詞を使って 2 つの式を比較する
以下の文は、ALL 修飾子を使って、subquery から返される値を含む 2 つの式を比較
して、最高給の社員グループの中で勤続年数の最も多い社員を調べます。
SELECT EmpNo, Name, DeptNo, JobTitle, Salary, YrsExp
FROM Employee
WHERE (Salary,YrsExp) >= ALL
(SELECT Salary,YrsExp FROM Employee) ;
関連トピック
詳細は、以下を参照してください。
• 「サポートされる比較演算子」
• 「比較オペランドの暗黙の型変換」
• 「ANY/ALL/SOME 数量詞」
TRUE の結果を生じる比較
条件
以下の表は、比較が TRUE の結果を生じる場合の条件を示しています。
分かりやすくするために、次のような構文を想定します。
expression_1 — operator — expression_2
expression_1 および
expression_2 の r 番目の構成要素が expression_1r および expression_2r となるよう
に、expression_1 と expression_2 には、r で表わされる同じ数のスカラー値と、1
から n 行までの範囲が含まれている必要があります。
expression_1 の δ 番目の構成要素が expression_1δ、expression_2 の δ 番目の構
成要素が expression_2δ と表記されるように、範囲内の δ 番目の項目は行 δ と表
記されます。
432
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
TRUE の結果を生じる比較
expression_1 および expression_2 のデータ型には互換性がなければなりません。
式のデータ型が異なる場合、Teradata Database は一方の型から他方の型への暗黙の
変換を実行することがあります。
比較
TRUE になる条件
expression_1 =
expression_2
∀ r, expression_1r = expression_2r は TRUE
expression_1 <>
expression_2
∃ δ(expression_1δ <> expression_2δ は TRUE)
expression_1 <
expression_2
∃ δ(expression_1δ < expression_2δ は TRUE)、すべての
r < δ に対し、expression_1r = expression_2r は TRUE
expression_1 >
expression_2
∃ δ such that expression_1δ >expression_2δ is TRUE and
for all r > δ, expression_1r = expression_2r is TRUE.
expression_1 <=
expression_2
expression_1 < expression_2 は TRUE、または
expression_1 = expression_2 は TRUE
expression_1 =>
expression_2
expression_1 > expression_2 is TRUE or
expression_1 = expression_2 is TRUE.
NULL 式
比較におけるいずれかの式が null であると、比較の結果は不明です。
結果として NULL になる可能性のあるフィールドを比較する場合に比較で真の結果
を得るためには、その文で IS [NOT] NULL 演算子を使用しなければなりません。
浮動小数点値の式
浮動小数点値が関係する計算では、予想外の結果が出ることがあります。浮動小数
点値の計算を実行し、結果を予測値と比較すると、意図した結果にならない場合が
ほとんどです。
浮動小数点値の計算結果を比較する代わりに、エラーを参照して、結果が意図した
ものより大きいか小さいかを確認します。以下に例を示します。
SELECT i, SUM(a) as sum_a, SUM(b) as sum_b
FROM t1
GROUP BY i
HAVING ABS(sum_a - sum_b) > 1E-10;
関連トピック
詳細は、以下を参照してください。
SQL 関数、演算子、式および述部
433
第 10 章 比較演算子と関数
データ タイプの評価
• 比較操作での浮動小数点値に関連する潜在的な問題の詳細は、< SQL データ型と
リテラル、B035-1143>を参照してください。
• expression_1 および expression_2 の詳細については、比較オペランドの暗黙的
なタイプ変換を参照してください。
• 検索形式の CASE 式内の条件式での比較演算子の使用については、概要を参照し
てください。
• SELECT 文中の WHERE、ON、または HAVING 句内の条件式での比較演算子の使
用については、< SQL データ操作言語、B035-1146>の「 SELECT 文」を参照し
てください。
• ストアド プロシージャの IF、WHILE、または REPEAT 文中の条件式での比較演
算子の使用については、<SQL ストアード プロシージャと埋め込み SQL、
B035-1148>を参照してください。
• 以下を含む他の比較演算子の詳細:
• [NOT] EXISTS
• [NOT] IN
• LIKE
• IS [NOT] NULL
• [NOT] BETWEEN … AND …
概要を参照してください。
• 述部数量詞に関する詳細な情報:
• ALL
• ANY
• SOME
概要を参照してください。
データ タイプの評価
データ型が異なれば、等号と不等号の定義も異なります。次の表では、さまざまな
データ タイプを評価するときの基本について説明します。
データ型
評価方法
数値
代数学的に、負数は、その絶対値とは関係なくより小さいとみなされます。
バイト
左から右へとビットごとに評価されます。0 ビットは 1 ビットより小さくなり
ます。
• すべての対の比較が等しい場合、2 つのバイト列は等しいです。
• 対の比較がいずれも等しくない場合、その比較によって結果が判定されます。
• 長さが異なる 2 つのバイト列が比較される場合、長さが等しくなるように短
い方の文字列の右側に 2 進数のゼロが埋め込まれてから比較されます。
文字
434
左から右へと文字ごとに評価されます。正確な比較は割り当てられている照合
順序と、大文字と小文字を区別して比較するかどうかによって異なります。
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
比較オペランドの暗黙的なタイプ変換
データ型
評価方法
使用可能な照合は、次のとおりです。
• ASCII
• EBCDIC
• MULTINATIONAL
• CHARSET_COLL
• JIS_COLL
すべての対の比較が等しい場合、2 つの文字列は等しいです。
対の比較がいずれも等しくない場合、その比較によって結果が判定されます。
文字比較の詳細は、「文字列の比較」を参照してください。
日時
年代順。
タイムゾーンが時間の比較にどのように影響するかについては、「タイムゾー
ンの整列順序」を参照してください。
間隔
符号および絶対値に従います。
期間
例えば、p1 および p2 が期間式または派生 PERIOD だとすると、期間比較述部
の評価には次のロジックを使用します。
IF BEGIN(p1) = BEGIN(p2) is TRUE, return END(p1) operator END(p2)
ELSE return (BEGIN(p1) operator BEGIN(p2))
BEGIN および END の詳細については、概要を参照してください。
UDT
UDT の順序付け定義に従います。
Teradata Database は、ソース タイプが LOB でない DISTINCT 型 UDT の順序付
け機能を生成します。STRUCTURED 型 UDT またはソース タイプが LOB であ
る DISTINCT 型 UDT の順序付け定義を作成するときや、システム生成の順序付
け機能を置き換えるときは、CREATE ORDERING を使用します。
CREATE ORDERING の詳細は、<SQL データ定義言語 - 構文規則および例、
B035-1144>を参照してください。
比較オペランドの暗黙的なタイプ変換
式のオペランドは、比較が行なわれる前に、同じデータ タイプになっていなければ
なりません。
SQL 関数、演算子、式および述部
435
第 10 章 比較演算子と関数
比較オペランドの暗黙的なタイプ変換
暗黙変換の実行対象になるデータ タイプ
オペランドのデータ型が異なる場合には、次の表に従って暗黙の変換が Teradata
Database によって実行されます。暗黙変換は、ANSI SQL:2011 規格の Teradata 拡
張機能です。
文字データ タイプと数値データ タイプの比較では、文字フィールドを数値に変換で
きることが必要です。
式のオペランド
もう一方の式のオペランド
Teradata Database によるデータの比較
内容
文字
文字
文字
詳細については、「文字列の比較」を参照
してください。
DATE
Date
Teradata Database により、GRAPHIC サー
バー文字セットを使った文字データに対し
てエラーが返されます。
CHAR(k)
VARCHAR(k))
BYTEINT
SMALLINT
INTEGER
FLOAT
FLOAT
期間
期間
BIGINT
DECIMAL(m,n)
FLOAT
DECIMAL(m,n)
FLOAT
このとき、m <= 16
Teradata Database により、GRAPHIC サー
バー文字セットを使った文字データに対し
てエラーが返されます。
BIGINT
DECIMAL(m,n)
Teradata Database により、エラーが返さ
れます。
このとき、k <=
16
CHAR(k)
VARCHAR(k)
このとき、k > 16
Teradata Database により、GRAPHIC サー
バー文字セットを使った文字データに対し
てエラーが返されます。
Teradata Database により、GRAPHIC サー
バー文字セットを使った文字データに対し
てエラーが返されます。
このとき、m > 16
CHAR(k)
VARCHAR(k)
436
NUMBER および k <= 16
FLOAT
Teradata Database により、GRAPHIC サー
バー文字セットを使った文字データに対し
てエラーが返されます。
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
比較オペランドの暗黙的なタイプ変換
式のオペランド
もう一方の式のオペランド
Teradata Database によるデータの比較
内容
NUMBER および k > 16
Teradata Database により、エラーが返さ
れます。
BYTEINT
SMALLINT
SMALLINT
BYTEINT
SMALLINT
INTEGER
INTEGER
BYTEINT
SMALLINT
INTEGER
BIGINT
BIGINT
BIGINT
BYTEINT
DECIMAL(m,n)
DECIMAL(18,n)
m <= 18 および m-n >= 3
SMALLINT
DECIMAL(m,n)
m <= 18 および m-n >= 5
INTEGER
DECIMAL(m,n)
DATE
m <= 18 および m-n >= 10
BYTEINT
DECIMAL(m,n)
DECIMAL(38,n)
m > 18 または m-n < 3
SMALLINT
DECIMAL(m,n)
m > 18 または m-n < 5
INTEGER
DECIMAL(m,n)
DATE
m > 18 または m-n < 10
BIGINT
DECIMAL(m,n)
DECIMAL(m,n)
DECIMAL(k,j)
DECIMAL(18,max(j,n))
max(m-n,k-j) + max(j,n) <= 18
DECIMAL(k,j)
DECIMAL(38,max(j,n))
max(m-n,k-j) + max(j,n) > 18
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(m,n)
NUMBER(m,n)
SQL 関数、演算子、式および述部
NUMBER(k,j)
NUMBER(k)
NUMBER(*,j)
NUMBER
NUMBER
437
第 10 章 比較演算子と関数
比較オペランドの暗黙的なタイプ変換
式のオペランド
もう一方の式のオペランド
Teradata Database によるデータの比較
内容
BYTEINT
SMALLINT
INTEGER
INTEGER
BIGINT
BIGINT
FLOAT
FLOAT
FLOAT
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(m,n)
NUMBER(m,n)
NUMBER(m)
NUMBER(*,n)
NUMBER
FLOAT
期間
文字
期間
NUMBER(m)
NUMBER(*,n)
NUMBER
DATE
日時タイプの暗黙の変換
異なる日時オペランドが関与する比較では、Teradata Database は次のテーブルに
従って暗黙的変換を行ないます。
式のオペランド
もう一方の式のオペラ
ンド
Teradata Database によるデータの比較内容
TIMESTAMP
DATE
DATE
TIMESTAMP WITH ANSIDate 日付形式モー 「TIMESTAMP から DATE への暗黙的変換」を参照してください。
ドまたは IntegerDate 日
TIME ZONE
付形式モード
間隔
INTERVAL タイプ
はフィールドが 1
つだけ必要です(た
とえば、INTERVAL
YEAR)。
438
絶対数値
数値。
「INTERVAL から数値への暗黙的変換」を参照してください。
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
USING 句内の ANSI の DateTime と Interval の比較
暗黙変換の実行対象にならないデータ タイプ
次の表に、Teradata Database によって暗黙的な型変換が実行されないデータ型を示
します。
タイプ
規則
バイト
バイト データ タイプは、バイト データ タイプとのみ比較できます。バ
イト タイプと別のタイプを比較しようとすると、エラーが発生します。
日時
Teradata Database は、DateTime データ型と INTERVAL データ型の組み
合わせを使用した比較演算のオペランドに対し、暗黙の型変換は実行し
ません。詳細については、データ タイプの互換性および USING 句内の
ANSI の DateTime と Interval の比較を参照してください。
間隔
TIME
TIMESTAMP
UDT
Teradata Database は、比較演算での TIME から TIMESTAMP へ、また
TIMESTAMP から TIME への暗黙の型変換を実行しません。
Teradata Database は、比較演算での UDT に対しては暗黙の型変換を実行
しません。UDT 値は、同じ UDT 型の別の値としか比較できないからです。
UDT を他のデータ タイプと比較するには、明示的なデータ タイプ変換を
使用する必要があります。詳細は、概要を参照してください。
USING 句内の ANSI の DateTime と Interval の比較
ANSI の日時および間隔データの外部値は、セッション用に指定されているクライア
ント文字セットの固定長の文字列で表わされます。
USING 句を使って ANSI の日時および間隔の値をインポートする場合、外部文字書
式から、比較に適した ANSI 日時および間隔タイプに明示的に CAST する必要があ
ります。
たとえば、次のような文を考慮してみます。TimeField 列のデータ タイプは TIME(2)
です。
USING (TimeVal CHARACTER(11), NumVal INTEGER)
UPDATE TABLE_1
SET TimeField=:TimeVal, NumField=:NumVal
WHERE CAST(:TimeVal AS TIME(2)) > TimeField;
割り当てのためにこの USING 句で TimeVal CHAR(11)を直接使用してもかまいませ
んが、TimeField は TIME(2)と定義されている ANSI TIME であるために、テーブル
内のフィールド値 TimeField を比較するには、列データ定義を明示的に TIME(2)に
CAST する必要があります。
SQL 関数、演算子、式および述部
439
第 10 章 比較演算子と関数
比較における DATE タイプの正しい形式
比較における DATE タイプの正しい形式
正しい比較を実行するには、DATE オペランドを正しい形式で指定する必要がありま
す。
作成される日付が有効な日付でない場合、DATE オペランドによる計算はエラーを出
します。したがって、比較の目的で日付値を整数形式で指定することがあるとして
も、日付データが入っている列は、INTEGER ではなく、DATE データ タイプとして
定義する必要があります。
DATE への入力として整数を使用した場合(この方法はお勧めしません)、2000 年の
最初の日付の入力は、1000101 となります。
詳細は、Teradata の日付および時刻の式を参照してください。
DATE オペランドを実行するための正しい形式は、以下のとおりです。
• 整数は、「(年-1900)*10000 + 月*100 + 日」という形式にします。YYMMDD 形
式は、1900 年~1999 年の間にのみ有効です。2000 年~2099 年については、
1YYMMDD という形式になります。
• 比較対象の日付または割り当てが実行される日付フィールドと同じ形式の文字列。
• 適切なデータ変換を定義するデータ タイプ句と、書式を定義する FORMAT 句で
修飾した文字列。
• どんな日付書式による日付比較でも常に有効な ANSI 日付定数。
例
以下の例では、Employee.DOB 列(DATE FORMAT 'MMMbDDbYYYY'として定義)の値
に対して比較演算子を使用し、DATE オペランドの正しい形式を示します。
例 1: オペランドを整数として入力する
最初の例では、オペランドを整数として入力します。
SELECT *
FROM Employee
WHERE DOB = 420327 ;
例 2: DOB 列フォーマットと一致した形式での文字列の入力
2 番目の例では、DOB 列の書式と一致した形式で文字列を入力します。
SELECT *
FROM Employee
WHERE DOB = 'Mar 27 1942';
例 3: 文字列をデータ型および FORMAT 句とともに入力する
3 番目の例では、文字列として値を入力し、データ タイプ句(DATE)と FORMAT 句の
両方と一緒にキャストします。
440
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
文字列の比較
SELECT *
FROM Employee
WHERE DOB = CAST ('03/27/42' AS DATE FORMAT 'MM/DD/YY');
例 4: 値を ANSI データ リテラルとして入力する
4 番目の例では、列の日付形式が何であっても正しく動作する ANSI 日付定数とし
て値を入力します。
SELECT *
FROM Employee
WHERE DOB = DATE '1942-03-27';
文字列の比較
長さが等しくない文字列の比較
長さが等しくない文字列が比較される場合、比較の前に、短い方の文字列の右側に
埋め込み文字が埋められます。
文字列およびサーバー文字セット
文字列を比較するときには、データ文字のサーバー文字セットが同じでなければな
りません。そうでない場合は、文字から文字への暗黙的な変換で説明されている暗
黙変換規則を使って、システムが変換を行ないます 。
照合が文字列比較に与える影響
照合は文字の順序付けを制御します。文字の比較の結果は、使用している文字セッ
トの照合順序によって異なります。
デフォルトの照合を、セッションの文字セットと互換性のある順序に設定すること
ができます。現行セッションの照合の設定値を調べるには、HELP SESSION SQL 文
を使用してください。
発音符または日本語文字セットの可用性、およびデフォルトの照合順は、データベー
ス管理者の制御下にあります。
文字データの整列と比較を、クライアントが実行した操作と同じように動作させる
ためには、日本語文字サイトのユーザーは、照合を CHARSET_COLL に設定しなけ
ればなりません。
大文字小文字の区別
Teradata SQL 文の実行時にアクセスされたすべての文字データ (CLOB を除く) に
は、デフォルトによって、または明示的に指定することによって、CASESPECIFIC
SQL 関数、演算子、式および述部
441
第 10 章 比較演算子と関数
文字列の比較
または NOT CASESPECIFIC の属性が与えられます。文字列の比較では、この属性に
よって大文字と小文字を区別して比較を行なうかどうかを決定します。CLOB には大
文字小文字の区別が適用されません。
この属性は、ANSI SQL:2011 互換ではありません。ANSI では、すべての文字比較が
CASESPECIFIC と同等に行なわれます。
CASESPECIFIC 属性は、NOT CASESPECIFC に優先します。
条件
比較
どちらかの引数が CASESPECIFIC の場合
英大文字/英小文字を区別して行なわれます。
両方の引数が NOT CASESPECIFIC の場合
大文字小文字の区別なし
例外は GRAPHIC 文字データで、この場合は常に CASESPECIFIC になります。
次の方法で大文字小文字の区別の属性を文字列に適用します。
• セッション用のデフォルトの大文字小文字の区別を使用する。
セッション モード
大文字小文字の区別のデフォルト
ANSI
CASESPECIFIC
TERADATA
NOT CASESPECIFIC
例外は GRAPHIC 型の文字データで、この場合は必ず
CASESPECIFIC になります。
大文字小文字の区別のデフォルトは、リテラルを含め、すべての文字データに適
用されます。
• CREATE TABLE または ALTER TABLE 文で、文字の列に CASESPECIFIC または
NOT CASESPECIFIC 句を使用する。
以下に例を示します。
CREATE TABLE Students
(StudentID INTEGER
,Firstname CHAR(10) CASESPECIFIC
,Lastname CHAR(20) NOT CASESPECIFIC);
テーブルの列では、列が定義または変更されたときに、割り当てられた属性が伝
達されます。 ただし、アクセスにおいて CASESPECIFIC または NOT
CASESPECIFIC 句が使用される場合は異なります。
• 比較で、CASESPECIFIC または NOT CASESPECIFIC 句を文字式に適用する。
たとえば、次の文では CASESPECIFIC 句を文字リテラルに適用します。
SELECT *
FROM Students
WHERE Firstname = 'Ike' (CASESPECIFIC);
442
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
文字列の比較
この方法は、文字データの大文字小文字の区別のデフォルトをオーバーライドす
る場合、あるいは文字の列が定義または変更されたときに割り当てられた大文字
小文字の区別属性をオーバーライドする場合に使用します。
大文字小文字を区別しない比較では、英小文字の 1 バイトのローマ字は英大文字に
変換されてから、比較が始まります。作成された文字列はバイトごとに比較され、
後ろに付けられた埋め込み文字は無視されます。
大文字小文字を区別しない比較では、小文字と大文字のキリル文字、ギリシャ文字、
および全角の ASCII 文字は常に同等とみなされます。小文字と大文字のキリル文字、
ギリシャ文字、および全角の ASCII 文字を区別するためには、明示的に
CASESPECIFIC の比較を宣言しなければなりません。
これらのオプションは KANJISJIS 文字セットに対して機能します。その際、そのデー
タがまず UNICODE 型に変換され、次いでオプションが適用されるかのように扱わ
れます。
大文字小文字を区別しない比較における UPPER の使用
UPPER 関数を使用して文字列の値に小文字の Latin 文字が含まれないようにするこ
とにより、大文字小文字を区別しない比較を行なうことができます。
UPPER 関数は、UPPERCASE 値を宣言することと同じではありません。
例: 大文字小文字が区別される名前の問合わせ
次の問合わせについて説明します。
SELECT *
FROM STUDENTS
WHERE Firstname = 'George';
この後のテーブルでは、さまざまな大文字/小文字区別属性やセッション モードに
おける比較 Firstname = 'George'の動作について説明します。
列 Firstname の 結果
属性
CASESPECIFIC
• セッション モードが ANSI である場合、「George」は CASESPECIFIC
となり、Firstname に「George」が含まれる行と一致する。
• セッション モードが Teradata である場合、「George」は NOT
CASESPECIFIC となり、Firstname に「George」が含まれる行と一致
する。
どちらかの文字列が CASESPECIFIC の場合、比較は大文字小文字を区別し
て行なわれる。
SQL 関数、演算子、式および述部
443
第 10 章 比較演算子と関数
KANJI1 文字の比較
列 Firstname の 結果
属性
NOT
CASESPECIFIC
• セッション モードが ANSI である場合、「George」は CASESPECIFIC
となり、Firstname に「George」が含まれる行と一致する。どちらか
の文字列が CASESPECIFIC の場合、比較は大文字小文字を区別して行
なわれる。
• セッション モードが Teradata である場合、「George」は NOT
CASESPECIFIC となり、「george」、「GEORGE」、「George」など
大文字と小文字を任意に組み合わせた George という名前が Firstname
に含まれる行と一致する。両方の文字列が NOT CASESPECIFIC の場
合、比較は大文字小文字を区別しないで行なわれる。
関連トピック
詳細は、以下を参照してください。
• <SQL データ定義言語 - 構文規則および例、B035-1144>の「SET SESSION
COLLATION」
• 国際文字セットのサポート、B035-1125
• < SQL データ操作言語、B035-1146>の「ORDER BY 句」
KANJI1 文字の比較
次の節では、Teradata Database による KANJI1 文字の比較方法について説明します。
注記: Teradata の国際化計画に従って、KANJI1 のサポートはサポート外になりました。この
サポートは、近い将来に廃止される予定です。KANJI1 はデフォルトの文字セットとし
て許可されません。システムはデフォルトの KANJI1 文字セットを UNICODE 文字セッ
トに変更します。KANJI1 の新規オブジェクトの作成は、高度に制限されています。
KANJI1 を使用する問合わせやアプリケーションの多くは、従来通り動作しますが、
KANJI1 を使用するサイトはできるだけ早く別の文字セットに変換する必要があります。
詳細については、<国際文字セットのサポート、B035-1125>の KANJI1 文字セットを参
照してください。
等価比較
文字列の比較には、1 バイト文字とマルチバイト文字が混在したデータが含まれて
いてもかまいません。次のように処理されます。
• expression_1 と expression_2 のサーバー文字セットが異なる場合、それらは同
じ型に変換されます。詳細については、「文字から文字への暗黙変換」を参照し
てください。
• expression_1 と expression_2 の長さが異なる場合には、同じ長さになるよう、
短い方の文字列に埋め込み文字が埋め込まれます。
444
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
KANJI1 文字の比較
• セッション モードが識別されます。
適用される
モード
文字列の大文字小文字の区別のデフォルト
ANSI
CASESPECIFIC
TERADATA
NOT CASESPECIFIC
式の一方または両方に CASESPECIFIC 句を指定していない限り、
expression_1 および expression_2 の単純なローマ字は、比較の開始に
先立って英大文字に変換されます。
文字式の大文字小文字の区別のデフォルトをオーバーライドするには、
CASESPECIFIC または NOT CASESPECIFIC 句を適用します。
• 大文字小文字の区別が判別されます。
条件
比較
どちらかの引数が CASESPECIFIC の場合
英大文字/英小文字を区別して行なわれま
す。
両方の引数が NOT CASESPECIFIC の場合
大文字小文字の区別なし
• 末尾の埋め込み文字は無視されます。
不等価比較
不等価比較は、次のように処理されます。
1 expression_1 と expression_2 の長さが異なる場合には、同じ長さになるよう、
短い方の文字列に埋め込み文字が埋め込まれます。
2 セッション モードが識別されます。
適用される
モード
文字列の大文字小文字の区別のデフォルト
ANSI
CASESPECIFIC
TERADATA
NOT CASESPECIFIC
式の一方または両方に CASESPECIFIC 修飾子を指定していない限り、
expression_1 および expression_2 の単純なローマ字は、比較の開始に
先立って英大文字に変換されます。
文字式の大文字小文字の区別のデフォルトをオーバーライドするには、
CASESPECIFIC または NOT CASESPECIFIC 句を適用します。
3 現在の文字セット下で 1 バイト文字として識別されている文字は、セッション
で有効な照合順序に従って変換されます。
SQL 関数、演算子、式および述部
445
第 10 章 比較演算子と関数
述部における比較演算子と DEFAULT 関数
4 KanjiEUC 文字セット下の場合、ss3 の 0x8F 文字は、0xFF に変換されることに
注意する必要があります。これは、ユーザー定義の KanjiEUC コードセット 3 は、
他の KanjiEUC コードセットのように正しく整列されないことを意味します。
他の KanjiEUC コードセットでは、整列が正しく行なわれます。 つまり、整列
は、クライアント システムでの 2 進数の整列の場合と同じ順序になります。
5 作成された文字列はバイトごとに比較され、後ろに付けられた埋め込み文字は無
視されます。
不等価比較には、そのセッションで有効な照合が使用されます。使用可能な照合は、
5 つあります。
•
•
•
•
•
EBCDIC
ASCII
MULTINATIONAL
CHARSET_COLL
JIS_COLL
CREATE USER 文または MODIFY USER 文の COLLATION オプションを使用すれば、
照合をユーザー レベルで設定することができます。 また、[[.]SET]SESSION
COLLATION 文または CLIv2 CHARSET 呼出しを使用すれば、セッション レベルで設
定することができます。
MULTINATIONAL 照合順序が有効な場合には、日本語文字を使用するサイトでの照
合順序は、開始時に導入された照合の設定によって決定されます。
関連トピック
照合順序についての詳細は、<国際文字セットのサポート、B035-1125>を参照して
ください。
述部における比較演算子と DEFAULT 関数
DEFAULT 関数は、列のデフォルト値を返します。これには、 列名を指定する形式
と、列名を省略する形式があります。
比較演算子を使用した述部は、両方の形式の DEFAULT 関数をサポートしています
が、DEFAULT 関数が列名を省略した場合は、次の条件が TRUE になります。
• 比較には、単一の列参照のみを含めることができる。
• DEFAUL 関数は、式の一部にはできない。
たとえば、次の文は DEFAULT 関数を使用して Dept_No 列の値と Dept_No 列のデ
フォルト値を比較しています。比較操作には、単一の列参照が含まれるため、列名
が省略されていても、Teradata Database は DEFAULT 関数の列の文脈を派生できま
す。
SELECT * FROM Employee WHERE Dept_No < DEFAULT;
446
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
DECODE
DEFAULT 関数が NULL と評価されると、述部は不明になり、WHERE 条件は FALSE
になります。
DECODE
目的
expr と各 search パラメータを比較します。このパラメータは、それに対応する結
果パラメータを持ちます。
構文
10
DECODE
( exp ,
search , result ,
default )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expr
数値または文字式。
• expr が search 引数のいずれかと等しい場合、この関数はそれに対応する result
値を返します。
• expr が search 引数のいずれとも等しくならない場合、この関数は default を返
します(デフォルト値が指定されている場合)。
• expr が NULL の場合、この関数は NULL である最初の検索パラメータの結果を
返します。
search
数値または文字式。
DECODE は、1~10 個までの search 引数をサポートします。この引数には、同じ
数の結果引数が関連付けられます。
result
数値または文字式。
DECODE は、1~10 個までの結果引数をサポートします。この引数には、同じ数の
search 引数が関連付けられます。
default
数値または文字式。
default が指定されていないときに一致がない場合、この関数は NULL を返します。
SQL 関数、演算子、式および述部
447
第 10 章 比較演算子と関数
DECODE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
DECODE は埋め込みサービス システム関数です。埋め込みサービス関数の有効化と
呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡される式は、次のいずれかのデータ タイプでなければなりません。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、NUMBER、CHAR、VARCHAR
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
DECODE は、関数に渡された結果パラメータに関連付けられたデータ タイプによっ
て戻り値のデータ タイプが異なるスカラー関数です。
• 結果または default が数値タイプの場合、DECODE は最も高い精度を持つ引数を
特定し、その他の結果または default 引数をそのデータ型に変換して、そのデー
タ型を返します。
そのデータ タイプが DECIMAL/NUMERIC であり、結果または default の引数の
精度とスケールが異なる場合、戻りタイプの精度とスケールは最大精度になるよ
うに設定されます。
例えば、結果/default 引数が DECIMAL(6,3)、DECIMAL(7,4)、および
DECIMAL(8,7)の場合、精度の低下を避けるために、戻りタイプは小数点の左が 3
桁、右が 7 桁必要になります。この場合、返されるデータ タイプは
DECIMAL(10,7)に設定されます。
最大精度を維持できない場合、データは DBS 制御の RoundHalfWayMagUp フィー
ルドに基づいて丸められます。例えば、結果および default 引数が DECIMAL(32,
8)と DECIMAL(30, 28)の場合、戻りタイプは DECIMAL(38,14)になります。これ
により、DECIMAL(32, 8)に必要な小数点の左側の 24 桁と、小数点の右側の 14
桁を用意します。DECIMAL(30,28)の結果または default 引数が最大値だとする
と、その値は小数点から右側の 14 桁目で丸められます。
448
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
DECODE
データ タイプが固定小数点数の NUMBER で精度が 38 以下の場合、戻りタイプ
の精度とスケールは、DECIMAL/NUMERIC と同じメソッドを使用して計算され
ます。ただし、精度が 38 より大きい場合は、精度の低下を避けるために戻りタ
イプを NUMBER(*)に変更します。データ タイプが浮動小数点の NUMBER の場
合、戻りタイプは NUMBER(*)になります。
• 結果または default が文字データ タイプの場合、この関数は最初の result 引数の
文字セットで VARCHAR を返します。
例
例: ID のデコード
以下の問合わせを実行します。
SELECT DECODE(country_id, 1, 'United States',
2, 'England',
3, 'France',
'United States')
FROM customers;
次の結果が得られます。
•
•
•
•
country_id が 1 の場合、'United States'
country_id が 2 の場合、'England'
country_id が 3 の場合、'France'
country_id が 1、2、または 3 と等しくない場合、'United States'
例: NULL を使った ID のデコード
以下の問合わせを実行します。
SELECT DECODE(country_id, 1, 'United States',
2, 'England')
FROM customers;
次の結果が得られます。
• country_id が 1 の場合、'United States'
• country_id が 2 の場合、'England'
• country_id が 1~2 の範囲にない場合、NULL
例: ID が 1、2、または NULL に等しくない場合の ID のデコード
以下の問合わせを実行します。
SELECT DECODE(country_id, 1, 'United States',
2, 'England',
NULL, 'France')
FROM customers;
SQL 関数、演算子、式および述部
449
第 10 章 比較演算子と関数
GREATEST
次の結果が得られます。
•
•
•
•
country_id が 1 の場合、'United States'
country_id が 2 の場合、'England'
country_id が NULL の場合、NULL
country_id が 1、2、または NULL と等しくない場合、NULL
関連トピック
詳細は、以下を参照してください。
• 優先順位の順序の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「互換データ型」を参照してください。
• DOUBLE PRECISION のデフォルトのデータ タイプ書式については、< SQL データ
型とリテラル、B035-1143>を参照してください。
GREATEST
目的
入力引数のリストの最大値を返します。
構文
,
GREATEST
TD_SYSFNLIB.
10
( numeric_value )
,
10
( string_value )
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
数値式。
string_value
文字列の値。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
450
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
GREATEST
呼出し
GREATEST は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、NUMBER、CHAR、または VARCHAR
すべての入力引数は同じデータ タイプか、あるいはタイプに互換性がなければなり
ません。
結果のタイプ
入力引数が数値タイプの場合、関数は最も優先順位が高い引数を決定し、そのデー
タ タイプに他の引数を変換して、そのデータ タイプを返します。
そのデータ タイプが DECIMAL/NUMERIC であり、入力引数の精度とスケールが異
なる場合、戻りタイプの精度とスケールは最大精度になるように設定されます。た
とえば、入力引数が DECIMAL(6,3)、DECIMAL(7,4)、および DECIMAL(8,7)の場合、
精度の低下を避けるために、戻りタイプは小数点の左が 3 桁、右が 7 桁必要になり
ます。この場合、返されるデータ タイプは DECIMAL(10,7)に設定されます。
最大精度を維持できない場合、データは DBS 制御レコードの RoundHalfWayMagUp
フィールドに基づいて丸められます。たとえば、入力引数が DECIMAL(32, 8)と
DECIMAL(30, 28)の場合、戻りタイプは DECIMAL(38,14)になります。これにより、
小数点の左側の 24 桁(DECIMAL(32,8)の引数に必要)と、小数点の右側の 14 桁が用
意されます。DECIMAL(30,28)の入力引数が最大値だとすると、その値は小数点か
ら右側の 14 桁目で丸められます。
データ タイプが固定小数点数の NUMBER で精度が 38 以下の場合、戻りタイプの
精度とスケールは、DECIMAL/NUMERIC と同じメソッドを使用して計算されます。
ただし、精度が 38 より大きい場合は、精度の低下を避けるために戻りタイプを
NUMBER(*)に変更します。データ タイプが浮動小数点の NUMBER の場合、戻りタ
イプは NUMBER(*)になります。
入力引数が文字タイプの場合、この関数は 2 番目から 10 番目までの引数を最初の
引数のデータ タイプに変換して、それを最初の引数の文字セットで VARCHAR とし
てタイプを返します。
使用上の注意
引数が文字タイプの場合、文字列の比較に非埋め込み比較セマンティクスが使用さ
れます。文字の比較はその文字の数値コードに基づいてバイナリで実行されます。
SQL 関数、演算子、式および述部
451
第 10 章 比較演算子と関数
LEAST
文字列は、文字ごとに比較するのではなく、比較の際にはバイトの並びとして扱わ
れます。
いずれかの入力引数が NULL の場合、この関数は NULL を返します。
例
例 1: 入力引数のリストの最大値の問合わせ
以下の問合わせは結果として 13 を返します。
SELECT GREATEST(13, 6);
例 2: 特定のデータ型での GREATEST の問合わせ
次の問合わせでは、入力引数のデータ タイプが DECIMAL(4,2)と DECIMAL(5,4)の場
合、返されるデータ タイプは DECIMAL(6,4)になり、結果値は 13.1200 になります。
SELECT GREATEST(13.12, 6.1234);
例 3: GREATEST の問合わせ
以下の問合わせは結果として'apples'を返します。
SELECT GREATEST('apples', 'alpha');
関連トピック
詳細は、以下を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
• デフォルトのデータ タイプ書式については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• 優先順位の順序の詳細については、SQL 外部ルーチン プログラミング、B035-1147
の「互換データ型」を参照してください。
LEAST
目的
numeric_values または string_values のリストから、最小値を返します。
構文
,
LEAST
TD_SYSFNLIB.
10
( numeric_value )
,
10
( string_value )
452
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
LEAST
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
数値式。
LEAST は 1~10 の数値をサポートします。
最初の引数データ型が numeric_value の場合、返されるデータ型は数値になります。
入力リスト内の残りの引数は、それと同じ型か互換型になります。どちらかの入力
パラメータが NULL の場合は NULL が返されます。
string_value
文字の引数。
LEAST は 1~10 の文字列の値をサポートします。
最初の引数のデータ タイプが string_value の場合、返されるデータ タイプは文字
列になります。
文字列の比較には、非埋め込み比較セマンティクスが使用されます。文字の比較は
文字の数値コードに基づいてバイナリで実行されます。また、文字列は、文字ごと
に比較するのではなく、比較の際にはバイトの並びとして扱われます。
入力リスト内の残りの引数は、それと同じ型か互換型になります。どちらかの入力
パラメータが NULL の場合は NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
LEAST は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_value = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• string_value = CHAR または VARCHAR
SQL 関数、演算子、式および述部
453
第 10 章 比較演算子と関数
LEAST
結果のタイプ
LEAST は、関数に渡された numeric_value または string_value に関連付けられたデー
タ タイプによって戻り値のデータ タイプが異なるスカラー関数です。
• numeric_value が数値データ型の場合、LEAST は最も優先順位が高い引数を決定
し、そのデータ型に他の引数を変換して、そのデータ型を返します。
そのデータ タイプが DECIMAL/NUMERIC であり、入力引数の精度とスケールが
異なる場合、返されるデータ タイプの精度とスケールは最大精度になるように設
定されます。たとえば、入力引数が DECIMAL(6,3)、DECIMAL(7,4)、および
DECIMAL(8,7)の場合、精度の低下を避けるために、返されるデータ タイプは小
数点の左が 3 桁、右が 7 桁必要になります。この場合、返されるデータ タイプ
は DECIMAL(10,7)に設定されます。
最大精度を維持できない場合、データは DBS 制御レコードの
RoundHalfWayMagUp フィールドに基づいて丸められます。たとえば、入力引数
が DECIMAL(32, 8)と DECIMAL(30, 28)の場合、返されるデータ タイプは
DECIMAL(38,14)になります。これにより、小数点の左側の 24 桁(DECIMAL(32,8)
のパラメータに必要)と、小数点の右側の 14 桁が用意されます。DECIMAL(30,28)
の入力引数が最小値だとすると、その値は小数点から右側の 14 桁目で丸められ
ます。
データ タイプが固定小数点数の NUMBER で精度が 38 以下の場合、戻りタイプ
の精度とスケールは、DECIMAL/NUMERIC と同じメソッドを使用して計算されま
す。ただし、精度が 38 より大きい場合は、精度の低下を避けるために戻りタイ
プを NUMBER(*)に変更します。データ タイプが浮動小数点の NUMBER の場合、
戻りタイプは NUMBER(*)になります。
• string_value が文字データ タイプの場合、LEAST は 2 番目から 10 番目までの引
数を、最初の引数のデータ タイプに変換して、それを最初の引数の文字セットで
VARCHAR としての値を返します。
例
例 1: LEAST の問合わせ
以下の問合わせは 6 を返します。
SELECT LEAST(13, 6);
例 2: 特定のデータ型での LEAST の問合わせ
次の問合わせでは、入力引数のデータ タイプが DECIMAL(5,4)と DECIMAL(4,2)の場
合、返されるデータ タイプは DECIMAL(6,4)になり、戻り値は 1.1234 になります。
SELECT LEAST(1.1234, 36.12);
例 3: LEAST アルファベットの問合わせ
以下の問合わせは'alpha'を返します。
454
SQL 関数、演算子、式および述部
第 10 章 比較演算子と関数
LEAST
SELECT LEAST('apples', 'alpha');
関連トピック
詳細は、以下を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
• 優先順位の順序の詳細については、<SQL 外部ルーチン プログラミング、
B035-1147>の「互換データ型」を参照してください。
SQL 関数、演算子、式および述部
455
第 10 章 比較演算子と関数
LEAST
456
SQL 関数、演算子、式および述部
第 11 章
圧縮関数/圧縮解除関数
概要
この章では、文字またはバイト タイプの列データを圧縮および圧縮解除するため
に、アルゴリズム圧縮(ALC)と連携して使用可能な関数について説明します。データ
の圧縮により、領域の使用率とディスク入出力のサイズを減らします。
この章で説明する圧縮関数と圧縮解除関数が、使用目的に適っていない場合は、テー
ブルの列を圧縮または圧縮解除する独自のユーザー定義関数(UDF)を作成してくだ
さい。
注: ALC をブロック レベル圧縮(BLC)と一緒に使用するとパフォーマンスが低下する
ことがあるため、この方法はお勧めしません。
前提条件
この章で取り上げる関数は、埋め込みサービス システム関数です 。埋め込みサービ
ス関数の有効化と呼び出しについて、詳細は「埋め込みサービス システム関数」を
参照してください。
詳細情報
参照先
ALC
• <SQL データ定義言語 - 構文規則および例、
B035-1144>の「COMPRESS 句と
DECOMPRESS 句」および「CREATE TABLE」 。
ALC 用 UDF の作成
• <SQL 外部ルーチン プログラミング 、
B035-1147>の「アルゴリズム圧縮に対応した関
数の定義」。
Teradata Database でサポートされる圧 • <データベース設計 、B035-1094>の「データの
縮方式、およびさまざまな圧縮方式の
圧縮の使用」。
比較
• <データベース設計、B035-1094>の付録「圧縮
方法」。
SQL 関数、演算子、式および述部
457
第 11 章 圧縮関数/圧縮解除関数
CAMSET
CAMSET
目的
指定した Unicode 文字データを専用の Teradata アルゴリズムを使用して、以下の可
能な値に圧縮します。
• 部分バイトの値(たとえば、4 ビットの数字、または 5 ビットの英文字)
• 1 バイトの値(たとえば、上記と Latin 文字)
• 2 バイトの値(たとえば、上記と Unicode 文字)
構文
CAMSET (Unicode_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
Unicode_string
Unicode の文字列または列式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ型が VARCHAR(n) CHARACTER SET UNICODE の式を渡さなけ
ればなりません。この(n)の最大対応サイズは 32000 です。UDF に適用される暗黙
のデータ型変換規則を使用して VARCHAR(32000) CHARACTER SET UNICODE に変
換できる、データ型の引数も渡すことができます。たとえば、CAMSET(CHAR)は可
能です。暗黙的に CAMSET(VARCHAR)に変換できるからです。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って VARCHAR に変換で
きない引数は、明示的にキャストする必要があります。
この関数への入力は Unicode 文字データでなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
458
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
CAMSET
結果のタイプ
結果のデータ型は VARBYTE(64000)になります。
使用上の注意
Unicode 文字データを格納する場合、圧縮解除された Teradata Database 内の文字
データには 1 文字ごとに 2 バイトが必要になります。CAMSET は Unicode 文字の入
力を受け取り、それを部分バイト、1 バイトまたは 2 バイトの値に圧縮し、圧縮し
た結果を返します。
CAMSET は、次に示す内容の中程度以下の長さの Unicode 文字列に対して最良の結
果が得られます。
• 主に英数文字が含まれる。
• 以下に示す組み合わせの切り替えが頻繁に発生しない。
• 大文字と小文字。
• 数字と文字。
• Latin 文字と非 Latin 文字。
この関数を直接呼び出すこともできますが、通常、CAMSET はアルゴリズム圧縮
(ALC)を使用してテーブルの列を圧縮します。CAMSET を ALC で使用すると、列が
NULL 受入可能ならば NULL も圧縮されます。
制約事項
CAMSET は現在、U+0000~U+00FF の Unicode 文字のみを圧縮します。
CAMSET で圧縮されたデータの圧縮解除
CAMSET を使用して圧縮された Unicode データを圧縮解除するには、DECAMSET
関数を使用します。
例
例: UNICODE 値の圧縮
この例では、ALC で CAMSET 関数を使用して、Description 列の Unicode 値を圧縮
します。DECAMSET 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET UNICODE,
Description VARCHAR(1000) CHARACTER SET UNICODE
COMPRESS USING TD_SYSFNLIB.CAMSET
DECOMPRESS USING TD_SYSFNLIB.DECAMSET);
SQL 関数、演算子、式および述部
459
第 11 章 圧縮関数/圧縮解除関数
CAMSET_L
例: 圧縮値の問合わせ
次のテーブル定義があるとします。
CREATE TABLE Pendants
(ItemNo INTEGER,
Description VARCHAR(100) CHARACTER SET UNICODE);
次の問合わせは Description 列の圧縮された値を返します。
SELECT TD_SYSFNLIB.CAMSET(Pendants.Description);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング 、B035-1147>の「互換データ型」を参照してください。
• DECAMSET 関数について、詳細は DECAMSET を参照してください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
CAMSET_L
目的
指定した Latin 文字データを専用の Teradata アルゴリズムを使用して、以下の可能
な値に圧縮します。
• 部分バイトの値(たとえば、4 ビットの数字、または 5 ビットの英文字)
• 1 バイトの値(たとえば、上記と Latin 文字)
構文
CAMSET_L (Latin_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
460
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
CAMSET_L
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
Latin_string
Latin の文字列または列式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ型が VARCHAR(n) CHARACTER SET LATIN の式を渡さなけれ
ばなりません。この(n)の最大対応サイズは 64000 です。UDF に適用される暗黙の
データ型変換規則を使用して VARCHAR(64000) CHARACTER SET LATIN に変換で
きる、データ型の引数も渡すことができます。たとえば、CAMSET_L(CHAR)は可能
です。暗黙的に CAMSET_L(VARCHAR)に変換できるからです。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って VARCHAR に変換で
きない引数は、明示的にキャストする必要があります。
この関数への入力は Latin 文字データでなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ型は VARBYTE(64000)になります。
使用上の注意
Latin 文字データを格納する場合、圧縮解除された Teradata Database 内の文字デー
タには 1 文字ごとに 1 バイトが必要になります。CAMSET_L は、Latin 文字の入力
を受け取り、それを部分バイト、1 バイトの値に圧縮し、圧縮された結果を返します。
CAMSET_L は、次に示す内容の中程度以下の長さの Latin 文字列に対して最高の結
果が得られます。
• 主に英数文字が含まれる。
• 以下に示す組み合わせの切り替えが頻繁に発生しない。
• 大文字と小文字。
• 数字と文字。
SQL 関数、演算子、式および述部
461
第 11 章 圧縮関数/圧縮解除関数
CAMSET_L
この関数を直接呼び出すこともできますが、通常、CAMSET_L はアルゴリズム圧縮
(ALC)を使用してテーブルの列を圧縮します。CAMSET_L を ALC で使用すると、列
が NULL 受入可能ならば NULL も圧縮されます。
CAMSET_L で圧縮されたデータの圧縮解除
CAMSET_L を使用して圧縮された Latin 文字データを圧縮解除するには、
DECAMSET_L 関数を使用します。
例
例: Latin 値の圧縮
この例では、ALC で CAMSET_L 関数を使用して、Description 列の Latin 値を圧縮し
ます。DECAMSET_L 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET LATIN,
Description VARCHAR(1000) CHARACTER SET LATIN
COMPRESS USING TD_SYSFNLIB.CAMSET_L
DECOMPRESS USING TD_SYSFNLIB.DECAMSET_L);
例: 圧縮された Latin 値の問合わせ
次のテーブル定義があるとします。
CREATE TABLE Pendants
(ItemNo INTEGER,
Description VARCHAR(100) CHARACTER SET LATIN);
次の問合わせは Description 列の圧縮された値を返します。
SELECT TD_SYSFNLIB.CAMSET_L(Pendants.Description);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング 、B035-1147>の「互換データ型」を参照してください。
• DECAMSET 関数について、詳細は DECAMSET を参照してください。
462
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
DECAMSET
• CAMSET_L を使用して圧縮された Latin 文字データを圧縮解除するには、
DECAMSET_L 関数を使用します。DECAMSET_L を参照してください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
DECAMSET
目的
CAMSET 関数を使用して圧縮された Unicode データを圧縮解除します。
構文
DECAMSET (compressed_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
CAMSET 関数を使用して圧縮された Unicode 文字データ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 64000 です。
この関数への入力は、CAMSET 関数の出力結果でなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ型は VARCHAR(32000) CHARACTER SET UNICODE になります。
SQL 関数、演算子、式および述部
463
第 11 章 圧縮関数/圧縮解除関数
DECAMSET_L
使用上の注意
DECAMSET は、CAMSET 関数で圧縮された Unicode データを受け取り、それを圧縮
解除します。その後で、圧縮解除した Unicode 文字列を結果として返します。
この関数を直接呼び出すこともできますが、通常、DECAMSET はアルゴリズム圧縮
(ALC)を使用して、事前に CAMSET で圧縮されたテーブルの列を圧縮解除します。
例: UNICODE 値の圧縮
この例では、ALC で CAMSET 関数を使用して、Description 列の Unicode 値を圧縮
します。DECAMSET 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET UNICODE,
Description VARCHAR(1000) CHARACTER SET UNICODE
COMPRESS USING TD_SYSFNLIB.CAMSET
DECOMPRESS USING TD_SYSFNLIB.DECAMSET);
DECAMSET 関数、関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
DECAMSET_L
目的
CAMSET_L を使用して圧縮された Latin データを圧縮解除します。
構文
DECAMSET_L (compressed_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
464
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
DECAMSET_L
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
CAMSET_L 関数を使用して圧縮された Latin 文字データ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 64000 です。
この関数への入力は、CAMSET_L 関数の出力結果でなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ タイプは VARCHAR(64000) CHARACTER SET LATIN です。
使用上の注意
DECAMSET_L は、CAMSET_L 関数で圧縮された Latin データを受け取り、それを圧
縮解除します。その後で、圧縮解除した Latin 文字列を結果として返します。
この関数を直接呼び出すこともできますが、通常、DECAMSET_L はアルゴリズム圧
縮(ALC)を使用して、事前に CAMSET_L で圧縮されたテーブルの列を圧縮解除します。
例
この例では、ALC で CAMSET_L 関数を使用して、Description 列の Latin 値を圧縮
します。DECAMSET_L 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET LATIN,
Description VARCHAR(1000) CHARACTER SET LATIN
COMPRESS USING TD_SYSFNLIB.CAMSET_L
DECOMPRESS USING TD_SYSFNLIB.DECAMSET_L);
SQL 関数、演算子、式および述部
465
第 11 章 圧縮関数/圧縮解除関数
JSON_COMPRESS
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
JSON_COMPRESS
目的
JSON データ タイプ値を圧縮します。
構文
JSON_COMPRESS
( JSON_expr )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
JSON_expr
JSON データ型と評価される式。
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数は、JSON データ タイプのみを圧縮します。その他のデータ タイプの圧縮
に使用することはできません。ユーザーは JSON データを圧縮するための独自の UDF
を作成することはできません。
466
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
JSON_DECOMPRESS
結果のタイプ
関数は TD_ANYTYPE を入力として受け取り、任意の JSON データ タイプの形式で
使用できるように TD_ANYTYPE を返します。
TD_LZ_COMPRESS 関数を使用して JSON データを圧縮できます。ただし、
JSON_COMPRESS 関数は JSON データの圧縮用に最適化されているため、代わりに
JSON_COMPRESS を使用することを推奨します。
例: JSON データ型の圧縮
この関数を直接呼び出すこともできますが、多くの場合、JSON_COMPRESS は
COMPRESS USING 句で使用してテーブルの列を圧縮します。以下の表では、 json_col
列の JSON データが JSON_COMPRESS 関数を使用して圧縮されます。
CREATE TABLE temp (
id
INTEGER,
json_col JSON(1000)
CHARACTER SET LATIN
COMPRESS USING JSON_COMPRESS
DECOMPRESS USING JSON_DECOMPRESS);
関連トピック
詳細は、以下を参照してください。
• COMPRESS USING 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
JSON_DECOMPRESS
目的
JSON_COMPRESS 関数を使用して前に圧縮された JSON データを圧縮解除します。
構文
JSON_DECOMPRESS
( compressed_JSON_data )
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
SQL 関数、演算子、式および述部
467
第 11 章 圧縮関数/圧縮解除関数
JSON_DECOMPRESS
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_JSON_data
JSON_COMPRESS 関数を使用して圧縮された JSON データ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数は、JSON データ タイプのみを圧縮解除します。その他のデータ タイプの
圧縮解除に使用することはできません。ユーザーは JSON データを圧縮および圧縮
解除するための独自の UDF を作成することはできません。
結果のタイプ
関数の戻りデータ タイプは JSON です。
例: JSON データ型の圧縮解除
この関数を直接呼び出すこともできますが、多くの場合、JSON_DECOMPRESS は
DECOMPRESS USING 句で使用してテーブルの列を圧縮解除します。以下の表では、
json_col 列の JSON データが JSON_DECOMPRESS 関数を使用して圧縮解除されます。
CREATE TABLE temp (
id
INTEGER,
json_col JSON(1000)
CHARACTER SET LATIN
COMPRESS USING JSON_COMPRESS
DECOMPRESS USING JSON_DECOMPRESS);
関連トピック
詳細は、以下を参照してください。
• DECOMPRESS USING 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
468
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
LZCOMP
LZCOMP
目的
指定された Unicode 文字データを、Lempel-Ziv アルゴリズムを使用して圧縮します。
構文
LZCOMP (Unicode_string)
TD_SYSFNLIB.
注: この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として
使用される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
Unicode_string
Unicode の文字列または列式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ型が VARCHAR(n) CHARACTER SET UNICODE の式を渡さな
ければなりません。この(n)の最大対応サイズは 32000 です。UDF に適用される暗
黙のデータ型変換規則を使用して VARCHAR(32000) CHARACTER SET UNICODE に
変換できる、データ型の引数も渡すことができます。たとえば、LZCOMP(CHAR)は
可能です。暗黙的に LZCOMP(VARCHAR)に変換できるからです。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って VARCHAR に変換で
きない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング 、B035-1147>の「互換デー
タ型」を参照してください。
この関数への入力は Unicode 文字データでなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
SQL 関数、演算子、式および述部
469
第 11 章 圧縮関数/圧縮解除関数
LZCOMP
結果のタイプ
結果のデータ型は VARBYTE(64000)になります。
使用上の注意
Unicode 文字データを格納する場合、圧縮解除された Teradata Database 内の文字
データには 1 文字ごとに 2 バイトが必要になります。LZCOMP は Unicode 文字の入
力を受け取り、それを Lempel-Ziv アルゴリズムを使用して圧縮し、圧縮された結果
を返します。
LZCOMP は、長い Unicode 文字列に対しては良好な圧縮結果を得られますが、短い
文字列に対してはそれほどの効果が得られないことがあります。頻繁に繰り返され
る文字が存在する中程度の文字列に対しても、良好な結果が得られることがあります。
この関数を直接呼び出すこともできますが、通常、LZCOMP はアルゴリズム圧縮
(ALC)を使用してテーブルの列を圧縮します。LZCOMP を ALC で使用すると、列が
NULL 受入可能ならば NULL も圧縮されます。
LZCOMP で圧縮されたデータの圧縮解除
LZCOMP を使用して圧縮された Unicode データを圧縮解除するには、LZDECOMP
関数を使用します。
例
例: UNICODE 値の圧縮
この例では、ALC で LZCOMP 関数を使用して、Description 列の Unicode 値を圧縮
します。LZDECOMP 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET UNICODE,
Description VARCHAR(1000) CHARACTER SET UNICODE
COMPRESS USING TD_SYSFNLIB.LZCOMP
DECOMPRESS USING TD_SYSFNLIB.LZDECOMP);
例: Description 列の圧縮された UNICODE 値の問合わせ
次のテーブル定義があるとします。
CREATE TABLE Pendants
(ItemNo INTEGER,
Description VARCHAR(100) CHARACTER SET UNICODE);
次の問合わせは Description 列の圧縮された値を返します。
470
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
LZCOMP_L
SELECT TD_SYSFNLIB.LZCOMP(Pendants.Description);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
• LZCOMP で使用する圧縮アルゴリズムについて、詳細は http://zlib.net を参照し
てください。
• LZCOMP を使用して圧縮された Unicode データを圧縮解除するには、LZDECOMP
関数を使用します。LZDECOMP を参照してください。
LZCOMP_L
目的
指定された Latin 文字データを、Lempel-Ziv アルゴリズムを使用して圧縮します。
構文
LZCOMP_L (Latin_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
Latin_string
Latin の文字列または列式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
471
第 11 章 圧縮関数/圧縮解除関数
LZCOMP_L
引数のタイプと規則
この関数には、データ型が VARCHAR(n) CHARACTER SET LATIN の式を渡さなけれ
ばなりません。この(n)の最大対応サイズは 64000 です。UDF に適用される暗黙の
データ型変換規則を使用して VARCHAR(64000) CHARACTER SET LATIN に変換でき
る、データ型の引数も渡すことができます。たとえば、LZCOMP_L(CHAR)は可能で
す。暗黙的に LZCOMP_L(VARCHAR)に変換できるからです。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って VARCHAR に変換で
きない引数は、明示的にキャストする必要があります。
この関数への入力は Latin 文字データでなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ型は VARBYTE(64000)になります。
使用上の注意
Latin 文字データを格納する場合、圧縮解除された Teradata Database 内の文字デー
タには 1 文字ごとに 1 バイトが必要になります。LZCOMP_L は Latin 文字の入力を
受け取り、それを Lempel-Ziv アルゴリズムを使用して圧縮し、圧縮された結果を返
します。
LZCOMP_L は、長い Unicode 文字列に対しては良好な圧縮結果を得られますが、短
い文字列に対してはそれほどの効果が得られないことがあります。頻繁に繰り返さ
れる文字が存在する中程度の文字列に対しても、良好な結果が得られることがあり
ます。
この関数を直接呼び出すこともできますが、通常、LZCOMP_L はアルゴリズム圧縮
(ALC)を使用してテーブルの列を圧縮します。LZCOMP_L を ALC で使用すると、列
が NULL 受入可能ならば NULL も圧縮されます。
LZCOMP_L で圧縮されたデータの圧縮解除
LZCOMP_L を使用して圧縮された Latin データを圧縮解除するには、LZDECOMP_L
関数を使用します。
例
例: Latin 値の圧縮
この例では、ALC で LZCOMP_L 関数を使用して、Description 列の Latin 値を圧縮し
ます。LZDECOMP_L 関数は、直前に圧縮された値を圧縮解除します。
472
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
LZDECOMP
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET LATIN,
Description VARCHAR(1000) CHARACTER SET LATIN
COMPRESS USING TD_SYSFNLIB.LZCOMP_L
DECOMPRESS USING TD_SYSFNLIB.LZDECOMP_L);
例: Description 列の圧縮された Latin 値の問合わせ
次のテーブル定義があるとします。
CREATE TABLE Pendants
(ItemNo INTEGER,
Description VARCHAR(100) CHARACTER SET LATIN);
次の問合わせは Description 列の圧縮された値を返します。
SELECT TD_SYSFNLIB.LZCOMP_L(Pendants.Description);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• LZCOMP_L を使用して圧縮された Latin データを圧縮解除するには、
LZDECOMP_L 関数を使用します。「LZDECOMP_L」を参照してください。
• LZCOMP_L で使用する圧縮アルゴリズムについて、詳細は http://zlib.net を参照
してください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
LZDECOMP
目的
LZCOMP 関数を使用して圧縮された Unicode データを圧縮解除します。
構文
LZDECOMP (compressed_string)
TD_SYSFNLIB.
SQL 関数、演算子、式および述部
473
第 11 章 圧縮関数/圧縮解除関数
LZDECOMP
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
LZCOMP 関数を使用して圧縮された Unicode 文字データ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 64000 です。
この関数への入力は、LZCOMP 関数の出力結果でなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ型は VARCHAR(32000) CHARACTER SET UNICODE になります。
使用上の注意
LZDECOMP は、LZCOMP 関数で圧縮された Unicode データを受け取り、それを圧
縮解除します。その後で、圧縮解除した Unicode 文字列を結果として返します。
この関数を直接呼び出すこともできますが、通常、LZDECOMP はアルゴリズム圧縮
(ALC)を使用して、事前に LZCOMP で圧縮されたテーブルの列を圧縮解除します。
例: LZCOMP での UNICODE 値の圧縮
この例では、ALC で LZCOMP 関数を使用して、Description 列の Unicode 値を圧縮
します。LZDECOMP 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET UNICODE,
474
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
LZDECOMP_L
Description VARCHAR(1000) CHARACTER SET UNICODE
COMPRESS USING TD_SYSFNLIB.LZCOMP
DECOMPRESS USING TD_SYSFNLIB.LZDECOMP);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• LZDECOMP で使用する圧縮解除アルゴリズムについて、詳細は http://zlib.net を
参照してください。
LZDECOMP_L
目的
LZCOMP_L 関数を使用して圧縮された Latin データを圧縮解除します。
構文
LZDECOMP_L (compressed_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
LZCOMP_L 関数を使用して圧縮された Latin データ。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
475
第 11 章 圧縮関数/圧縮解除関数
LZDECOMP_L
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 64000 です。
この関数への入力は、LZCOMP_L 関数の出力結果でなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ タイプは VARCHAR(64000) CHARACTER SET LATIN です。
使用上の注意
LZDECOMP_L は、LZCOMP_L 関数で圧縮された Latin データを受け取り、それを圧
縮解除します。その後で、圧縮解除した Latin 文字列を結果として返します。
この関数を直接呼び出すこともできますが、通常、LZDECOMP_L はアルゴリズム圧
縮(ALC)を使用して、事前に LZCOMP_L で圧縮されたテーブルの列を圧縮解除します。
例: LZCOMP_L での Latin 値の圧縮
この例では、ALC で LZCOMP_L 関数を使用して、Description 列の Latin 値を圧縮し
ます。LZDECOMP_L 関数は、直前に圧縮された値を圧縮解除します。
CREATE MULTISET TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE CHARACTER SET LATIN,
Description VARCHAR(1000) CHARACTER SET LATIN
COMPRESS USING TD_SYSFNLIB.LZCOMP_L
DECOMPRESS USING TD_SYSFNLIB.LZDECOMP_L);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• LZDECOMP_L で使用する圧縮解除アルゴリズムについて、詳細は http://zlib.net
を参照してください。
476
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TD_LZ_COMPRESS
TD_LZ_COMPRESS
目的
Lempel-Ziv アルゴリズムを使用して、サポートされているすべての ALC データ型ま
たは事前定義型のデータを圧縮します。
構文
TD_LZ_COMPRESS ( expression )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
• 列に対する ALC 用圧縮ルーチンとして関数を使用する場合に、サポートされる
ALC データ型。
• 関数を呼び出す場合に、サポートされる ALC データ型、すべての事前定義デー
タ型、および DISTINCT 型 UDT。
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
•
•
•
•
•
•
•
•
•
BYTE
VARBYTE
CHARACTER
VARCHAR
JSON
TIME
TIMESTAMP
ST_Geometry や XML などのシステム定義の UDT。
LOB UDT、ARRAY、Period データ タイプなどの DISTINCT 型 UDT。
SQL 関数、演算子、式および述部
477
第 11 章 圧縮関数/圧縮解除関数
TD_LZ_COMPRESS
データ タイプは、対応する圧縮解除関数 TD_LZ_DECOMPRESS の結果のデータ タ
イプに一致する必要があります。
結果のタイプ
結果のデータ タイプは VARBYTE または BLOB です。
使用上の注意
数値データ タイプは、SQL 文で関数を呼び出す場合は有効ですが、列に対する ALC
用の関数として使用する場合には有効ではありません。
TD_LZ_COMPRESS を ALC で使用すると、列が NULL 受入可能ならば NULL も圧縮
されます。
TD_LZ_COMPRESS 関数を使用して JSON データを圧縮できます。ただし、
JSON_COMPRESS 関数は JSON データの圧縮用に最適化されているため、代わりに
JSON_COMPRESS を使用することを推奨します。
TD_LZ_COMPRESS で圧縮されたデータの圧縮解除
TD_LZ_COMPRESS を使用して圧縮されたデータを圧縮解除するには、
「TD_LZ_DECOMPRESS」を使用します。
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句/DECOMPRESS 句」を参照してください。
• UDF の暗黙のタイプ変換規則の詳細については、<SQL 外部ルーチン プログラミ
ング 、B035-1147>の「互換データ型」を参照してください。
• Lempel-ziv アルゴリズムの詳細については、http://zlib.net を参照してください。
• DECAMSET 関数について、詳細は DECAMSET を参照してください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
• TD_LZ_COMPRESS を使用して圧縮されたデータを圧縮解除するには、
TD_LZ_DECOMPRESS を使用します。
478
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TD_LZ_DECOMPRESS
TD_LZ_DECOMPRESS
目的
TD_LZ_COMPRESS 関数を使用して圧縮されたデータを圧縮解除します。
構文
TD_LZ_DECOMPRESS ( expression )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expression
VARBYTE か BLOB、またはこの 2 つの組み合わせとして表現される、
TD_LZ_COMPRESS 関数を使用して圧縮されたデータ。
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数に渡される式では、データ タイプが対応する圧縮関数 TD_LZ_COMPRESS
のものと同じである必要があります。入力のタイプは、VARBYTE か BLOB、または
この 2 つの組み合わせにします。
結果のタイプ
結果のデータ タイプは、常に ALC で使用可能なデータ タイプに一致します。
使用上の注意
TD_LZ_DECOMPRESS は通常、以前に TD_LZ_COMPRESS で圧縮されたテーブルの
列を圧縮解除するために、ALC で使用します。
SQL 関数、演算子、式および述部
479
第 11 章 圧縮関数/圧縮解除関数
TS_COMPRESS
この関数を直接呼び出すには、RETURNS 句を使用して目的の結果のデータ タイプ
を指定する必要があります。LOB などサイズの大きなデータ タイプに対して、この
関数を直接呼び出すことは推奨しません。
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• 指定されたデータ型を返す RETURN 句の使用例については、< SQL データ型とリ
テラル、B035-1143>の「パラメータ データ型」の TD_ANYTYPE データ型を参
照してください。
• TD_LZ_DECOMPRESS で使用する圧縮解除アルゴリズムについて、詳細は http://
zlib.net を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
TS_COMPRESS
目的
タイムゾーンのある(またはない) TIME および TIMESTAMP を最小バイト数に圧縮し
ます。
構文
TS_COMPRESS
( td_anytype )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
td_anytype
この関数では、タイムゾーン データ型のある(またはない)TIME または TIMESTAMP。
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
480
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TS_COMPRESS
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数の出力は、TS_DECOMPRESS 関数への入力となります。
入力引数の型は td_anytype ですが、この関数のアルゴリズムでは TIME および
TIMESTAMP データ型のみがサポートされています。TIME および TIMESTAMP の
各値(たとえば、年、月、または日)は、最小ビット数に個別に圧縮されてから連結
されます。
結果のタイプ
結果のデータ型は VARBYTE(20)になります。
使用上の注意
アルゴリズム圧縮(ALC)列を作成するときには、列を圧縮および圧縮解除する圧縮関
数および圧縮解除関数をそれぞれ含める必要があります。
データを ALC 列に挿入すると、データが圧縮されます。ALC 列を選択すると、デー
タが圧縮解除されます。
圧縮解除されるデータのデータ タイプ
必要なバイト数
TIME
6
TIMESTAMP
10
TIME WITH TIME ZONE
8
TIMESTAMP WITH TIME ZONE
12
例
例: TIME データ型の圧縮
TIME データ タイプのデータを圧縮解除するには、6 バイト必要です。次の表に、
そのバイトを分解し、それぞれの有効範囲と最小ビット数を示します。
時間
バイト
有効範囲
最小ビット数
時間
1
00 23
5
分
1
00 59
6
SQL 関数、演算子、式および述部
481
第 11 章 圧縮関数/圧縮解除関数
TS_DECOMPRESS
時間
バイト
有効範囲
最小ビット数
秒
4
00 000000 61.999999
6~26 (秒精度によって異な
ります)
TIME の次の値を挿入するとします。
INSERT into t1(1, TIME'03:38:06');
次の SQL 文が指定されていたとします。
CREATE TABLE table t1(pk int, col1 time(0) compress using ts_compress
decompress using ts_decompress);
必要なビット数は次のとおりです。
• 3 時= 5
• 38 分= 6
• 6 秒= 6
TIME を表わすために必要なビットの総数は 17 です。最小バイト数は 3 です。TIME
(TIMEZONE なし)では 6 バイトを使用するため、TS_COMPRESS は 6 バイトを 3 バ
イトに圧縮します。この関数によって、3 バイトが節約されます。
例: TIMESTAMP データ型の圧縮
次の SQL 文は、圧縮状態で格納された可能性のある t_timestamp の TIMESTAMP 列
を作成します。
CREATE TABLE table t_timestamp(i int, j timestamp(0) compress using
td_sysfnlib.ts_compress decompress using td_sysfnlib.ts_decompress);
関連トピック
詳細は、以下を参照してください。
• ACL の詳細については、「SQL データ タイプおよびリテラル」を参照してくださ
い。
• COMPRESS/DECOMPRESS 句の詳細については、 SQL データ型とリテラル、
B035-1143 を参照してください。
TS_DECOMPRESS
目的
TS_COMPRESS 関数で圧縮したタイムゾーンのある(またはない) TIME データおよび
TIMESTAMP データを圧縮解除します。
482
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TS_DECOMPRESS
構文
TS_DECOMPRESS
( compressed_string )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
TS_COMPRESS で圧縮されたデータ。
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 20 です。
この関数への入力は、TS_COMPRESS 関数の出力結果でなければなりません。
結果のタイプ
結果のデータ タイプは td_anytype です。
例: 圧縮された TIME 列の作成
次の SQL 文は、ストレージから取り出すとき格納および圧縮解除された際に圧縮さ
れる t_time の TIME 列を作成します。
CREATE table t_time(i int, j time(6) compress using
td_sysfnlib.ts_compress decompress using td_sysfnlib.ts_decompress);
次の TIME 値を列 j に挿入するとします。
INSERT into t_time(1, TIME'06:26:44.820000');
INSERT into t_time(2, TIME'10:26:44.820000');
次の SQL 文を実行します。
SQL 関数、演算子、式および述部
483
第 11 章 圧縮関数/圧縮解除関数
TransUnicodeToUTF8
SELECT j from t_time;
t_time テーブルに値を挿入したときに圧縮された 2 つの TIME 値が圧縮解除されて
返されます。
関連トピック
COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
TransUnicodeToUTF8
目的
指定された Unicode 文字データを UTF8 形式に圧縮します。
構文
TransUnicodeToUTF8 ( Unicode_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
Unicode_string
Unicode の文字列または列式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ型が VARCHAR(n) CHARACTER SET UNICODE の式を渡さなけ
ればなりません。この(n)の最大対応サイズは 32000 です。UDF に適用される暗黙
のデータ型変換規則を使用して VARCHAR(32000) CHARACTER SET UNICODE に変
換できる、データ型の引数も渡すことができます。たとえば、
484
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TransUnicodeToUTF8
TransUnicodeToUTF8(CHAR)は可能です。暗黙的に
TransUnicodeToUTF8(VARCHAR)に変換できるからです。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って VARCHAR に変換で
きない引数は、明示的にキャストする必要があります。
この関数への入力は Unicode 文字データでなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ型は VARBYTE(64000)になります。
使用上の注意
TransUnicodeToUTF8 は指定された Unicode 文字データを UTF8 形式に圧縮しま
す。その後で、圧縮した結果を返します。この関数は、入力データの大部分が Latin
文字の場合に役立ちます。これは、Unicode は Latin 文字を表現するために 2 バイ
ト使用しますが、UTF8 は 1 バイトで表現するためです。
TransUnicodeToUTF8 は、長さにかかわらず Unicode 文字列の圧縮に対して良好な
結果が得られます。以下の状況での使用が最適です。
• ほとんどが US-ASCII 文字を格納する Unicode 列に対する使用
• 以下の組み合わせで、データが頻繁に切り替わる場合
• 大文字と小文字
• 数字と文字
• Latin 文字と非 Latin 文字
• データが非常に動的な場合(頻繁な更新)
この関数を直接呼び出すこともできますが、通常、TransUnicodeToUTF8 はアルゴ
リズム圧縮(ALC)を使用してテーブルの列を圧縮します。TransUnicodeToUTF8 を
ALC で使用すると、列が NULL 受入可能ならば NULL も圧縮されます。
制約事項
TransUnicodeToUTF8 が圧縮できる文字値は、7 ビットの ASCII 文字(U+0000 から
U+007F)の範囲だけです。これは US-ASCII とも呼ばれています。
例: TransUnicodeToUTF8 で圧縮されたデータの圧縮解除
TransUnicodeToUTF8 を使用して圧縮された Unicode データを圧縮解除するには、
TransUTF8ToUnicode 関数を使用します。
SQL 関数、演算子、式および述部
485
第 11 章 圧縮関数/圧縮解除関数
TransUTF8ToUnicode
この例では、デフォルトのサーバー文字セットを UNICODE と仮定します。
Description 列の値は、ALC で TransUnicodeToUTF8 関数を使用して圧縮されます。
この関数は、Unicode の入力を UTF8 形式で格納します。TransUTF8ToUnicode 関
数は、直前に圧縮した値を圧縮解除します。
CREATE TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE,
Description VARCHAR(1000)
COMPRESS USING TD_SYSFNLIB.TransUnicodeToUTF8
DECOMPRESS USING TD_SYSFNLIB.TransUTF8ToUnicode);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• TransUnicodeToUTF8 を使用して圧縮された Unicode データを圧縮解除するに
は、TransUTF8ToUnicode 関数を使用します。TransUnicodeToUTF8 を参照して
ください。
• Teradata 提供の各圧縮関数の比較と、圧縮関数を選択する際のガイドラインにつ
いての詳細は、<データベース設計、B035-1094>を参照してください。
TransUTF8ToUnicode
目的
TransUnicodeToUTF8 関数を使用して圧縮された Unicode データを圧縮解除します。
構文
TransUTF8ToUnicode ( compressed_string)
TD_SYSFNLIB.
注:
この関数は、COMPRESS USING 句または DECOMPRESS USING 句の一部として使用
される場合は引数をとりません。
486
SQL 関数、演算子、式および述部
第 11 章 圧縮関数/圧縮解除関数
TransUTF8ToUnicode
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
compressed_string
TransUnicodeToUTF8 関数を使用して圧縮された Unicode 文字データです。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと規則
この関数には、データ タイプが VARBYTE(n)の式を渡さなければなりません。この
(n)の最大対応サイズは 64000 です。
この関数への入力は、TransUnicodeToUTF 関数の出力結果でなければなりません。
入力として NULL を指定した場合、この関数は NULL を返します。
結果のタイプ
結果のデータ タイプは VARCHAR(32000) CHARACTER SET UNICODE です。
使用上の注意
TransUnicodeToUTF8 は指定された Unicode 文字データを UTF8 形式に圧縮しま
す。その後で、圧縮した結果を返します。この関数は、入力データの大部分が Latin
文字の場合に役立ちます。これは、Unicode は Latin 文字を表現するために 2 バイ
ト使用しますが、UTF8 は 1 バイトで表現するためです。
TransUnicodeToUTF8 は、長さにかかわらず Unicode 文字列の圧縮に対して良好な
結果が得られます。以下の状況での使用が最適です。
• ほとんどが US-ASCII 文字を格納する Unicode 列に対する使用
• 以下の組み合わせで、データが頻繁に切り替わる場合
• 大文字と小文字
• 数字と文字
• Latin 文字と非 Latin 文字
• データが非常に動的な場合(頻繁な更新)
この関数を直接呼び出すこともできますが、通常、TransUnicodeToUTF8 はアルゴ
リズム圧縮(ALC)を使用してテーブルの列を圧縮します。TransUnicodeToUTF8 を
ALC で使用すると、列が NULL 受入可能ならば NULL も圧縮されます。
SQL 関数、演算子、式および述部
487
第 11 章 圧縮関数/圧縮解除関数
TransUTF8ToUnicode
例: TransUTF8ToUnicode での UNICODE 値の圧縮解除
この例では、デフォルトのサーバー文字セットを UNICODE と仮定します。
Description 列の値は、ALC で TransUnicodeToUTF8 関数を使用して圧縮されます。
この関数は、Unicode の入力を UTF8 形式で格納します。TransUTF8ToUnicode 関
数は、直前に圧縮した値を圧縮解除します。
CREATE TABLE Pendants
(ItemNo INTEGER,
Gem CHAR(10) UPPERCASE,
Description VARCHAR(1000)
COMPRESS USING TD_SYSFNLIB.TransUnicodeToUTF8
DECOMPRESS USING TD_SYSFNLIB.TransUTF8ToUnicode);
関連トピック
詳細は、以下を参照してください。
• COMPRESS/DECOMPRESS 句の詳細については、< SQL データ型とリテラル、
B035-1143>を参照してください。
• ALC の詳細については、< SQL データ型とリテラル、B035-1143>の「COMPRESS
句と DECOMPRESS 句」を参照してください。
488
SQL 関数、演算子、式および述部
第 12 章
CASE 式
概要
この章では、SQL CASE 式について説明します。
CASE
目的
TRUE と評価される等価比較および条件に基づいて、条件式または式に代替値を指
定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
概要
CASE を使用すれば、アプリケーション開発者がデータの表現を変更するための効
率の良い強力な方法が得られます。CASE によって、ホスト プログラムの介入を必
要とせずにデータ変換を行なうことができます。
たとえば、従業員のステータスをそれぞれフルタイムまたはパートタイムを意味す
る 1 または 2 と符号化することを想定します。効率化のためにシステムは数値コー
ドを格納しますが、読み取り側のためには、システムは 、レポート内の対応する語
をプリントまたは表示します。この格納および変換は、Teradata Database によって
管理されます。
さらに、CASE を使用することによって、アプリケーションでデータベースからの
情報に基づいて NULL 値を生成することができます。その際にホスト プログラムを
介する必要はありません。これとは逆に、CASE を使用して、NULL を値に変換する
ことができます。
CASE 式の 2 つの形式
CASE 式は、次の書式で指定します。
SQL 関数、演算子、式および述部
489
第 12 章 CASE 式
値形式の CASE 式
• 値形式の CASE は、「値形式の CASE 式」で説明しています。
• 検索形式の CASE は、「検索形式の CASE 式」で説明しています。
NULL の処理のための CASE 簡略形式
CASE の 2 つの簡略形式は、null を処理するために提供されます。
• COALESCE については、「COALESCE 式」で説明しています。
• NULLIF については、「NULLIF 式」で説明しています。
値形式の CASE 式
目的
テスト式によって一連の式の等価性を評価し、テスト式の値と値が一致する値を持
つ最初の WHEN 句に定義されたスカラー式の値を結果として戻します。等価式がな
い場合には、任意指定の ELSE 句によって定義されたスカラー値を戻すか、または等
価式が省略されている場合には、NULL を戻します。
構文
CASE
A
WHEN
value_expression_1
value_expression_n
A
THEN
scalar_expression_n
B
END
B
ELSE scalar_expression_m
構文要素
value_expression_1
value_expression_n と値の等価性をテストされる式。
value_expression_n
value_expression_1 の値に対する等価性をテストする一連の式。
scalar_expression_n
value_expression_1 と value_expression_n の最初の等価比較で値が戻される式。
scalar_expression_m
評価が ELSE 句になる場合に値が戻される式。
490
SQL 関数、演算子、式および述部
第 12 章 CASE 式
値形式の CASE 式
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
Teradata Database では、value_expression_1 は確定的な関数でなければならない
という ANSI の制限事項は施行されていません。特に、Teradata Database では関数
RANDOM を value_expression_1 内で使用することができます。
RANDOM を使用すると、value_expression_1 と比較するたびに value_expression_n
が再計算されるかどうかによって、非確定的な動作が生じる可能性があることに注
意してください。
使用上の注意
WHEN 句は、順番に処理されます。
value_expression_1 に等しい最初の WHEN 句 value_expression_n は、それに関連
した scalar_expression_n の値を結果として戻します。これで、この評価プロセスは
終了します。
value_expression_n に等しい value_expression_1 が存在しない場合は、ELSE 句の
引数である scalar_expression_m が結果となります。
ELSE 句が定義されていない場合には、結果はデフォルトの NULL になります。
value_expression_1 のデータ タイプは、すべての value_expression_n 値のデータ
タイプと比較可能でなければなりません。
CASE 式の結果データ タイプの詳細については、CASE 式結果タイプの規則を参照し
てください。
スカラー subquery は、CASE 式の WHEN 句、THEN 句、および ELSE 句で使用でき
ます。非スカラーの subquery(複数の行を返す subquery)を使用すると、実行時エ
ラーが返されます。
推奨事項: 組み込み関数 CURRENT_DATE または CURRENT_TIMESTAMP は、パー
ティション基本索引(PPI)のパーティション化式で指定された CASE 式では使用でき
ません。この場合、調整処理の間にすべての行がスキャンされます。
デフォルト タイトル
CASE 式のデフォルト タイトルは、次のようになります。
<CASE expression>
CASE 式におけるデータ タイプに対する制限事項
以下の制限事項が、CASE 式中の CLOB、BLOB、および UDT タイプに対して適用さ
れます。
SQL 関数、演算子、式および述部
491
第 12 章 CASE 式
値形式の CASE 式
データ タ 制約事項
イプ
BLOB
value_expression_1、value_expression_n、scalar_expression_m、または
scalar_expression_n の中で BLOB を使えるのは、これが BYTE または VARBYTE
にキャストされる場合だけです。
CLOB
value_expression_1、value_expression_n、scalar_expression_m、または
scalar_expression_n の中で CLOB を使えるのは、これが CHAR または
VARCHAR にキャストされる場合だけです。
UDT
1 つの CASE 式で、複数の UDT を使用できます。ただし、次の制限があります。
• value_expression_1 から value_expression_n までのデータ型は、いずれかが
UDT データ型である場合には、同一の UDT データ型である必要があります。
• scalar_expression_n と scalar_expression_m のいずれかが UDT データ型で
ある場合、どちらも同じ UDT データ型である必要があります。
Teradata Database は、CASE 式での UDT に対しては暗黙の型変換を実行しませ
ん。この制限事項に対する対処策としては、CREATE CAST を使用して、UDT ど
うしの間でキャストを行なう CAST を定義してから、CASE 式内で明示的に CAST
関数を呼び出します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規
則および例、B035-1144>を参照してください。
例
例: 費用の端数の計算
次の例は、値形式の CASE 式を使用して、タイプ「1」のパーツで表わされた品目の
総費用に対する費用の比を計算します。
SELECT SUM(CASE part
WHEN '1'
THEN cost
ELSE 0
END
)/SUM(cost)
FROM t;
例: CASE 式の使用
CASE 式は、任意の value-expression の代わりに使用することができます。
SELECT *
FROM t
WHERE x = CASE y
WHEN 2
THEN 1001
WHEN 5
492
SQL 関数、演算子、式および述部
第 12 章 CASE 式
値形式の CASE 式
THEN 1002
END;
例: CASE 式と連結演算子の組合わせ
以下の例は、CASE 式を連結演算子と組み合わせする方法を示しています。
SELECT prodID, CASE prodSTATUS
WHEN 1
THEN 'SENT'
ELSE 'BACK ORDER'
END || ' STATUS'
FROM t1;
例: 値式での UDT データ型の使用
value_expression_1 から value_expression_n までを使用して、値形式の CASE 式
で、等価性をテストします。
これらの例のために、次のようにテーブルを定義します。
create table udtval038_t1(id integer, udt1 testcircleudt, udt2
testrectangleudt) PRIMARY INDEX (id);
次の例では、値形式の CASE 式を示します。すべての値式が同じ UDT データ タイ
プとなっています。
SELECT CASE udt1
WHEN
THEN
WHEN
THEN
WHEN
THEN
ELSE
END
new testcircleudt('1,1,2,yellow,circ')
'Row 1'
new testcircleudt('2,2,4,purple,circ')
'Row 2'
new testcircleudt('3,3,9,green,circ')
'Row 3'
'Row is NULL'
FROM t1;
*** Query completed. 4 rows found. One column returned.
<CASE expression>
-----------------Row 3
Row 1
Row is NULL
Row 2
ただし、次の例は、testrectangleudt が他の UDT データ タイプに一致しないため、
正常に完了しません。
SQL 関数、演算子、式および述部
493
第 12 章 CASE 式
値形式の CASE 式
SELECT CASE udt1
WHEN
THEN
WHEN
THEN
WHEN
THEN
ELSE
END
new testcircleudt('1,1,2,yellow,circ')
'Row 1'
new testrectangleudt('2,2,4,4,purple,rect')
'Row 2'
new testcircleudt('3,3,9,green,circ')
'Row 3'
'Row is NULL'
FROM t1;
例 1: スカラー式での UDT データ型の使用
値形式または検索形式の CASE 式での等価比較が、TRUE に評価された場合に返す式
として、または、ELSE 条件で返す値として、scalar_expression_n および
scalar_expression_m を使用します。
これらの例のために、次のようにテーブルを定義します。
create table udtval038_t1(id integer, udt1 testcircleudt, udt2
testrectangleudt) PRIMARY INDEX (id);
次に、検索形式の CASE 式の例を示します。すべてのスカラー式が同じ UDT デー
タ タイプとなっています。
注: search_condition_n は、scalar_expression_n と異なる UDT データ型にすること
ができます。 SELECT * FROM udtval038_t1
WHERE udt1 = CASE
WHEN udt2 <> new testrectangleudt('2,2,4,4,pink,rect')
THEN new testcircleudt('1,1,2,blue,circ')
ELSE new testcircleudt('2,2,4,purple,circ')
*** Query completed. 2 rows found. 3 columns returned.
END;
id udt1
----------- ----------------------------------------------1 1, 1, 2, yellow, circ
2 2, 2, 4, purple, circ
ただし、次の例は、スカラー式に異なるデータ タイプがあるため、正常に完了しま
せん。
SELECT * FROM udtval038_t1
WHERE udt1 = CASE
WHEN udt2 <> new testrectangleudt('2,2,4,4,pink,rect')
THEN new testcircleudt('1,1,2,blue,circ')
ELSE new testrectangleudt('2,2,4,4,purple,rect')
END;
494
SQL 関数、演算子、式および述部
第 12 章 CASE 式
検索形式の CASE 式
関連トピック
詳細は、以下を参照してください。
• エラー条件については、「エラー条件」を参照してください。
• CASE 式の結果データ型の詳細については、「CASE 式結果タイプの規則」を参照
してください。
• CASE 式の結果の形式については、「CASE 式の書式」を参照してください。
• null と CASE 式については、「CASE と NULL」を参照してください。
検索形式の CASE 式
目的
検索条件を評価し、TRUE の値が見つかると、WHEN 句で定義されたスカラー値の
集合の 1 つを戻します。TRUE テストがない場合には、ELSE 句によって定義された
スカラー値を戻すか、または省略されている場合には、NULL を戻します。
構文
CASE
WHEN
search_condition_n
THEN
scalar_expression_n
A
END
A
ELSE
scalar_expression_m
構文要素
search_condition_n
真偽をテストする述部条件。
scalar_expression_n
search_condition_n が、TRUE と評価される最初の検索条件である場合に値が戻さ
れるスカラー式。
scalar_expression_m
どの search_condition_n も TRUE と評価されない場合に値が戻されるスカラー式。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
SQL 関数、演算子、式および述部
495
第 12 章 CASE 式
検索形式の CASE 式
使用上の注意
WHEN 句は、順番に処理されます。
TRUE になる最初の WHEN 句である search_condition_n は、関連する
scalar_expression_n の値を結果として戻します。これで、この評価プロセスは終了
します。
どの search_condition_n も TRUE でない場合、ELSE 句の引数である
scalar_expression_m が結果となります。
ELSE 句が定義されていない場合、結果はデフォルトの NULL になります。
スカラー subquery は、CASE 式の WHEN 句、THEN 句、および ELSE 句で使用でき
ます。非スカラーの subquery(複数の行を返す subquery)を使用すると、実行時エ
ラーが返されます。
推奨事項: 組み込み関数 CURRENT_DATE または CURRENT_TIMESTAMP は、パー
ティション基本索引(PPI)のパーティション化式で指定された CASE 式では使用でき
ません。この場合、調整処理の間にすべての行がスキャンされます。
デフォルト タイトル
CASE 式のデフォルト タイトルは、次のようになります。
<CASE expression>
WHEN 検索条件の規則
WHEN 検索条件には、次のような特性があります。
•
•
•
•
LIKE、=、または<>などの任意の比較演算子の形式をとることができます。
ALL または ANY などの限定述部にすることができます。
スカラー subquery を 1 つ含めることができます。
結合した 2 つのテーブルを含めることができます。
以下に例を示します。
SELECT CASE
WHEN t1.x=t2.x THEN t1.y
ELSE t2.y
END FROM t1,t2;
• SELECT 文を含めることはできません。
CASE 式におけるデータ タイプに対する制限事項
以下の制限事項が、CASE 式中の CLOB、BLOB、および UDT タイプに対して適用さ
れます。
496
SQL 関数、演算子、式および述部
第 12 章 CASE 式
検索形式の CASE 式
データ タ 制約事項
イプ
BLOB
value_expression_1、value_expression_n、scalar_expression_m、または
scalar_expression_n の中で BLOB を使えるのは、これが BYTE または VARBYTE
にキャストされる場合だけです。
CLOB
value_expression_1、value_expression_n、scalar_expression_m、または
scalar_expression_n の中で CLOB を使えるのは、これが CHAR または
VARCHAR にキャストされる場合だけです。
UDT
1 つの CASE 式で、複数の UDT を使用できます。ただし、次の制限があります。
• value_expression_1 から value_expression_n までのデータ型は、いずれかが
UDT データ型である場合には、同一の UDT データ型である必要があります。
• scalar_expression_n と scalar_expression_m のいずれかが UDT データ型で
ある場合、どちらも同じ UDT データ型である必要があります。
Teradata Database は、CASE 式での UDT に対しては暗黙の型変換を実行しませ
ん。この制限事項に対する対処策としては、CREATE CAST を使用して、UDT ど
うしの間でキャストを行なう CAST を定義してから、CASE 式内で明示的に CAST
関数を呼び出します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規
則および例、B035-1144>を参照してください。
例
例: 検索条件の評価
次の文は、「例」にある CASE の値形式の最初の例と同じです。
SELECT SUM(CASE
WHEN part='1'
THEN cost
ELSE 0
END
) / SUM(cost)
FROM t;
例: CASE 式の使用
CASE 式は、任意の value-expression の代わりに使用することができます。
以下の例では、ELSE 句を指定していないことに注意してください。CASE 式の ELSE
句は常にオプションです。ELSE 句を省いたときにどの WHEN 条件も TRUE でなけ
れば、null が戻されます。
SELECT *
FROM t
WHERE x = CASE
SQL 関数、演算子、式および述部
497
第 12 章 CASE 式
検索形式の CASE 式
WHEN
THEN
WHEN
THEN
END;
y=2
1
(z=3 AND y=5)
2
例: ELSE 句の使用
次の例では、ELSE 句を使用しています。
SELECT *
FROM t
WHERE x = CASE
WHEN y=2
THEN 1
ELSE 2
END;
例: CASE 式を使ってパフォーマンスを強化する
次の例は、性能を飛躍的に向上させるために、CASE 式を使用してデータから複数の
パスを削除する方法を示しています。CASE を使用しなければ、それぞれの領域に対
して複数の問合わせを実行し、個々の問合わせに対する応答を最終報告にまとめな
ければなりません。
SELECT SalesMonth, SUM(CASE
WHEN Region='NE'
THEN Revenue
ELSE 0
END),
SUM(CASE
WHEN Region='NW'
THEN Revenue
ELSE 0
END),
SUM(CASE
WHEN Region LIKE 'N%'
THEN Revenue
ELSE 0
END)
AS NorthernExposure, NorthernExposure/SUM(Revenue),
SUM(Revenue)
FROM Sales
GROUP BY SalesMonth;
例: 従業員の給与を示すレポートの作成
給与が$40000 よりも少ない従業員はすべて、昇給対象者になります。
498
SQL 関数、演算子、式および述部
第 12 章 CASE 式
検索形式の CASE 式
給与の上限
勤続年数の下限
昇給の割合
$30000.00
8
15
$35000.00
10
10
$40000.00
5
次の SELECT 文は、CASE 式を使用して給与が$40000 より少ない従業員すべてを表
示するレポートを作成し、名字の最初の 15 文字、給与総額($と句読点を使用した
書式)、現在の日付を基にした勤続年数(On_The_Job の列)、および「15%昇給」、
「10%昇給」、「05%昇給」、「資格なし」の 4 つのカテゴリのどの資格を有するの
かを表示します。
SELECT CAST(last_name AS CHARACTER(15))
,salary_amount (FORMAT '$,$$9,999.99')
,(date - hire_date)/365.25 (FORMAT 'Z9.99') AS On_The_Job
,CASE
WHEN salary_amount < 30000 AND On_The_Job > 8
THEN '15% Increase'
WHEN salary_amount < 35000 AND On_The_Job > 10
THEN '10% Increase'
WHEN salary_amount < 40000 AND On_The_Job > 10
THEN '05% Increase'
ELSE 'Not Qualified'
END AS Plan
WHERE salary_amount < 40000
FROM employee
ORDER BY 4;
この問合わせの結果は、次の表のとおりです。
last_name
salary_amount
On_The_Job
計画
Trader
$37,850.00
20.61
05% Increase
Charles
$39,500.00
18.44
05% Increase
Johnson
$36,300.00
20.41
05% Increase
Hopkins
$37,900.00
19.99
05% Increase
Morrissey
$38,750.00
18.44
05% Increase
Ryan
$31,200.00
20.41
10% Increase
Machado
$32,300.00
18.03
10% Increase
Short
$34,700.00
17.86
10% Increase
Lombardo
$31,000.00
20.11
10% Increase
SQL 関数、演算子、式および述部
499
第 12 章 CASE 式
エラー条件
last_name
salary_amount
On_The_Job
計画
Phillips
$24,500.00
19.95
15% Increase
Rabbit
$26,500.00
18.03
15% Increase
Kanieski
$29,250.00
20.11
15% Increase
Hoover
$25,525.00
20.73
15% Increase
Crane
$24,500.00
19.15
15% Increase
Stein
$29,450.00
20.41
15% Increase
関連トピック
詳細は、以下を参照してください。
• エラー条件については、「エラー条件」を参照してください。
• CASE 式の結果データ型の詳細については、「CASE 式結果タイプの規則」を参照
してください。
• CASE 式の結果の形式については、「CASE 式の書式」を参照してください。
• null と CASE 式については、「CASE と NULL」を参照してください。
エラー条件
以下の条件または式は、CASE 式では無効とみなされます。
条件または式
例
キーワード CASE の後に条件を指定した場
合。
SELECT CASE a=1
WHEN 1
THEN 1
ELSE 0
END
FROM t;
無効な WHEN 式を値形式の CASE 式に指定 SELECT CASE a
した場合。
WHEN a=1
THEN 1
ELSE 0
END
FROM t;
無効な WHEN 条件を検索形式の CASE 式に SELECT CASE
指定した場合。
WHEN a
500
SQL 関数、演算子、式および述部
第 12 章 CASE 式
CASE 式結果タイプの規則
条件または式
例
THEN 1
ELSE 0
END
FROM t;
SELECT CASE
WHEN NULL
THEN 'NULL'
END
FROM table_1;
スカラー以外の subquery が検索形式の
SELECT CASE
CASE 式の WHEN 条件で指定された場合。
WHEN t.a IN
(SELECT u.a
FROM u)
THEN 1
ELSE 0
END
FROM t;
互いに同じではない複数の UDT を CASE 式 SELECT CASE t.shape.gettype()
が参照する場合。
WHEN 1
THEN NEW circle('18,18,324')
WHEN 2
THEN NEW square('20,20,400')
END;
CASE 式結果タイプの規則
CASE THEN/ELSE 句の式はさまざまなデータ型になることがあるため、結果タイプ
を決定するのは容易であるとは限りません。CASE 式では、TYPE 属性関数を引数と
して使用して、結果のデータ タイプを検索することができます。TYPE を参照して
ください。
次のルールは、CASE 式の結果のデータ タイプに適用されます。
同じ文字以外のデータ タイプを含む THEN/ELSE 式
すべての THEN 式および ELSE 式が同じ文字以外のデータ タイプを含む場合、CASE
式の結果はこのタイプになります。たとえば、すべての THEN 式および ELSE 式が
INTEGER タイプを含む場合、CASE 式の結果タイプは INTEGER になります。
SQL 関数、演算子、式および述部
501
第 12 章 CASE 式
CASE 式結果タイプの規則
DECIMAL 結果の精度と小数部桁数がどのように計算されるかについては、2 項算術
演算子の結果のデータ タイプを参照してください。
THEN/ELSE 文字タイプの式
以下の規則は、すべての THEN/ELSE 式のデータ タイプが文字の場合の CASE 式に
適用されます。
• CASE 式の結果も文字データ タイプになり、その長さは、THEN/ELSE 式のさまざ
まな文字データ タイプの最大長に等しくなります。
• すべての THEN/ELSE 式のデータ タイプが CHARACTER (または CHAR)の場合、
結果のデータ タイプは CHARACTER になります。複数の式が VARCHAR (または
LONG VARCHAR)の場合、結果のデータ タイプは VARCHAR になります。
• 結果のサーバー文字セットは、次のように決定されます。
• CASE 式に 1 つの非リテラル文字式と 1 つ以上のリテラルが含まれている場
合、Teradata Database はすべてのリテラルを非リテラルの文字セットにコー
ド変換します。このコード変換が成功すると、非リテラルの文字セットが結果
のデータ タイプに使用されます。変換に失敗した場合、結果のサーバー文字
セットは Unicode になります。
• CASE 式に複数の非リテラル文字式と 1 つ以上のリテラルが含まれている場合
は、次のようになります。
すべての非リテラル式に同一の文字セットが含まれている場合、Teradata
Database は共通データ型としてこの文字セットを使用します。そうではなく、
非リテラル式に異なる文字セットが含まれている場合、Teradata Database は
共通データ型として Unicode 文字セットを使用します。
Teradata Database は、 すべてのリテラルを共通データ型の文字セットにコー
ド変換できるかどうかを試します。この変換に成功すると、結果のデータ タ
イプは共通データ タイプの文字セットになります。変換に失敗した場合、結
果のサーバー文字セットは Unicode になります。
例
CASE 式における文字データの例
次の CHARACTER データの動作の例では、デフォルト サーバー文字セットが KANJI1
であり、CASE の例のテーブル定義は次のようになっているとします。
CREATE TABLE table_1
(
i
INTEGER,
column_l CHARACTER(10)
column_u CHARACTER(10)
column_j CHARACTER(10)
column_g CHARACTER(10)
502
CHARACTER
CHARACTER
CHARACTER
CHARACTER
SET
SET
SET
SET
LATIN,
UNICODE,
KANJISJIS,
GRAPHIC,
SQL 関数、演算子、式および述部
第 12 章 CASE 式
CASE 式結果タイプの規則
column_k CHARACTER(10) CHARACTER SET KANJI1
);
注: Teradata の国際化計画に従って、KANJI1 のサポートはサポート外になりまし
た。このサポートは、近い将来に廃止される予定です。KANJI1 はデフォルトの文
字セットとして許可されません。システムはデフォルトの KANJI1 文字セットを
UNICODE 文字セットに変更します。KANJI1 の新規オブジェクトの作成は、高度に
制限されています。KANJI1 を使用する問合わせやアプリケーションの多くは、従
来通り動作しますが、KANJI1 を使用するサイトはできるだけ早く別の文字セット
に変換する必要があります。 詳細の参照先 “KANJI1 文字セット” 国際文字セット サ
ポート内。
CASE 式における文字データの例: 例 1
次に示す問合わせ結果のサーバー文字セットは、UNICODE になります。これは、
CASE 式に複数の非リテラル文字式が含まれ、それらの文字セットが異なるためです。
SELECT i, CASE
WHEN
WHEN
WHEN
WHEN
ELSE
END
FROM table_1
ORDER BY 1;
i=2 THEN
i=3 THEN
i=4 THEN
i=5 THEN
column_l
column_u
column_j
column_g
column_k
次の問合わせでは、THEN/ELSE 句に FLOAT 値と VARCHAR 値が含まれている CASE
式から VARCHAR の結果が戻されます。FLOAT のデフォルト書式が 30 文字未満の
文字列であり、USER が VARCHAR(30) CHARACTER SET UNICODE として設定され
ているため、結果の長さは 30 になります。USER が UNICODE であるため、結果は
CHARACTER SET UNICODE となります。
SELECT a, CASE
WHEN a=1
THEN TIME
ELSE USER
END
FROM table_1
ORDER BY 1;
CASE 式における文字データの例: 例 2
次の問合わせの結果は、5354 エラー(引数は KANJI1 タイプでなければならない)に
なります。これは、ある THEN/ELSE 式が KANJI1 リテラルであり、その他のすべ
ての THEN/ELSE 式のサーバー文字セットが KANJI1 ではないためです。
SQL 関数、演算子、式および述部
503
第 12 章 CASE 式
CASE 式結果タイプの規則
SELECT i, CASE
WHEN
WHEN
WHEN
WHEN
WHEN
ELSE
END
FROM table_1
ORDER BY 1;
i=1 THEN
i=2 THEN
i=3 THEN
i=4 THEN
i=5 THEN
column_k
column_l
column_u
column_j
column_g
_Kanji1'4142'XC
この例では、以下のテーブル定義があるものとします。
CREATE table_1
(i
INTEGER,
column_l CHARACTER(10)
column_u CHARACTER(10)
column_j CHARACTER(10)
column_g CHARACTER(10)
column_k CHARACTER(10)
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
SET
SET
SET
SET
SET
LATIN,
UNICODE,
KANJISJIS,
GRAPHIC,
KANJI1);
次の問合わせは、サーバー文字セットが GRAPHIC であるため(文字タイプを持つ最
初の THEN のサーバー文字セットが GRAPHIC であるため)に失敗します。
SELECT i, CASE
WHEN
WHEN
WHEN
WHEN
WHEN
ELSE
END
FROM table_1
ORDER BY 1;
i=1
i=2
i=3
i=4
i=5
10
THEN
THEN
THEN
THEN
THEN
4
column_g
5
column_l
column_k
CASE 式における文字データの例: 例 3
次の問合わせの THEN/ELSE 式には、Unicode 列が含まれます。この問合せは成功
し、結果のデータ タイプは UNICODE になります。これは、この CASE 式に 1 つの
Unicode 列が含まれていて、その他のリテラルがすべて正常に Unicode にコード変
換できるためです。
SELECT i, CASE
WHEN
WHEN
WHEN
WHEN
ELSE
504
i=1
i=2
i=3
i=4
10
THEN
THEN
THEN
THEN
column_u
'abc'
8
_KanjiSJIS'4142'XC
SQL 関数、演算子、式および述部
第 12 章 CASE 式
CASE 式結果タイプの規則
END
FROM table_1
ORDER BY 1;
CASE 式における文字データの例: 例 4
次の問合わせの THEN/ELSE 式には、Latin 列が含まれます。この問合せは成功し、
結果のデータ タイプは Latin になります。これは、その他のリテラルがすべて正常
に Latin にコード変換できるためです。
SELECT i, CASE
WHEN i=1 THEN 'abc'
WHEN i=2 THEN column_l
ELSE 'def'
END
FROM table_1
ORDER BY 1;
混合データ タイプを含む THEN/ELSE 式
混合データについての規則を次の表に定義します。
THEN/ELSE 句の式
結果
BYTE および/または VARBYTE デー
タ タイプで構成される場合
すべての THEN/ELSE 式のデータ タイプが BYTE の
場合、結果のデータ タイプは BYTE になります。複
数の式が VARBYTE の場合、結果のデータ タイプは
VARBYTE になります。
結果の長さは異なるバイト数のデータ タイプの最大
長と等しくなります。
DateTime、または Interval データ タ すべての THEN/ELSE 句の式は同じデータ タイプを
イプを含んでいる場合
含まなければなりません。
FLOAT (近似値)を含んでいて、文字列 CASE 式から FLOAT の結果が戻されます。
を含んでいない場合
注: FLOAT データ タイプが関係する場合は、不正確
さを継承することはある程度避けられません。
DECIMAL データだけで構成されてい CASE 式から DECIMAL の結果が戻されます。
る場合
注: DECIMAL の計算結果は、38 桁以下に限定されま
す。38 桁を超える場合は、数値オーバーフロー エ
混合 DECIMAL、BYTEINT、
ラーになります。
SMALLINT、INTEGER、および
BIGINT データだけで構成されている DECIMAL 結果の精度と小数部桁数がどのように計算
場合
されるかについては、2 項算術演算子の結果のデー
タ タイプを参照してください。
すべて暗黙的に FLOAT に変換され、CASE 式により
FLOAT の結果が返されます。
SQL 関数、演算子、式および述部
505
第 12 章 CASE 式
CASE 式結果タイプの規則
THEN/ELSE 句の式
結果
注:
FLOAT データ タイプが関係する場合は、不正確さを
継承することはある程度避けられません。10 進値お
よび整数値を浮動小数点数値に暗黙的に変換すると、
精度が喪失するか、または正確に表現できない数字
を生成することになります。
BYTEINT、SMALLINT、INTEGER、 結果タイプは THEN/ELSE 句の式の最大タイプです。
および BIGINT データが混在している 次のリストはタイプを最大から最小へと順序付けて
場合
います。
• BIGINT
• INTEGER
• SMALLINT
• BYTEINT
NUMERIC および CHARACTER デー
タだけで構成されている場合
数値データは、CHARACTER 型に変換されます。こ
の型の長さは、この数値式に関連付けられたフォー
マットによって決まります。その後、結果のデータ
タイプには文字、長さおよび文字セットについての
ルールが適用されます。詳細は、THEN/ELSE 文字タ
イプの式を参照してください。
注: サーバー文字セットが GRAPHIC である場合はエ
ラーが生成されます。
CASE 式における数値データの例
以下に示す数値データの動作の例では、CASE の例のテーブル定義を次のとおりとし
ます。
CREATE TABLE
(column_l
,column_2
,column_3
dec22
INTEGER
INTEGER
DECIMAL(22,2) );
例: CASE 式の失敗
次の文では、column_2 で値 1 が検出されて column_3 で値
11223344556677889900.12 が検出されたときに、CASE 式は失敗します。結果の
DECIMAL 値では、39 桁以上の精度が必要だからです。
SELECT SUM (CASE
WHEN column_2=1
THEN column_3 * 6.112233445566778800000
ELSE column_3
506
SQL 関数、演算子、式および述部
第 12 章 CASE 式
CASE 式結果タイプの規則
END )
FROM dec22;
例: 乗数の小数部桁数の短縮
次の問合わせは、THEN 式の乗数の小数部桁数を小さくして、「例: CASE 式の失敗」
の問題点を修正したものです。
SELECT SUM (CASE
WHEN column_2=1
THEN column_3 * 6.1122334455667788
ELSE column_3
END )
FROM dec22;
例: DECIMAL(38,2)の結果を返す
次の問合わせでは、THEN/ELSE 句に DECIMAL 値が含まれているため、CASE 式か
ら DECIMAL(38,2)の結果が返されます。
SELECT SUM (CASE
WHEN column_2=1
THEN column_3 * 6
ELSE column_3
END )
FROM dec22;
CASE 式における文字および数値データの例
以下は、数値および文字データから成る THEN/ELSE 句を使用する CASE 式を含む
問合わせの動作を示す例です。
CASE 式における文字および数値データの例: 例 1
次の問合わせでは、THEN/ELSE 句に FLOAT 値と VARCHAR 値が含まれている CASE
式から VARCHAR の結果が戻されます。FLOAT のデフォルト書式が 30 文字未満の
文字列であり、USER が VARCHAR(30) CHARACTER SET UNICODE として設定され
ているため、結果の長さは 30 になります。USER が UNICODE であるため、結果は
CHARACTER SET UNICODE となります。
SELECT a, CASE
WHEN a=1
THEN TIME
ELSE USER
END
FROM table_1
ORDER BY 1;
SQL 関数、演算子、式および述部
507
第 12 章 CASE 式
CASE 式の書式
CASE 式における文字および数値データの例: 例 2
この例では、以下のテーブル定義があるものとします。
CREATE table_1
(i
INTEGER,
column_l CHARACTER(10)
column_u CHARACTER(10)
column_j CHARACTER(10)
column_g CHARACTER(10)
column_k CHARACTER(10)
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
SET
SET
SET
SET
SET
LATIN,
UNICODE,
KANJISJIS,
GRAPHIC,
KANJI1);
次の問合わせは、サーバー文字セットが GRAPHIC であるため(文字タイプを持つ最
初の THEN のサーバー文字セットが GRAPHIC であるため)に失敗します。
SELECT i, CASE
WHEN
WHEN
WHEN
WHEN
WHEN
ELSE
END
FROM table_1
ORDER BY 1;
i=1
i=2
i=3
i=4
i=5
10
THEN
THEN
THEN
THEN
THEN
4
column_g
5
column_l
column_k
関連トピック
詳細は、以下を参照してください。
• 2 項算術演算子の結果のデータ タイプ
CASE 式の書式
デフォルトの書式
CASE 式の結果は、結果のデータ タイプのデフォルトの書式で表示されます。CASE
式の結果は、THEN/ELSE 式で示される列について定義される明示的な書式には適用
されません。
次のテーブル定義を考えます。
CREATE TABLE duration
(i INTEGER
508
SQL 関数、演算子、式および述部
第 12 章 CASE 式
CASE と NULL
,start_date DATE FORMAT 'EEEEBMMMBDD,BYYYY'
,end_date DATE FORMAT 'DDBM3BY4' );
DATE データ タイプのデフォルト書式が YY/MM/DD であると仮定します。
以下の問合わせは、start_date や end_date 列に定義される書式ではなく、YY/MM/
DD のデフォルトの DATE フォーマットで CASE 式の結果を表示します。
SELECT i, CASE
WHEN
THEN
WHEN
THEN
END
FROM duration
ORDER BY 1;
i=1
start_date
i=2
end_date
明示的なタイプ変換を使った書式の変更
CASE 式の結果の書式を修正するには、CAST を使用して FORMAT 句を指定します。
以下に、上記の問合わせで CAST を使って CASE 式の結果の書式を変更する例を示
します。
SELECT i, ( CAST ((CASE
WHEN i=1
THEN start_date
WHEN i=2
THEN end_date
END) AS DATE FORMAT 'M4BDD,BYYYY'))
FROM duration
ORDER BY 1;
デフォルトのデータ タイプの書式と FORMAT 句について、詳細は< SQL データ型
とリテラル、B035-1143>を参照してください。
詳細情報
参照先
デフォルトのデータ型フォーマットと
FORMAT 出力句
SQL データ型とリテラル、B035-1143。
Teradata 変換構文を使用した、データ型
フォーマットの変換
明示的なデータ型の変換における Teradata 変
換構文
CASE と NULL
ANSI SQL:2011 規格では、CASE 式および関連する式の COALESCE と NULLIF は、
NULL を戻す能力を持つと指定されています。
SQL 関数、演算子、式および述部
509
第 12 章 CASE 式
CASE と NULL
NULL と CASE 式
CASE、NULLIF、および COALESCE 式における null 使用の規則は、次のとおりです。
• ELSE 句が CASE 式で指定されていない場合、評価がすべての WHEN 句を通過す
ると、結果は null になります。
• null と null を含む式は、値形式の CASE 式内の value_expression_1 として有効で
す。
次の例は有効です。
SELECT CASE NULL
WHEN 10
THEN 'TEN'
END;
SELECT CASE NULL + 1
WHEN 10
THEN 'TEN'
END;
上記の例では ELSE 句が指定されていないので、どちらの例も NULL を戻します。
また、NULL はどの値ともまたは NULL とも等しくないので、評価は WHEN にな
ります。
• 任意の値または NULL に対して NULL を比較すると、常に FALSE になります。
NULL に関するテストでは、WHEN 条件内で IS NULL または IS NOT NULL を使
用する検索形式の CASE 式を使うのが最善です。
次の例は有効です。
SELECT CASE
WHEN column_1 IS NULL
THEN 'NULL'
END
FROM table_1;
多くの場合 Teradata Database は、常に NULL と評価される式が他の式または
NULL と比較された場合にそれを検出できるので、エラーを示して、IS NULL ま
たは IS NOT NULL の使用を推奨します。ANSI SQL では、これをエラーとは判断
しませんが、ユーザーがこの方法での NULL の比較を意図することはほとんどな
いため、Teradata Database ではエラーがレポートされることに注意してください。
次の例は無効です。
SELECT CASE column_1
WHEN NULL
THEN 'NULL'
END
510
SQL 関数、演算子、式および述部
第 12 章 CASE 式
COALESCE 式
FROM table_1;
SELECT CASE column_1
WHEN NULL + 1
THEN 'NULL'
END
FROM table_1;
SELECT CASE
WHEN column_1 = NULL
THEN 'NULL'
END
FROM table_1;
SELECT CASE
WHEN column_1 = NULL + 1
THEN 'NULL'
END
FROM table_1;
• null および null を含む式は、THEN 句の式として有効です。
次の例は有効です。
SELECT CASE
WHEN column_1 = 10
THEN NULL
END
FROM table_1
上記の例とは異なり、この THEN 句内の NULL は SQL キーワードであり文字リ
テラルの値ではないことに注意してください。
CASE 簡略形
また ANSI では、特に null を処理するために CASE の特別な簡略式が 2 つ定義され
ています。
• COALESCE 式(「COALESCE 式」を参照)
• NULLIF 式(「NULLIF 式」を参照)
COALESCE 式
目的
すべての引数が null であれば NULL を戻し、そうでなければ、scalar_expression リ
スト内の非 null の最初の引数の値を戻します。
COALESCE は、以下の完全 CASE 式の簡略式になります。
SQL 関数、演算子、式および述部
511
第 12 章 CASE 式
COALESCE 式
CASE
WHEN
THEN
...
WHEN
THEN
ELSE
END
scalar_expression_1 IS NOT NULL
scalar_expression_1
scalar_expression_n IS NOT NULL
scalar_expression_n
NULL
構文
,
COALESCE
(
2
scalar_expression_n
)
構文要素
scalar_expression_n
引数リスト。
それぞれの COALESCE 関数には少なくとも 2 つのオペランドが必要です。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
引数リスト内の scalar_expression_n は、1 回めは検索条件として、2 回めはその検
索条件の戻り値として、2 回評価されることがあります。
RANDOM のような非確定的な関数を scalar_expression_n 内で使用すると、予期し
ない結果になる可能性があります。それは、scalar_expression_n の最初の計算が
NULL でない場合に、その scalar_expression_n(これは COALESCE 式の値として戻さ
れます)の 2 番目の計算が NULL になることがあるからです。
スカラー subquery は、COALESCE 式で使用できます。ただし、非スカラーの
subquery(複数の行を返す subquery)を使用すると、実行時エラーが返されます。
デフォルト タイトル
COALESCE 式のデフォルト タイトルは、次のようになります。
<CASE expression>
512
SQL 関数、演算子、式および述部
第 12 章 CASE 式
COALESCE 式
COALESCE 式におけるデータ タイプに対する制限事項
以下の制限事項が、COALESCE 式中の CLOB、BLOB、および UDT タイプに対して
適用されます。
データ タ 制約事項
イプ
BLOB
引数リストの中で BLOB を使えるのは、これが BYTE または VARBYTE にキャス
トされる場合だけです。
CLOB
引数リストの中で CLOB を使えるのは、これが CHAR または VARCHAR にキャ
ストされる場合だけです。
UDT
複数の UDT を引数リストの中で使用できるのは、それらが同一タイプの場合だ
けです。これは、Teradata Database が COALESCE 式内の UDT に対して暗黙タ
イプ変換を行なわないためです。
例
例: 電話番号の問合わせ
次の例は、指定された各人の自宅の電話番号(存在する場合)、または事務所の電話
番号(HomePhone が null の場合)、または MessageService (MessageService が存在
して、自宅および事務所の電話番号が null の場合)を戻します。3 つのすべての値が
null の場合には、NULL を戻します。
SELECT Name, COALESCE (HomePhone, OfficePhone, MessageService)
FROM PhoneDir;
例: COALESCE と算術演算子の使用
以下の例は、算術演算子とともに COALESCE を使用しています。
SELECT COALESCE(Boxes,0) * 100
FROM Shipments;
例: COALESCE と比較演算子の使用
以下の例は、比較演算子とともに COALESCE を使用しています。
SELECT Name
FROM Directory
WHERE Organization <> COALESCE (Level1, Level2, Level3);
関連トピック
詳細は、以下を参照してください。
SQL 関数、演算子、式および述部
513
第 12 章 CASE 式
NULLIF 式
• 評価のルールや結果のデータ型など、その他の詳細については、「CASE」を参照
してください。
NULLIF 式
目的
引数どうしが等しい場合に NULL を戻し、そうでなければ、最初の引数
scalar_expression_1 を戻します。
NULLIF は、以下の完全 CASE 式の簡略式になります。
CASE
WHEN scalar_expression_1=scalar_expression_2
THEN NULL
ELSE scalar_expression_1
END
構文
NULLIF
(
scalar_expression1, scalar_expression2
)
構文要素
scalar_expression_1
上記の「目的」に示されている拡張 CASE 式の左側のスカラー式。
scalar_expression_2
上記の「目的」に示されている拡張 CASE 式の右側のスカラー式。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
scalar_expression_1 引数は、1 回めは検索条件の一部として(前述の拡張 CASE 式を
参照)、2 回めは ELSE 句の戻り値として、2 回評価されることがあります。
RANDOM のような非確定的な関数を使用した場合に、scalar_expression_1 の最初
の計算が scalar_expression_2 に等しくならないと、予期しない結果になることがあ
ります。この計算では、CASE 式の結果は、scalar_expression_1 の 2 番目の計算の
値(これは scalar_expression_2 になる可能性があります)になります。
514
SQL 関数、演算子、式および述部
第 12 章 CASE 式
NULLIF 式
スカラー subquery は、NULLIF 式で使用できます。ただし、非スカラーの
subquery(複数の行を返す subquery)を使用すると、実行時エラーが返されます。
デフォルト タイトル
NULLIF 式のデフォルト タイトルは、次のようになります。
<CASE expression>
NULLIF 式におけるデータ タイプに対する制限事項
以下の制限事項が、NULLIF 式中の CLOB、BLOB、および UDT タイプに対して適用
されます。
データ タ 制約事項
イプ
BLOB
引数リストの中で BLOB を使えるのは、これが BYTE または VARBYTE にキャス
トされる場合だけです。
CLOB
引数リストの中で CLOB を使えるのは、これが CHAR または VARCHAR にキャ
ストされる場合だけです。
UDT
複数の UDT を引数リストで使用できるのは、それらが同一タイプであって、並
べ替え定義を持っている場合だけです。
例
以下の例は、次の表に対する問合わせを示しています。
CREATE TABLE Membership
(FullName CHARACTER(39)
,Age SMALLINT
,Code CHARACTER(4) );
例: ANSI 準拠の形式での問合わせ
これは、Teradata SQL の NULLIFZERO(Age)関数の ANSI 準拠の形式であり、さらに
用途の広い形式です。
SELECT FullName, NULLIF (Age,0) FROM Membership;
例: 空白
次の問合わせでのブランクは、値がないことを示します。
SELECT FullName, NULLIF (Code, '
') FROM Membership;
例: 式内で算術演算子とともに使用される NULLIF の問合わせ
以下の例は、式内で算術演算子とともに NULLIF を使用しています。
SQL 関数、演算子、式および述部
515
第 12 章 CASE 式
NULLIF 式
SELECT NULLIF(Age,0) * 100;
関連トピック
詳細は、以下を参照してください。
• 評価のルールや結果のデータ型など、その他の詳細については、「CASE」を参照
してください。
516
SQL 関数、演算子、式および述部
第 13 章
データ型の変換
概要
この章では、SQL CAST 関数について説明し、データ タイプの明示的および暗黙的
な変換に関わるさまざまな規則を取り上げます。
データ タイプの変換は、式のデータ定義(データ タイプ、データ属性、または両方)
を変更します。データ タイプの変換は、明示的または暗黙的に実行することができ
ます。明示的な変換は、CAST 関数または Teradata 変換構文を使用して行なうこと
ができます。
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
データ タイプ変換の書式
Teradata Database は、以下の形式のデータ変換をサポートしています。
• 暗黙的
• CAST 関数を使用した明示的な変換
• Teradata 変換構文を使用した明示的な変換
暗黙的な型の変換
Teradata Database では、明示的に変換する型を必要とせずに、いくつかの型の割り
当ておよび比較を行なうことができます。Teradata Database は、次の項目に対して
も暗黙の型変換を実行します。
• マクロ、ストアド プロシージャ、および SQRT などの SQL 関数に渡される一部
の引数のタイプ。
• タイムゾーン変位を定義する AT 句内の式。詳細については、「AT LOCAL およ
び AT TIME ZONE タイムゾーン指定子」を参照してください。
SQL 関数、演算子、式および述部
517
第 13 章 データ型の変換
暗黙的な型の変換
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
例
例: 割り当て時に行なわれる暗黙的な型変換
次の表を考えます。
CREATE TABLE T1
(Fname VARCHAR(25)
,Fid
INTEGER
,Yrs
CHARACTER(2));
CREATE TABLE T2
(Wname VARCHAR(25)
,Wid
INTEGER
,Age
SMALLINT);
次の文では、Teradata Database によって T1.Yrs 内の文字列が暗黙的に数値に変換
されます。
UPDATE T2 SET Age = T1.Yrs + 5;
このことは、ソース文の構文では明確ではありませんが、テーブル T1 および T2 の
ディクショナリ情報がアクセスされたときに明確になります 。
例: 比較時に行なわれる暗黙的な型変換
「割り当て時に行なわれる暗黙的な型変換」のテーブル T1 を考慮してください。
次の文では、Teradata Database により、比較操作の両方のオペランドが暗黙的に
FLOAT 値に変換されてから、比較が実行されます。
SELECT Fname, Fid
FROM T1
WHERE T1.Yrs < 55;
例: パラメータ引き渡し操作での暗黙の型変換
引数の平方根を計算する SQRT システム関数について考えます 。
次の文では、Teradata Database によって文字列の引数が暗黙的に FLOAT 型に変換
されます。
SELECT SQRT('13147688');
サポートされるデータ タイプ
Teradata Database は、以下の型の暗黙的な変換を実行します。
518
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
暗黙的な型の変換
バイトから次へ:
• バイト
バイト タイプには、BYTE、VARBYTE、および BLOB が含まれます。
• UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりませ
ん。UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ
定義言語>を参照してください。
数値から次へ:
•
•
•
•
数値
DATE
文字
UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりませ
ん。UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ
定義言語>を参照してください。
DATE から次へ:
•
•
•
•
数値
DATE
文字
UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりませ
ん。UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ
定義言語>を参照してください。
文字から次へ:
• 数値
• DATE
• 文字
文字タイプには、CHAR、VARCHAR、および CLOB が含まれます。
• 期間
• TIME
• TIMESTAMP
• UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりませ
ん。UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ
定義言語>を参照してください。
TIME から次へ:
SQL 関数、演算子、式および述部
519
第 13 章 データ型の変換
暗黙的な型の変換
• UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりません。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ定
義言語>を参照してください。
TIMESTAMP から次へ:
• UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりません。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ定
義言語>を参照してください。
INTERVAL から次へ:
• UDT
事前定義タイプを UDT にキャストする暗黙 CAST が UDT になければなりません。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ定
義言語>を参照してください。
UDT から:
• UDT に対して定義されている暗黙 CAST の変換先である事前定義データ型
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ定
義言語>を参照してください。
• UDT に対して定義されている暗黙 CAST のターゲットである別の UDT
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細については、<SQL データ定
義言語>を参照してください。
データ タイプの詳細は、< SQL データ型とリテラル、B035-1143>を参照してくだ
さい。
日時タイプの暗黙的変換
Teradata Database は、以下の場合に DateTime データ型の暗黙的変換を実行します。
• 動的パラメータ マーカー、または疑問符(?)プレースホルダーを使用してデータを
渡すとき。
• INSERT、INSERT...SELECT、および UPDATE 文を使用する場合。
• MERGE INTO 文を使用する場合。
• CREATE/ALTER TABLE 文のデフォルト値を処理するとき。詳細については、<
SQL データ型とリテラル、B035-1143>の「DEFAULT 句」を参照してください。
• DECLARE、SELECT...INTO、および SET 文の実行など、ストアド プロシージャの
実行中。<SQL ストアード プロシージャと埋め込み SQL、B035-1148>参照して
ください。
520
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
暗黙的な型の変換
暗黙の変換はクライアント側のサポートによって異なります。DateTime 型の暗黙の
変換をサポートするクライアント製品について、詳細は Teradata Tools and Utilities
ユーザー マニュアルを参照してください。
以下の変換をサポートします。
詳細についての参照先
FROM...
TO...
DATE
TIMESTAMP
「DATE から TIMESTAMP への暗黙的変換」。
TIME
TIMESTAMP
「TIME から TIMESTAMP への暗黙的変換」。
TIMESTAMP
DATE
「TIMESTAMP から DATE への暗黙的変換」。
TIMESTAMP
TIME
「TIMESTAMP から TIME への暗黙的変換」。
INTERVAL
INTERVAL
「INTERVAL から INTERVAL への暗黙的変換」。
Teradata Database は次の場合、代入時に DateTime データ型に対して暗黙的変換を
実行します。
詳細についての参照先
FROM...
TO...
DATE
TIMESTAMP
「DATE から TIMESTAMP への暗黙的変換」。
TIME
TIMESTAMP
「TIME から TIMESTAMP への暗黙的変換」。
TIMESTAMP
DATE
「TIMESTAMP から DATE への暗黙的変換」。
TIMESTAMP
TIME
「TIMESTAMP から TIME への暗黙的変換」。
間隔
絶対数値
INTERVAL タイプはフィールドが 1 つだけ必要です
(たとえば、INTERVAL YEAR)。
「INTERVAL から数値への暗黙的変換」。
絶対数値
間隔
INTERVAL タイプはフィールドが 1 つだけ必要です
(たとえば、INTERVAL YEAR)。
「数値から INTERVAL への暗黙的変換」。
注: 数値から INTERVAL 型への変換には全般的な制限があります。INTERVAL 型に
は日時フィールドが 1 つだけ必要になります。ただし、この制限は、AT 句の式を
暗黙的に変換する際には問題になりません。その理由は、この変換が 2 つの CAST
文を使用して実行されるためです。詳細については、「AT LOCAL および AT TIME
ZONE タイムゾーン指定子」を参照してください。
詳細は、「ANSI の日時および間隔データ型の割り当て規則」を参照してください。
Teradata Database は次の場合、単一テーブル述部と結合述部で DateTime データ型
に対して暗黙的変換を実行します。
FROM...
TO...
TIMESTAMP
DATE
SQL 関数、演算子、式および述部
詳細についての参照先
「TIMESTAMP から DATE への暗黙的変換」。
521
第 13 章 データ型の変換
暗黙的な型の変換
FROM...
TO...
詳細についての参照先
間隔
絶対数値
INTERVAL タイプはフィールドが 1 つだけ必要です
(たとえば、INTERVAL YEAR)。
「INTERVAL から数値への暗黙的変換」。
絶対数値
Interval
「数値から INTERVAL への暗黙的変換」。
詳細は、「比較オペランドの暗黙の型変換」を参照してください。
以下の変換はサポートしません。
• 比較では、TIME から TIMESTAMP へ、また TIMESTAMP から TIME への暗黙的
な変換はサポートしません。
• 集合操作での日時タイプの暗黙的な変換。
データ タイプの詳細は、< SQL データ型とリテラル、B035-1143>を参照してくだ
さい。
暗黙的な変換の規則
Teradata SQL は、何らかの操作が実行される前に、式に対して暗黙的な型の変換を
行ないます。
変換時の切り捨て
暗黙的な変換の結果として、エラーなしで値が切り捨てられることがあります。
推奨事項: ベスト プラクティスとして、暗黙的な変換に頼らず、可能なときには明示
的な CAST を使用してください。
例: Teradata 変換構文を使用した、CHAR への変換
次のテーブル定義を考えます。
CREATE TABLE Test1 (c1 INT, c2 VARCHAR(1));
以下の 2 つの INSERT 文はエラーなしで完了します。
INSERT INTO Test1 VALUES (1, '1');
INSERT INTO Test1 VALUES (2, 2);
この問合わせは 2 行を返します。
SELECT * FROM Test1;
c1
c2
------------1
1
2
<<<< Note that the value inserted in c2 is a blank
522
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
暗黙的な型の変換
2 番目の INSERT 文では、数値の 2 が Teradata 変換構文を使用して(つまり CAST を
使用しないで)、暗黙的に CHAR に変換されています。処理は、以下のようになりま
す。
1 数値のデフォルトまたは指定された FORMAT を使用して数値を文字列に変換し
ます。前後の埋め込み文字は、切り捨てられません。
2 必要であれば、埋め込み文字で右側に拡張するか右側から切り捨てて、変換先
の長さ指定に適合させます。
非埋め込み文字が切り捨てられた場合には、文字列切り捨てエラーは報告されません。
この変換では数字を右寄せにしますが、結果の先頭バイトに 1 つの空白文字が入り
ます。数値から文字への変換については、「数値から文字への変換」を参照してく
ださい。
制約事項
Teradata Database は、UDF、UDM、または外部ストアド プロシージャ(外部ルーチ
ン)への入力引数の暗黙変換は実行しません。引数は、パラメータ タイプと完全に
一致する必要はありませんが、互換性がなければなりません。たとえば、INTEGER
引数が期待される外部ルーチンに SMALLINT 引数を渡すことができます。これは、
SMALLINT と INTEGER に互換性があるからです。DATE タイプの引数を、INTEGER
引数が期待される外部ルーチンに渡すには、DATE タイプを明示的に INTEGER タイ
プにキャストする必要があります。詳細は、<SQL 外部ルーチン プログラミング、
B035-1147>を参照してください。
一部の SQL 関数および演算子では、パラメータ タイプと完全に一致する引数が必
要とされます。詳細は、該当する関数または演算子の資料を参照してください。
関連トピック
詳細については、以下を参照してください。
•
•
•
•
•
•
•
•
•
•
•
•
バイト変換
数値から数値への変換
数値から DATE への変換
数値から文字への変換
数値から UDT への変換
DATE から数値への変換
DATE から DATE への変換
DATE から文字への変換
DATE から UDT への変換
文字から数値への変換
文字から DATE への変換
文字から文字への変換
SQL 関数、演算子、式および述部
523
第 13 章 データ型の変換
明示的なデータ型の変換における CAST
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
文字から Period への変換
文字から TIME への変換
文字から TIMESTAMP への変換
文字から UDT への変換
TIME から UDT への変換
TIMESTAMP から UDT への変換
INTERVAL から UDT への変換
UDT から文字への変換
UDT から DATE への変換
UDT から INTERVAL への変換
UDT から数値への変換
UDT から TIME への変換
UDT から TIMESTAMP への変換
UDT から UDT への変換
比較操作でのオペランドの暗黙タイプ変換の詳細については、比較オペランドの
暗黙的なタイプ変換を参照してください。
明示的なデータ型の変換における CAST
目的
所定のデータ タイプの式を、異なるデータ タイプまたは異なる属性の同じデータ タ
イプに変換します。
Teradata SQL は、CAST 関数用に 2 種類の構文をサポートしていますが、そのうち
の 1 つだけが ANSI SQL:2011 に準拠しています。
構文
CAST
( expression
AS
ansi_sql_data_type
)
data_definition_list
構文要素
expression
異なるデータ型としてキャストされる、データ型が既知の式。
ansi_sql_data_type
式の新しいデータ型。
data_definition_list
式の新しいデータ型またはデータ属性、あるいはその両方。
524
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
明示的なデータ型の変換における CAST
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
使用上の注意
ANSI SQL:2011 準拠の形式は、データ型を ANSI 準拠 SQL 文または Teradata SQL
文のいずれかに変換するために使用できます。
Teradata の拡張構文はより一般的なものであり、タイプの宣言またはデータ属性、
あるいはその両方が可能です。データ型および属性の詳細は、< SQL データ型とリ
テラル、B035-1143>を参照してください。
CAST の拡張形式は、ANSI 準拠の移植可能なアプリケーションでは使用を避けてく
ださい。
CAST 関数は、ANSI モードでも Teradata モードでも同じように機能します。
日時データ型を変換するときには、CAST に使用するタイムゾーンを指定するため
に、AT 句を使用してください。ソース タイムゾーン、特定のタイムゾーン変位、
または現在のセッションのタイムゾーンを指定できるようになります。詳細は、具
体的なデータ型の変換についての節(例えば、「TIMESTAMP から DATE への変換」)
を参照してください。
CAST は、次のデータ タイプ ペアを変換しません。
• サーバー文字セットが GRAPHIC に設定されている場合の、数値から文字。
• サーバー文字セットが異なる文字式。
このような変換を実行するには、TRANSLATE 関数を使用してください
(「TRANSLATE」を参照)。
• バイト(BYTE、VARBYTE、および BLOB) から UDT またはバイト以外の任意の
データ タイプへ、およびバイトまたは UDT 以外のデータ タイプからバイトへ。
• CLOB から UDT または文字以外の任意のデータ タイプへ、および文字または UDT
以外のデータ タイプから CLOB へ。
地理空間タイプへのキャスト、および地理空間タイプからのキャストについては、
<SQL 地理空間タイプ、B035-1181>を参照してください。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
文字切り捨て規則
次の規則が文字列に適用されます。
SQL 関数、演算子、式および述部
525
第 13 章 データ型の変換
明示的なデータ型の変換における CAST
CAST する文字列のモード
切り捨てられる部分
ANSI
末尾の埋め込み文字スペース(必要な長さになるまで)。そ
の他の文字やマルチバイト文字の一部が切り捨てられる
と、エラーが戻されます。
TERADATA
末尾の文字(必要な長さになるまで)。
マルチバイト文字が含まれる Kanji1 文字データ タイプが
切り捨てられると、マルチバイト文字の 1 バイトが切り捨
てられることがあります。
サーバー文字セットの規則
data_definition_list で、データ型 CHARACTER (CHAR)または CHARACTER VARYING
(VARCHAR)を指定し、使用するサーバー文字セットを示すために CHARACTER SET
句を指定していない場合、その結果のサーバー文字セットは以下のようになります。
expression のデータ型
結果のサーバー文字セット
non-character
ユーザー デフォルトのサーバー文字セット。
文字
expression のサーバー文字セット。
数値の桁あふれ、フィールド モード、および CAST
数値の桁あふれは、実行しているモードが ANSI か Teradata かによって、および
フィールド モードかどうかによって、異なった方法で処理されます。
フィールド モードは ANSI SQL:2011 との互換性はありません。フィールド モード
で数値または小数データ タイプが数値の桁あふれを起こすと、エラー メッセージで
はなくアスタリスク('***')が戻されます。
レコードおよび標識モードでは、この動作は行なわれずに、エラー メッセージが戻
されます。
関連トピック
個々のデータ タイプどうしの間の変換(数値から数値、文字から数値など)に適用さ
れる規則の詳細は、この章の後半にある該当するトピックを参照してください。
CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を
参照してください。
例
次の例は、CAST を使用してデータ型の変換を実行する方法を示します。
526
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
フィールド モードでのデータ変換
例 1: データ型の変換の実行
ANSI CAST の構文を使用した例は、次のとおりです。
SELECT ID_Col, Name_Col
FROM T1
WHERE Int_Col = CAST(SUBSTRING(Char_Col FROM 3 FOR 3) AS INTEGER);
例 2: ANSI CAST 構文を使った、データ型の変換の実行
ANSI CAST の構文を使用した例は、次のとおりです。
SELECT CAST(SUBSTRING(Char_Col FROM 1 FOR 2) AS INTEGER),
CAST(SUBSTRING (Char_Col FROM 3 FOR 3) AS INTEGER)
FROM T1;
例 3: ANSI CAST 構文に対する Teradata 拡張機能を使った、データ型の変換の実行
ANSI CAST 構文に対する Teradata 拡張機能を使用した例は、次のとおりです。
CREATE TABLE t2 (f1 TIME(0) FORMAT 'HHhMIm');
INSERT t2 (CAST('15h33m' AS TIME(0) FORMAT 'HHhMIm'));
SELECT f1 FROM t2;
この SELECT 文の結果は、次のとおりです。
f1
-----15h33m
フィールド モードでのデータ変換
フィールド モード:ユーザー応答データ
BTEQ で使用されるレポート書式であるフィールド モードでは、すべてのデータは、
文字形式で戻されます。列の位置合わせおよびスペーシングは、データ書式および
タイトル情報によって制御されます。戻された各行は、本質的には表示可能な文字
列です。
フィールド モードでは、明示的に数値データを文字書式に変換する必要はありませ
ん。
数値タイプへの変換
フィールド モードの場合、文字から数値へのデータ タイプ変換に対して戻される
数値桁あふれは、エラーとして扱われません。数値データ タイプ用に予約されてい
SQL 関数、演算子、式および述部
527
第 13 章 データ型の変換
バイト変換
る通常の桁数を結果が超えた場合、その結果はレポートでは一連のアスタリスクで
示されます。
たとえば、以下の文での文字から SMALLINT への変換は、SMALLINT 用に予約され
ている桁数は通常は 5 桁なので、結果として数値桁あふれになります。
SELECT '100000' (SMALLINT);
結果は以下のようになります。
'100000'
-------******
さらに、フィールド モードの場合、指定した出力書式に適合しない結果が含まれる
数値タイプへの変換の場合も、レポート内にアスタリスクで示されます。
たとえば、以下の文での DATE から INTEGER への変換は、結果として FORMAT 句
で指定した書式に適合しない値となります。
SELECT CAST (CURRENT_DATE as integer format '9999');
結果は以下のようになります。
Date
---****
レコードまたは標識変数モードで実行された同じ問合わせは、エラーを報告します。
バイト変換
目的
バイト表現を別のデータ定義に変換します。
CAST 構文
CAST
( byte_expression
AS
byte_data_type
(
UDT_data_type
data_attribute
data_attribute
構文要素
byte_expression
別のデータ定義にキャストされるバイト形式の式。
528
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
バイト変換
byte_data_type
byte_expression の変換先の新しいバイト型。
UDT_data_type
バイト タイプを UDT にキャストする CAST 定義を持つ UDT。
UDT の CAST を定義するには、CREATE CAST 文を使用します。CREATE CAST の詳
細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を参照してください。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
構文がデータ属性を指定しない場合、CAST は ANSI SQL:2011 に準拠します。
Teradata 変換構文
byte_expression
(
byte_data_type
)
, data_attribute
,
data_attribute
, byte_data_type
, data_attribute
構文要素
byte_expression
別のデータ定義にキャストされるバイト形式の式。
byte_data_type
byte_expression の変換先の新しいバイト型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
529
第 13 章 データ型の変換
バイト変換
変換元と変換先のタイプの長さが異なる場合の変換
byte_data_type で指定した長さが byte_expression の長さよりも短い場合、指定し
た長さを超えるバイトは切り捨てられます。エラーは報告されません。
byte_data_type が固定長であり、その長さが byte_expression よりも長い場合、2 進
数でゼロの値のバイトが、必要に応じて付加されます。
サポートされる変換元と変換先のデータ タイプ
Teradata Database は、以下の表に従ってバイト データ型の変換をサポートします。
変換元データ タ
イプ
変換先データ タ
イプ
使用できる変換
BYTE
• BYTE
• 暗黙的
• VARBYTE
• BLOB
• CAST および Teradata 変換構文を使用した明示的
な変換
UDT
• 暗黙的
VARBYTE
BLOB
BYTE
• CAST を使用した明示的変換
VARBYTE
BLOB
UDT
• BYTE
• 暗黙的
• VARBYTE
• CAST および Teradata 変換構文を使用した明示的
な変換
• BLOB
UDT の関与するデータ タイプの変換には、その UDT
に適した CAST 定義が必要です。UDT の CAST を定
義するには、CREATE CAST 文を使用します。
CREATE CAST の詳細は、<SQL データ定義言語 - 構
文規則および例、B035-1144>を参照してください。
バイトから UDT への暗黙変換に関する規則
Teradata Database は、以下の操作に対してバイトから UDT への暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への引
数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
530
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
バイト変換
バイトから UDT への暗黙のデータ型変換を実行するには、以下を指定する CAST 定
義(「使用上の注意」を参照)が必要です。
• AS ASSIGNMENT 句
• BYTE、VARBYTE、または BLOB ソース データ タイプ
CAST 定義の変換元データ タイプは、暗黙タイプ変換の変換元と正確に一致して
いる必要はありません。
別々のバイト タイプから UDT への変換の場合に複数の暗黙 CAST 定義が存在する
場合、Teradata Database は優先順位の最も高いバイト タイプの暗黙 CAST 定義を
使用します。以下のリストでは、バイト タイプの優先順位が最低から最高の順に並
べられています。
• BYTE
• VARBYTE
• BLOB
HASHBUCKET を使用した BYTE タイプから INTEGER タイプへの変換
HASHBUCKET 関数を使用して、BYTE(1)または BYTE(2)タイプを INTEGER タイプ
に変換することができます。
例
例: BLOB から VARBYTE への明示的な変換
次のテーブル定義を考えます。
CREATE TABLE large_images
(id INTEGER
,image BLOB);
次の文では、BLOB の列を VARBYTE タイプにキャストし、結果を POSITION 関数
への引数として使用します。
SELECT POSITION('FFF1'xb IN (CAST(image AS VARBYTE(64000))))
FROM large_images
WHERE id = 5;
例: VARBYTE から BLOB への暗黙的な変換
次のテーブル定義を考えます。
CREATE TABLE small_images
(id INTEGER
,image1 VARBYTE(30000)
,image2 VARBYTE(30000));
CREATE TABLE large_images
SQL 関数、演算子、式および述部
531
第 13 章 データ型の変換
文字から文字への変換
(id INTEGER
,image BLOB);
次の INSERT 文の場合、Teradata Database によって VARBYTE から BLOB への暗黙
的な変換が実行されます。
INSERT large_images
SELECT id, image1 || image2
FROM small_images;
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
文字から文字への変換
目的
変換後の文字列を短くするか、または長くします。
CAST 構文
CAST
( character_expression
AS
character_data_type
(
data_attribute
data_attribute
構文要素
character_expression
変換する文字式。
character_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• 文字セット
• FORMAT
• NAMED
• TITLE
532
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から文字への変換
ANSI への準拠
構文がデータ属性を指定しない場合、CAST は ANSI SQL:2011 に準拠しています。
CAST 構文の使用上の注意
character_expression のサーバー文字セットは、変換先データ型として同じサーバー
文字セットでなければなりません。
CAST を使用してデータを文字列に変換したときに、非埋め込み文字が切り捨てら
れた場合には、エラーが報告されます。
Teradata 変換構文
character_expression
(
character_data_type
)
, data_attribute
,
data_attribute
, character_data_type
, data_attribute
構文要素
character_expression
変換する文字式。
character_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• 文字セット
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
533
第 13 章 データ型の変換
文字から文字への変換
Teradata 変換構文の使用上の注意
character_expression のサーバー文字セットは、data_attribute として指定された別
のサーバー文字セットに変更することができます。この場合の data_attribute は、
CHARACTER SET 句になります。
文字から文字への暗黙的な変換
CLOB タイプとの間で変換が可能なのは、CHAR または VARCHAR タイプだけです。
たとえば、CHAR または VARCHAR の列に CLOB データを挿入すると、暗黙のうち
に変換が実行されます。
文字列(固定長でも可変長でも)の比較では、等しい長さのオペランドが必要です。次
の表に、短い方の文字列が右側を空白で埋められて変換されることを示します。
式
変換後
結果
'x'='x '
'xΔ '='x '
TRUE
'x'='xx'
'xΔ '='xx'
FALSE
Δ は、埋め込み文字です。
文字が変換先の文字セットのレパートリーに含まれていない場合には、エラーが報
告されます。
全体の使用上の注意
変換元の文字列(CHAR、VARCHAR、または CLOB)が変換先のデータ タイプ(CHAR、
VARCHAR、または CLOB)よりも長い場合、超過した文字は切り捨てられます。
INSERT または UPDATE を実行するセッ テーブルに文字値を格納するために非埋め込み文
ションのモード
字が切り捨てられる場合の結果
ANSI
エラーが報告されます。
TERADATA
エラーは報告されません。
埋め込み文字の除去または追加は、次の規則に従って行なわれます。
変換元の文字列の
データ タイプ
状態
変換先データ タ
イプ
結果
CHAR
変換先よりも長い
CLOB または
VARCHAR
末尾の埋め込み文字は除去
されます。
CHAR
末尾に埋め込み文字が付加
されます。
CHAR、VARCHAR、 変換先よりも短い
または CLOB
534
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から文字への暗黙変換
変換元の文字列の
データ タイプ
状態
変換先データ タ
イプ
CHAR
すべて埋め込み文字 CLOB または
VARCHAR
結果
フィールドは長さゼロに切
り捨てられます。
例: 文字から文字への変換
次に、文字から文字への変換の例を示します。
文字列
文字列の
長さ
文字の説明
変換の結果
変換される
長さ
'HELLO '
5
CHAR(3)
'HEL'、セッションが Teradata
モードの場合
3
エラー、セッションが ANSI モー
ドの場合
'HELLO '
5
CHAR(7)
'HELLO '
7
'HELLO '
5
VARCHAR(7)
'HELLO '
5
'HELLO '
7
VARCHAR(6)
'HELLO'
6
'HELLO '
7
VARCHAR(3)
'HEL'、セッションが Teradata
モードの場合
3
エラー、セッションが ANSI モー
ドの場合
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 文字変換におけるサーバー文字セットの効果の規則については、暗黙的な型の変
換を参照してください。
• TRANSLATE 関数を使用した変換の実行については、TRANSLATE を参照してく
ださい。
文字から文字への暗黙変換
所定の操作で 2 つの文字列に互換性がないときに、文字列が暗黙に変換されます。
たとえば、
SELECT *
FROM string_table
WHERE clatin < csjis;
SQL 関数、演算子、式および述部
535
第 13 章 データ型の変換
文字から文字への暗黙変換
clatin は CHARACTER SET LATIN として定義された文字の列を表わし、csjis は
CHARACTER SET KANJISJIS として定義された文字の列を表わします。
文字列'string’から UNICODE 文字列への暗黙の変換が必要な場合には、
TRANSLATE(string USING source_repertoire_name _TO_Unicode)関数を実行すれば
同じ結果が得られます。ここで source-repertoire-name は、「文字列」のサーバー
文字セットです。
さらに具体的に言えば、上記の例で「文字列」が KANJISJIS 型である場合に、
TRANSLATE(string USING KanjiSJIS_TO_Unicode)関数を実行すれば同じ結果が得ら
れます。
ANSI への準拠
これは、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
文字リテラル
文字リテラルが関係する文字から文字への暗黙的な変換には、以下の規則が適用さ
れます。
一方のオペラ
ンド
もう一方のオペラ
ンド
結果
リテラル
リテラル
両方のオペランドが UNICODE に変換されます。
非リテラル
リテラルは、非リテラルのタイプに変換されます。
その変換が失敗した場合には、両方とも UNICODE
に変換されます。
リテラル式
リテラルは、リテラル式のタイプに変換されます。
その変換が失敗した場合には、両方とも UNICODE
に変換されます。
リテラル式
両方のオペランドが UNICODE に変換されます。
非リテラル
リテラル式は、非リテラルのタイプに変換されま
す。その変換が失敗した場合には、両方とも
UNICODE に変換されます。
非リテラル
両方のオペランドが UNICODE に変換されます。
リテラル式
非リテラル
KANJISJIS サーバー文字セット
文字から文字への暗黙的な変換では、KANJISJIS サーバー文字セットをもつ文字列引
数は必ず UNICODE に変換されます。
536
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から DATE への変換
式と関数引数の暗黙変換についての SQL の規則
次に、式と関数引数のタイプの暗黙変換についての規則を示します。
結果が文字タイプになる列関数の結果を次の表にまとめました。
関数
結果
TRIM
主要な文字列引数(最後の引数)のタイプに変換されます。
|| (連結)
変換されず、暗黙の変換後、引数の文字データ型になります。
他の列関数には変換が含まれておらず、結果のタイプは、引数のサーバー文字セッ
トではなく関数に基づいて決定されることに注意する必要があります。
例えば、次の TRIM 関数の場合、<unicode-literal>がまず LATIN に変換されてから、
除去操作が実行されます。
...
TRIM(<unicode-literal> FROM <latin-value>)
結果は、LATIN です。
文字から DATE への変換
目的
文字列を日付値に変換します。
CAST 構文
CAST
( character_expression
AS
DATE
)
data_attribute
構文要素
character_expression
変換する文字式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
SQL 関数、演算子、式および述部
537
第 13 章 データ型の変換
文字から DATE への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、日付データの代替書式化を可能にする FORMAT 句
などのデータ属性を使用することができます。
Teradata 変換構文
character_expression
(
DATE
data_attribute ,
)
, data_attribute
構文要素
character_expression
DATE 値にキャストされる文字表現。
data_attribute
以下の任意選択のデータ属性のうちの 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
文字から DATE への暗黙的な変換
文字列が有効な日付を表わしていない場合は、エラーが報告されます。
レコードまたは標識モードでは、セッションの DateForm モードが ANSIDate に設定
された場合、文字列は ANSI DATE 形式を使用する必要があります。
使用上の注意
文字式は、先行および後続の埋め込み文字が調整され、DATE 定数の宣言内の文字列
定数であるかのように処理されます。
文字から DATE への変換は、CHAR および VARCHAR タイプしかサポートされませ
ん。CLOB をソース文字タイプとすることはできません 。
有効な DATE に変換できる場合には、文字列は変換されます。そうでない場合には、
エラーが返されます。
538
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から DATE への変換
文字列の書式
現在のセッションの日付形式が INTEGERDATE の場合、文字列での日付表記は、次
の表に示すルールに従って、DATE 出力書式と一致しなければなりません。
文
結果
DATE に
FORMAT 句を指
定する場合
文字列はその DATE 書式と一致しなければなりません。
FORMAT 句を指
定しない場合
DATE 列定義
FORMAT 句を指定する場合、文字列はその DATE 書式と一致しなければ
なりません。
FORMAT 句を指定しない場合、文字列は「YY/MM/DD」、またはデー
タ書式設定(SDF)ファイル内で指定の、デフォルトの日付書式の現行の設
定に一致しなければなりません。
例については、「例: IntegerDate 日付形式モード」を参照してください。
現行セッションの日付形式が ANSIDATE の場合、文字列での日付表記は、次の表に
示すルールに従って、DATE 出力書式と一致しなければなりません。
文
結果
DATE に FORMAT 句 文字列はその DATE 書式と一致しなければなりません。
を指定する場合
FORMAT 句を指定し フィールド モードでの DATE 列定義:
ない場合
• FORMAT 句を指定する場合、文字列はその DATE 書式と一致しな
ければなりません。
• FORMAT 句を指定しない場合、文字列は ANSI フォーマット
('YYYY-MM-DD')と一致する必要があります。
レコード モードまたは標識モードの場合、ANSI フォーマット('YYYYMM-DD')に合致する文字列。
文字から DATE への変換に対する CAST での FORMAT の強制
FORMAT 句を使用することで、ターゲットの DATE データ タイプの書式とマッチン
グしない文字列を変換することができます。FORMAT 句を指定しない変換の場合、
文字列には DATE データ タイプの出力書式が使用されます。
たとえば、セッションの日付形式が INTEGERDATE で、tdlocaledef ユーティリティ
によってシステムのデフォルトの DATE 書式が 'yyyymmdd' に設定されているとし
ます。次の文では文字列の中に分離文字があり、これはデフォルトの DATE 書式と
一致しないため、失敗します。
SELECT CAST ('2005-01-01' AS DATE);
SQL 関数、演算子、式および述部
539
第 13 章 データ型の変換
文字から DATE への変換
デフォルトの DATE 書式をオーバーライドし、分離文字の入った文字列を変換する
には、DATE ターゲット タイプに FORMAT 句を指定します。
SELECT CAST ('2005-01-01' AS DATE FORMAT 'YYYY-MM-DD');
文字から DATE への変換では、FORMAT 句は以下の書式設定文字だけで構成すべき
ではありません。
• EEEE
• EEE
• E4
• E3
日、月、または年が省略された文字列
文字から DATE に変換される文字列と書式で日、月、または年が省略されている場
合、システムは変換先の DATE 値のデフォルト値を使用します。
文字列から省略されているもの
システムが使用する値
日
値 1 (月の最初の日)。
月
値 1 (1 月)。
年
現在の年(現在のセッションのタイムゾーン
で)
次の表について考察します。
CREATE TABLE date_log
(id INTEGER
,start_date DATE
,end_date DATE
,log_date DATE);
次の INSERT 文は、3 つの文字列を DATE 値に変換します。最初の文字列では日が省
略され、2 番目と 3 番目の文字列ではそれぞれ、月と年が省略されています。現在
は 1992 年であると仮定しましょう。
INSERT date_log
(1001
,CAST ('January 1992' AS DATE FORMAT 'MMMMBYYYY')
,CAST ('1992-01' AS DATE FORMAT 'YYYY-DD')
,CAST ('01/01' AS DATE FORMAT 'MM/DD'));
INSERT 文の結果は、以下のようになります。
SELECT * FROM date_log;
id start_date
----------- ---------1001
92/01/01
540
end_date
-------92/01/01
log_date
-------92/01/01
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から DATE への変換
例
例: IntegerDate 日付形式モード
たとえば、セッションの日付形式が INTEGERDATE で、tdlocaledef ユーティリティ
によってシステムのデフォルトの DATE 書式が'yyyymmdd'に設定されているとしま
す。
次の表を考えてみましょう。この表の start_date 列ではデフォルトの DATE 書式を
使用し、end_date 列では書式'YYYY/MM/DD'を使用しています。
CREATE TABLE date_log
(id INTEGER
,start_date DATE
,end_date DATE FORMAT 'YYYY/MM/DD');
次の INSERT 文は、文字列が対応する DATE 列の書式と一致するので目的どおりに
機能し、Teradata Database は、文字から DATE への暗黙の変換を正常に実行するこ
とができます。
INSERT INTO date_log (1099, '20030122', '2003/01/23');
対応する DATE 列の書式と一致しない文字列を文字から DATE に変換するには、
FORMAT 句を使用する必要があります。
INSERT INTO date_log
(1047
,CAST ('Jan 12, 2003' AS DATE FORMAT 'MMMBDD,BYYYY')
,CAST ('Jan 13, 2003' AS DATE FORMAT 'MMMBDD,BYYYY'));
例: ANSIDate 日付形式モード
セッション日付形式が ANSIDATE であるとします。システムのデフォルトの DATE
フォーマットは'YYYY-MM-DD'です。
次の表を考えてみましょう。この表の start_date 列ではデフォルトの DATE 書式を
使用し、end_date 列では書式'YYYY/MM/DD'を使用しています。
CREATE TABLE date_log
(id INTEGER
,start_date DATE
,end_date DATE FORMAT 'YYYY/MM/DD');
次の INSERT 文は、文字列が対応する DATE 列の書式と一致するので目的どおりに
機能し、Teradata Database は、文字から DATE への暗黙の変換を正常に実行するこ
とができます。
INSERT INTO date_log (1099, '2003-01-22', '2003/01/23');
対応する DATE 列の書式と一致しない文字列を文字から DATE に変換するには、
FORMAT 句を使用する必要があります。
SQL 関数、演算子、式および述部
541
第 13 章 データ型の変換
文字から INTERVAL への変換
INSERT INTO date_log
(1047
,CAST ('Jan 12, 2003' AS DATE FORMAT 'MMMBDD,BYYYY')
,CAST ('Jan 13, 2003' AS DATE FORMAT 'MMMBDD,BYYYY'));
例: 文字から DATE への暗黙的な変換
セッションの DateForm モードが ANSIDate に設定されていると想定します。
以下の CREATE TABLE 文は、DATE データ タイプ列に FORMAT 句を指定します。
CREATE SET TABLE datetab (f1 DATE FORMAT 'MMM-DD-YYYY');
フィールド モードでは、以下の INSERT 文は、文字列の書式が datetab テーブルの
DATE 列の書式に従っているので、文字から DATE への暗黙的な変換を正常に実行し
ます。
INSERT INTO datetab ('JAN-10-1999');
レコード モードでは、セッションの DateForm モードが ANSIDate に設定されてい
る場合、以下の INSERT 文は、文字列の書式が ANSI TIME 書式なので、文字から
DATE への暗黙的な変換を正常に実行します。
INSERT INTO datetab ('2002-05-10');
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 例については、「例: ANSIDate 日付形式モード」を参照してください。
• デフォルトの書式および FORMAT 句については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
文字から INTERVAL への変換
目的
文字列を間隔値に変換します。
CAST 構文
CAST
( character_expression
AS
interval_data_type
)
data_attribute
542
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から INTERVAL への変換
構文要素
character_expression
変換する文字式。
interval_data_type
式が変換される INTERVAL データ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI SQL の拡張機能として、Teradata はデータ属性の仕様をサポートします。
Teradata 変換構文
character_expression
(
interval_data_type
data_attribute ,
)
, data_attribute
説明:
構文要素
character_expression
INTERVAL 値にキャストされる文字表現。
data_attribute
以下の任意選択のデータ属性のうちの 1 つ。
• NAMED
• TITLE
interval_data_type
character_expression の変換先の INTERVAL データ型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
543
第 13 章 データ型の変換
文字から数値への変換
使用上の注意
文字の値は、先行および後続の埋め込み文字が除去され、INTERVAL 文字列定数の
宣言内の文字列定数であるかのように処理されます。
文字から INTERVAL への変換は、CHAR および VARCHAR タイプしかサポートされ
ません。CLOB をソース文字タイプとすることはできません 。
文字列の内容は、有効な INTERVAL 値に変換できる場合には変換が行なわれ、それ
以外の場合にはエラーが戻されます。
GRAPHIC の文字データ タイプを INTERVAL 文字列定数に変換することはできません。
例
例: CAST での問合わせ
以下の問合わせは' -265-11'を戻します。
SELECT CAST('-265-11' AS INTERVAL YEAR(4) TO MONTH);
例: INTERVAL 値への変換
ソース文字列が INTERVAL 形式に正規化されていない値を含んでいるにもかかわら
ず、正しい INTERVAL に変換できる場合には、変換が行なわれます。
たとえば、以下の問合わせは'-267-06'を戻します。
SELECT CAST('265-30' AS INTERVAL YEAR(4) TO MONTH);
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
文字から数値への変換
目的
文字データ列を数値へ変換します。
CAST 構文
CAST
(character_expression
AS
numeric_data_type
)
data_attribute
544
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から数値への変換
構文要素
character_expression
変換する文字式。
numeric_data_definition
character_expression の変換先の数値型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、数値型データの代替書式化を可能にする FORMAT
句などのデータ属性を使用することができます。
Teradata 変換構文
character_expression
(
numeric_data_type
data_attribute ,
)
, data_attribute
構文要素
character_expression
変換する文字式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
numeric_data_type
式が変換されるデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
545
第 13 章 データ型の変換
文字から数値への変換
文字から数値への暗黙的な変換
文字から数値への暗黙の変換が有効な結果になるのは、文字列が数値を表わしてい
る場合のみです。
数のオペランドが必要な式に CHAR または VARCHAR 文字列がある場合、その文字
列は書式化された数として読み取られ、FLOAT のデフォルトの書式で FLOAT 値に変
換されます。
暗黙の書式をオーバーライドするには、FORMAT 句を使用します。
または、FLOAT のデフォルト フォーマットを変更するには、REAL 構成要素の設定
を、SDF(データ フォーマット仕様)ファイルで変更することができます。デフォルト
のデータ型フォーマット、SDF ファイル、FORMAT 句については、< SQL データ型
とリテラル、B035-1143>の「データ型のフォーマットおよびフォーマット句」を参
照してください。
数値オペランドが必要な式で CLOB タイプを使用する場合、まず CLOB を CHAR ま
たは VARCHAR に明示的に変換する必要があります。
空の文字列(長さがゼロ)または埋め込み文字だけで構成されている文字列は、数値が
ゼロであるとみなされます。
FLOAT のデフォルトの書式が-9.99E-99 の場合、以下のようになります。
式
変換後
結果
1.1*’$20.00’
1.10E 00*2.00E1
2.20E 01
’2’+’2’
2.00E 00+2.00E 00
4.00E 00
’A’ + 2
----------
エラー
数値データ型の列またはパラメータが文字列値で指定されている場合、その文字列
も、書式化された数値であるとみなされます。たとえば、次の INSERT 文は、Salary
を数値の文字列として指定しています。
INSERT INTO Employee (EmpNo, Name, Salary)
VALUES (10022, 'Clements D', '$38,000.00');
数値型への変換は、編集用の記号を取り除きます。選択された時に、給与データは、
CREATE TABLE 文中で Salary 用に FORMAT 句で許可された特殊文字だけを含みま
す。FORMAT 句が'G-(9)D9(2)'の場合、出力は以下のようになります。
Salary
--------38,000.00
FORMAT 句が'G-L(9)D9(2)'の場合、出力は以下のようになります。
Salary
---------$38,000.00
546
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から数値への変換
サポートされる文字タイプ
変換する文字式は CHAR または VARCHAR でなければなりません。CLOB を明示的
に数値タイプに変換することはできません。
使用上の注意
処理を開始する前に、数値の記述節が FORMAT 句についてスキャンされます。これ
は基数分離文字、グループ分離文字、通貨記号または文字列、サインゾーン(S)、ま
たは暗黙小数点(V)書式設定を決定するために使用されます。
変換は、文字ごとに左から右へと数値の終わりまで順番に行なわれます。
すべて数値の文字列だけを文字書式から数値書式に変換できます。例えば、文字列
‘US Dollars 123456’または‘123456’を整数値 123456 に変換することはできます
が、文字列‘EX1AM2PL3E’を数値に変換することはできません。
次のリストに、文字タイプ データを数値タイプに変換するためのステップを示しま
す。GRAPHIC 文字タイプの character_expression を数値に変換できないことに注意
する必要があります。
変換は前のステップに戻ることなく順番に行なわれますが、ステップは飛ばされる
ことがあります。
1 先行の埋め込み文字は無視されます。符号付きゾーン小数の入力を除いて、先
行の埋め込み文字は無視されます。
埋め込みスペースを使用できるのは、以下の規則に従える場合のみです。
• 現在の SDF ファイルでグループ分離文字としてスペースが定義されていれ
ば、文字列の基数分離文字の左の桁グループを分離するのにスペースを使用
できます。このとき、GroupingRule または CurrencyGroupingRule で定義さ
れるグループ化規則に従います。
• 現在の SDF ファイルで基数分離文字としてスペースが定義されていれば 、文
字列に基数文字としてスペースを 1 つ含めることができます。
• FORMAT 句に N などの通貨書式設定文字が含まれていて、SDF ファイルの中
のそれに適合した CurrencyName などの通貨文字列にスペースが含まれる場
合は、文字列にその通貨文字列の一部としてスペースを含めることができます。
2 符号(+または-)は、数値の一部として保存されます。仮数記号は、文字列の最初
の数字の前、または文字列の最後の数字の後に置くことができます。指数記号
は、仮数符号の後に置くことができます。
3 FORMAT と一致する場合、通貨記号は無視されます。FORMAT と一致する場合、
通貨文字列は無視されます。文字列ではただ 1 つの通貨だけが許可されます。
4 数字は、基数または英字 E の構文解析に応じて、整数、小数、または指数部分
として保存されます。
5 FORMAT で指定された基数に一致しない限り、分離文字は無視されます。
SQL 関数、演算子、式および述部
547
第 13 章 データ型の変換
文字から数値への変換
分離文字が FORMAT で指定された基数に一致する場合、位置はその数の小数部
の始めとして保存されます。V は、暗黙小数の小数部分をマークします。
通貨および分離文字が許容されているのは、文字から数値への変換に関する非
ANSI 標準の Teradata 拡張機能です。
6 (数字間の)埋め込みダッシュは、その数が符号付きであったり、基数、通貨、ま
たは指数が付帯していたりしない限り、許可されます。
7 英字の E は、その数の指数部の始めとして保存されます。E の後ろには、1 個の
空白が許可されています。
8 指数部の符号(+ または -)は保存されます。
9 指数部の数字は保存されます。符号が、指数部の数字の後ろにあってはなりませ
ん。
数値の桁あふれ
フィールド モードの場合、文字から数値への変換の際の数値桁あふれは、エラーと
して扱われません。結果がデータ タイプ用に予約されている通常の桁数を超えると、
アスタリスクが表示されます。
レコードおよび標識変数モードでは、数値の桁あふれはエラーとして報告されます。
この動作は、CAST および Teradata 変換構文のどちらにも適用されます。
FORMAT 句によるデータの構文解析の制御
FORMAT 句それ自体は、文字タイプの値を数値タイプの値に変換することはできま
せん。この句は、結果の値の構文解析方法を部分的に制御します。
文字から数値への変換の例を、以下の表にいくつか挙げます。G、D、C、および N
書式制御文字を含む FORMAT 句の場合、データ書式設定ファイル(SDF)の指定にあ
る関連項目は以下のようであると想定します。
RadixSeparator
GroupSeparator
GroupingRule
Currency
ISOCurrency
CurrencyName
548
{"."}
{","}
{"3"}
{"$"}
{"USD"}
{"US Dollars"}
文字列
変換後
結果の数値
フィールド モードで表示
される結果
'$20,000.00'
DECIMAL(10,2)
20000.00
20000.00
'$$$.50'
DECIMAL(10,2)
エラー
エラー
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から数値への変換
文字列
変換後
結果の数値
フィールド モードで表示
される結果
文字列ではただ
1 つの通貨だけ
が許可されま
す。
'$.50'
DECIMAL(8,2)
.50
.50
'.345'
DECIMAL(8,3)
.345
.345
'-1.234E-02'
FLOAT
-.01234
-.01234
'-1E.-2'
FLOAT
エラー
エラー
数字の指数部分
の前に基数がな
ければなりませ
ん。
'00000000-.93'
DECIMAL(12,4)
エラー
エラー
基数の入った文
字列内では、埋
め込みダッシュ
は使用できませ
ん。
'- 55'
INTEGER
-55
-55
'E67'
FLOAT
0.0
0E 000
'9876'
DECIMAL(4,2)
FORMAT '99V99'
98.76
9876
'-123'
INTEGER
-123
-123
'9876'
DECIMAL(4,2)
FORMAT '9(2)V9(2)'
98.76
9876
'1-2-3'
INTEGER
123
123
'123-'
INTEGER
-123
-123
'123- '
INTEGER
-123
-123
'-1.234E 02'
FLOAT
-123.4
-1.23400000000000E
002
'111,222,333'
INTEGER
FORMAT 'G9(I)'
111222333
0,111,222,333
SQL 関数、演算子、式および述部
549
第 13 章 データ型の変換
文字から Period への変換
文字列
変換後
結果の数値
フィールド モードで表示
される結果
'2.49US Dollars'
DECIMAL(10,2)
FORMAT 'GZ(I)D9(F)BN'
2.49
2.49 US Dollars
'25000USD'
INTEGER
FORMAT '9(I)C'
25000
0000025000USD
FORMAT 句を指定しない変換は、SDF で定義されている、対応のデータ タイプのデ
フォルト書式を使用します。
例: 文字から数値への暗黙的な変換
以下の例の INSERT 文は、文字データ タイプを変換先の数値データ タイプに暗黙的
に変換します。
CREATE TABLE t1
(f1 DECIMAL(10,2) FORMAT 'G-U(9)D9(2)');
INSERT t1 ('USD12,345,678.90');
CREATE TABLE 文の列定義がデータ タイプに FORMAT 句を指定していない場合、
列は、データ書式設定(SDF)ファイルの指定で定義されている、対応するデータ タイ
プのデフォルト書式を使用します。
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• デフォルトのデータ タイプ書式、SDF ファイル、および FORMAT 句における書
式設定文字の意味の詳細については、< SQL データ型とリテラル、B035-1143>
の「データ タイプの書式および書式句」を参照してください。
文字から Period への変換
目的
文字列を Period 値に変換します。
CAST 構文
CAST
( character_expression
AS
period_data_type
)
data_attribute
550
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から Period への変換
構文要素
character_expression
変換する文字式。
period_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
文字値式は、CAST 関数または暗黙のキャストを使用して、PERIOD(DATE)、
PERIOD(TIMESTAMP)、または PERIOD(TIMESTAMP WITH TIME ZONE)タイプとし
てキャストできます。文字入力値も、Period タイプとして暗黙的にキャストできま
す。
変換元の文字値に含まれる先行および後続の埋め込み文字を除去した後、結果とし
ての文字列は変換先タイプの書式に従っている必要があります。日時値に対応する
文字値式の開始部分と終了部分の変換は、CHARACTER/VARCHAR から日時データ
型の変換の既存のルールに従います。
既存のルールには、変換元に指定されたタイムゾーン、または指定されていない場
合には、現在のセッションのタイムゾーンに基づいて、TIME または TIMESTAMP
形式の変換元の値から UTC への変換が含まれます。Period データ タイプから UTC
への変換には例外があります。変換元の文字の終了部分がタイムゾーンを持たない
TIMESTAMP 値のときに、値が UNTIL_CHANGED を表わすために使用される最大値
と等しい場合、その値は UTC に変換されません。
変換先タイプが TIME または TIMESTAMP 要素タイプを持ち、文字値式の開始境界
または終了境界の部分にうるう秒が含まれている場合、秒部分は変換先の精度にま
で精度を切り詰めた 59.999999 に調整されます。
変換先タイプが TIME または TIMESTAMP 要素タイプを持ち、その変換先の精度が
変換元の文字列に指定されているいずれの精度よりも低い場合には、エラーが報告
されます。変換先の精度が変換元の文字列の境界に指定された精度より高い場合、
キャストの結果得られる Period 値の対応する境界の秒の小数桁の末尾にゼロが追加
されます。
SQL 関数、演算子、式および述部
551
第 13 章 データ型の変換
文字から Period への変換
変換先の要素は、それに対応する結果値に設定します。
結果の開始境界が、UTC 形式で結果の終了境界以上になると、エラーが報告されます。
変換時に ANSI 日時形式を使用して文字データを解釈する場合、開始値と終了値を単
一引用符で囲むかどうかは任意選択です。詳細については、「ANSI DateTime フォー
マットを使用する文字列」を参照してください。
文字から Period への暗黙的変換
CHARACTER 値または VARCHAR 値は、変換先が Period データ タイプを持つ場合の
代入、更新、挿入、マージ、またはパラメータを渡す操作と、他のオペランドに
Period データ タイプがある場合の比較操作のときに、Period データ タイプとして
暗黙的にキャストされます。その他の非 Period 値が期間である変換先に直接代入さ
れると、エラーが報告されます。同様に、その他の非 Period 値を Period 値と直接
比較しても、エラーが報告されます。
注: 場合によっては、このエラーを回避するため、値を明示的に Period データ タイ
プとしてキャストすることがあります。
応答モードがフィールド モード以外の場合や、文字列データがパラメータ化されて
いる場合には、CHARACTER または VARCHAR から Period データ タイプへの暗黙的
な変換時に、文字列内の開始要素値と終了要素値を解釈するために ANSI 日時書式の
文字列が使用されます。応答モードがフィールド モードであり、文字列データがパ
ラメータ化されていない場合には、文字列内の開始要素値と終了要素値を解釈する
ために変換先の期間の書式が使用されます。以下の表では、この点を詳しく説明し
ます。
モード
パラメータ化されたデータの有無
暗黙的なキャストの解釈に使用され
る書式
フィールド
無し
変換先の書式
フィールド
有り
ANSI 書式
非フィールド
有り
ANSI 書式
非フィールド
無し
ANSI 書式
ANSI 日時書式の文字列を使用して、文字列内の開始要素値と終了要素値を解釈する
場合、開始値と終了値を単一引用符で囲むかどうかは任意選択です。このような自
由度は明示的キャストの場合にも適用されます。
ANSI 日時書式を使用する文字列
以下に、文字列から期間への暗黙的または明示的な変換で ANSI 日時書式を使用して
開始境界および終了境界の要素を解釈する場合に有効な文字列表記の一覧を示します。
• '(''beginning_element_value '' ,Δ''ending_element_value '')'
• '(beginning_element_value , Δending_element_value )'
552
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIME への変換
• '(''beginning_element_value '', Δending_element_value )'
• '(beginning_element_value , Δ''ending_element_value '')'
beginning_element_value と ending_element_value の形式は、変換先データ型に
よって異なります。
変換先データ タイプ
書式
PERIOD (DATE)
YYYY-MM-DD
PERIOD(TIME [(n)])
HH:MI:SS.S(F)
PERIOD(TIMESTAMP [(n)])
YYYY-MM-DDBHH:MI:SS.S(F)
例: 連結された文字リテラルのキャスト
以下の例では、2 つの連結された文字リテラルが PERIOD(TIMESTAMP(2))として
キャストされます。出力は、表示時に現在のセッションのタイムゾーンに応じて調
整されます。現在のセッションのタイムゾーン変位は INTERVAL -'08:00' HOUR TO
MINUTE で、SDF に基づいて得られた書式が「YYYY-MM-DDBHH:MI:SS.S(2)Z」だ
とします。
SELECT CAST('(''2005-02-02 12:12:12.34+08:00'', ' ||
'''2006-02-03 12:12:12.34+08:00'')'
AS PERIOD(TIMESTAMP(2)));
次の PERIOD(TIMESTAMP(2))値が返されます。
('2005-02-01 20:12:12.34', '2006-02-02 20:12:12.34')
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 書式設定文字の意味は、< SQL データ型とリテラル、B035-1143>にある FORMAT
句の説明を参照してください。
• 詳細については、「ANSI DateTime フォーマットを使用する文字列」を参照して
ください。
文字から TIME への変換
目的
文字データ列を TIME または TIME WITH TIME ZONE 値に変換します。
SQL 関数、演算子、式および述部
553
第 13 章 データ型の変換
文字から TIME への変換
CAST 構文
CAST
A
( character_expression
A
AS
)
TIME
(fractional_seconds_precision)
WITH TIME ZONE
data_attribute
構文要素
character_expression
変換する文字式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、TIME タイプ データの代替出力書式化を可能にす
る FORMAT 句などのデータ属性を使用することができます。
注: TIME(タイムゾーンなし)は、ANSI SQL:2011 準拠ではありません。Teradata
Database は、現行セッションのタイムゾーン、または指定されたタイムゾーンに基
づいて、TIME 値を内部的に UTC に変換します。
Teradata 変換構文
character_expression
(
A
TIME
(fractional_seconds_precision)
data_attribute ,
)
A
,
data_attribute
WITH TIME ZONE
554
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIME への変換
構文要素
character_expression
変換する文字式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
文字から TIME への暗黙的な変換
フィールド モードでは、文字列は変換先の TIME タイプの形式に従う必要がありま
す。
レコードまたは標識モードでは、文字列は ANSI TIME 書式を使用する必要がありま
す。
使用上の注意
文字値は、先行および後続の埋め込み文字が調整され、TIME 文字定数の宣言内の
文字列定数であるかのように処理されます。
文字列の内容は、有効な TIME に変換できる場合には変換が行なわれ、それ以外の
場合にはアプリケーションにエラーが戻されます。
文字から TIME への変換は、CHAR および VARCHAR タイプのみサポートされます。
CLOB または GRAPHIC の文字データ タイプを TIME に変換することはできません。
FORMAT 句を使用して、変換先の TIME データ タイプの明示的書式を指定できま
す。FORMAT 句を指定しない変換は、TIME データ タイプのデフォルト書式を使用
します。
文字列の変換先
デフォルト書式
TIME
タイムゾーン書式設定文字を使用せず、タイムゾーンを表示
しない。
SQL 関数、演算子、式および述部
555
第 13 章 データ型の変換
文字から TIME への変換
文字列の変換先
デフォルト書式
TIME WITH TIME ZONE
タイムゾーン書式設定文字を使用して、タイムゾーンを表示
する。
タイムゾーンを組み込んだ変換
タイムゾーンを組み込んだ文字から TIME への変換には、以下の規則が適用されます。
• 変換先のデータ型がタイムゾーンを指定しない場合、例えば TIME(0)の変換元文
字列には、形式+hh:mi または-hh:mi のタイムゾーンを含めることができますが、
それを指定できるのは時刻の直前または直後のみです。
たとえば、以下の変換は正常に実行されます。
SELECT CAST ( '-02:0011:23:44'
AS TIME(0) );
以下の変換は、タイムゾーンと時刻との間のブランク分離文字が原因で失敗しま
す。
SELECT CAST ( '+02:00 11:23:44.56'
AS TIME(2) );
• ソース文字列にタイムゾーンが含まれており、ターゲットのデータ型がタイム
ゾーン(例えば TIME(0))を指定していない場合、変換では文字列内のタイムゾー
ンを使用して、文字列を万国標準時(UTC)に変換します。これは、FORMAT 句に
タイムゾーンのフォーマット文字が含まれているかどうかに関係なく実行されま
す。
SELECT CAST ('10:15:12+12:30'
AS TIME(0));
• 変換元の文字列にタイムゾーンが含まれておらず、変換先のデータ型がタイム
ゾーンと変換先の FORMAT 句を指定し、FORMAT 句にはタイムゾーン書式設定
文字が含まれる場合、出力にはセッションのタイムゾーンが含まれます。
SELECT CAST ('10:15:12'
AS TIME(0) WITH TIME ZONE FORMAT 'HH:MI:SSBZ');
• 変換元の文字列と変換先のデータ タイプの両方がタイムゾーンを指定していない
場合、変換元の文字列は現在のセッションのタイムゾーンに基づいて、内部的に
UTC に変換されます。
小数秒を組み込んだ変換
小数秒が含まれる変換には、以下の規則が適用されます。
• 変換元の文字列の小数秒の精度は、変換先の型で指定された小数秒の精度以下で
なければなりません。
556
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIME への変換
SELECT CAST('12:30:25.44' AS TIME(3));
小数秒が変換元の文字列に表示されない場合、小数秒の精度は必ず変換先のデー
タ タイプの小数秒の精度以下となります。これは精度の有効範囲が 0~6 である
からです(デフォルトは 6)。
SELECT CAST('12:30:25' AS TIME(3));
• 変換先のデータ型が FORMAT 句で定義されている場合、小数秒精度の書式設定
文字は、データ型によって指定された精度以上でなければなりません。
SELECT CAST('12h:15.12s:30m'
AS TIME(4) FORMAT 'HHh:SSDS(4)s:MIm');
FORMAT 句は、変換先のデータ タイプで小数秒の精度を指定していない場合、
デフォルトの精度は 6 なので、小数秒の精度を 6 に指定する必要があります。
SELECT CAST ('12:30:25' AS TIME FORMAT 'HH:MI:SSDS(6)');
時間、分、または秒が省略された文字列
文字から TIME に変換される文字列で時間、分、または秒が省略されている場合、
システムは変換先の TIME 値のデフォルト値を使用します。
文字列から省略されているもの
システムが使用する値
時間
値 0。
分
秒
次の表について考察します。
CREATE TABLE time_log
(id INTEGER
,start_time TIME
,end_time TIME
,log_time TIME);
次の INSERT 文は、3 つの文字列を TIME 値に変換します。最初の文字列では時間
が省略され、2 番目と 3 番目の文字列ではそれぞれ、分と秒が省略されています。
INSERT time_log
(1001
,CAST ('01:02.030405' AS TIME FORMAT 'MI:SS.S(6)')
,CAST ('01:02.030405' AS TIME FORMAT 'HH:SS.S(6)')
,CAST ('01:02' AS TIME FORMAT 'HH:MI'));
INSERT 文の結果は、以下のようになります。
SQL 関数、演算子、式および述部
557
第 13 章 データ型の変換
文字から TIME への変換
SELECT * FROM time_log;
id
start_time
----------- --------------1001 00:01:02.030405
end_time
--------------01:00:02.030405
log_time
--------------01:02:00.000000
FORMAT 句の制限事項
文字から TIME への変換では、FORMAT 句は以下の書式設定文字だけで構成すべき
ではありません。
• Z
• T
例
例: 小数桁
この問合わせは、値'12:23:39.999900'を戻します(TIME(6)タイプに CAST するよう
に要求されたため、小数の秒は 6 桁に拡張される)。
SELECT CAST(' 12:23:39.9999 '
AS TIME(6));
例: 非埋め込み文字データの切り捨て
要求された変換には非埋め込み文字のデータの切り捨てが必要であるため、この問
合わせはエラーを戻します。
SELECT CAST(' 12:23:39.9999 '
AS TIME(3));
例: 無効な MINUTE 値
63 という MINUTE 値は有効ではないため、この問合わせはエラーを戻します。
SELECT CAST(' 12:63:39.9999 '
AS TIME(6));
例: FORMAT 句
この問合わせは値'15h33m'を戻します。
SELECT CAST('15h33m'
AS TIME(0) FORMAT 'HHhMIm');
例: 文字から TIME への暗黙的な変換
以下の CREATE TABLE 文は、TIME データ タイプ列に FORMAT 句を指定します。
CREATE SET TABLE timetab (f1 TIME(0) FORMAT 'TBHHhMImSSs');
558
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIMESTAMP への変換
フィールド モードでは、以下の INSERT 文は、文字列の書式が timetab テーブルの
TIME 列の書式に従っているので、文字から TIME への暗黙的な変換を正常に実行
します。
INSERT INTO timetab ('AM 10h20m30s');
レコード モードでは、以下の INSERT 文は、文字列の書式が ANSI TIME 書式なの
で、文字から TIME への暗黙的な変換を正常に実行します。
INSERT timetab ('11:23:34');
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• デフォルトの書式および FORMAT 句については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
文字から TIMESTAMP への変換
目的
文字データ列を TIMESTAMP または TIMESTAMP WITH TIME ZONE 値に変換しま
す。
CAST 構文
CAST
( character_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
)
A
WITH TIME ZONE
data_attribute
構文要素
character_expression
変換する文字式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
SQL 関数、演算子、式および述部
559
第 13 章 データ型の変換
文字から TIMESTAMP への変換
timestamp_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、TIME データの代替書式化を可能にする FORMAT
句などのデータ属性を使用することができます。
注: TIMESTAMP(タイムゾーンなし)は、ANSI SQL:2011 準拠ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
Teradata 変換構文
CAST
( character_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
)
A
WITH TIME ZONE
data_attribute
構文要素
character_expression
変換する文字式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
560
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIMESTAMP への変換
文字から TIMESTAMP への暗黙的な変換
フィールド モードでは、文字列は変換先の TIMESTAMP タイプの形式に従う必要が
あります。
レコードまたは標識モードでは、文字列は ANSI TIMESTAMP 書式を使用する必要
があります。
使用上の注意
変換元の式は、先行および後続の埋め込み文字が調整され、TIMESTAMP 文字列定
数の宣言内の文字列定数であるかのように処理されます。
文字から TIMESTAMP への変換は、CHAR および VARCHAR タイプしかサポートさ
れません。CLOB または GRAPHIC 文字データ タイプを TIMESTAMP に変換するこ
とはできません。
文字列の内容は、有効な TIMESTAMP 値に変換できる場合には変換が行なわれ、そ
れ以外の場合にはエラーが戻されます。
FORMAT 句を使用して、変換先の TIMESTAMP データ タイプの明示的書式を指定
できます。FORMAT 句を指定しない変換は、TIMESTAMP データ タイプのデフォル
ト書式を使用します。
文字列の変換先
デフォルト書式
TIMESTAMP
タイムゾーン書式設定文字を使用せず、タイ
ムゾーンを表示しない。
TIMESTAMP WITH TIME ZONE
タイムゾーン書式設定文字を使用して、タイ
ムゾーンを表示する。
例: CAST での問合わせ
次の問合わせは‘2007-12-31 23:59:59.999999-08:00’を戻します。
SELECT CAST('2007-12-31 23:59:59.999999'
AS TIMESTAMP(6) WITH TIME ZONE);
ソース文字列は、この変換が正しく行なわれるために明示的なタイムゾーンフィー
ルドを持つ必要はない点に注意する必要があります。
タイムゾーンを組み込んだ変換
タイムゾーンを組み込んだ文字から TIMESTAMP への変換には、以下の規則が適用
されます。
• 変換先のデータ型がタイムゾーンを指定しない場合、例えば TIMESTAMP(0)の変
換元文字列には、形式+hh:mi または-hh:mi のタイムゾーンを含めることができ
ますが、それを指定できるのは時刻の直前または直後のみです。
SQL 関数、演算子、式および述部
561
第 13 章 データ型の変換
文字から TIMESTAMP への変換
たとえば、以下の変換は正常に実行されます。
SELECT CAST ( '2008-09-19 11:23:44-02:00'
AS TIMESTAMP(0) FORMAT 'Y4-MM-DDBHH:MI:SSBZ' );
以下の変換は、タイムゾーンと時刻との間のブランク分離文字が原因で失敗しま
す。
SELECT CAST ( '2008-01-19 +02:00 11:23:44'
AS TIMESTAMP(0) FORMAT 'Y4-MM-DDBZBHH:MI:SS' );
• ソースの文字列にタイムゾーンが含まれており、ターゲットのデータ型がタイム
ゾーンを指定していない場合、変換では文字列内のタイムゾーンを使用して、文
字列を万国標準時(UTC)に変換します。これは、FORMAT 句にタイムゾーンの
フォーマット文字が含まれているかどうかに関係なく実行されます。
SELECT CAST ('2002-02-20 10:15:12+12:30' AS TIMESTAMP(0));
• 変換先の FORMAT 句にタイムゾーンの書式設定文字が含まれており、変換先の文
字列にタイムゾーンが含まれていない場合、出力にはセッションのタイムゾーン
が入ります。これは、ターゲットのデータ型がタイムゾーンを指定しているかど
うかに関係なく実行されます。
SELECT CAST ('2002-02-20 10:15:12'
AS TIMESTAMP(0) WITH TIME ZONE FORMAT 'Y4-MM-DDBHH:MI:SSBZ');
• 変換元の文字列と変換先のデータ タイプの両方がタイムゾーンを指定していない
場合、変換元の文字列は現在のセッションのタイムゾーンに基づいて、内部的に
UTC に変換されます。
小数秒を組み込んだ変換
小数秒が含まれる変換には、以下の規則が適用されます。
• 変換元の文字列の小数秒の精度は、変換先の型で指定された小数秒の精度以下で
なければなりません。
SELECT CAST('2002-01-01 12:30:25.44' AS TIMESTAMP(3));
小数秒が変換元の文字列に表示されない場合、小数秒の精度は必ず変換先のデー
タ タイプの小数秒の精度以下となります。これは精度の有効範囲が 0~6 である
からです(デフォルトは 6)。
SELECT CAST('2002-01-01 12:30:25' AS TIMESTAMP(3));
• 変換先のデータ型が FORMAT 句で定義されている場合、小数秒精度の書式設定文
字は、データ型によって指定された精度以上でなければなりません。
SELECT CAST('12-02-07 12:30:25' AS TIMESTAMP(3)
FORMAT 'DD-MM-YYBHH:MI:SSDS(3)');
FORMAT 句は、変換先のデータ タイプで小数秒の精度を指定していない場合、
デフォルトの精度は 6 なので、小数秒の精度を 6 に指定する必要があります。
562
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から TIMESTAMP への変換
SELECT CAST('12-02-07 12h:15.12s:30m'
AS TIMESTAMP FORMAT 'DD-MM-YYBHHh:SSDS(6)s:MIm');
日、月、年、時間、分、または秒が省略された文字列
文字から TIMESTAMP に変換される文字列で日、月、年、時間、分、または秒が省
略されている場合、システムは変換先の TIMESTAMP 値のデフォルト値を使用しま
す。
文字列から省略されているもの
システムが使用する値
日
値 1 (月の最初の日)。
月
値 1 (1 月)。
年
現在の年。
時間
値 0。
分
秒
次の表について考察します。
CREATE TABLE timestamp_log
(id INTEGER, start_ts TIMESTAMP, end_ts TIMESTAMP);
次の INSERT 文は、2 つの文字列を TIMESTAMP 値に変換します。どちらの文字列
も時間、分、および秒が省略されています。さらに、最初の文字列では日が省略さ
れており、2 番目の文字列では月が省略されています。
INSERT timestamp_log
(1001
,CAST ('January 2006' AS TIMESTAMP FORMAT 'MMMMBYYYY')
,CAST ('2006-01' AS TIMESTAMP FORMAT 'YYYY-DD'));
INSERT 文の結果は、以下のようになります。
SELECT * FROM timestamp_log;
id
start_ts
----------- -------------------------1001 2006-01-01 00:00:00.000000
end_ts
-------------------------2006-01-01 00:00:00.000000
次に示す INSERT 文では、どちらの文字列も年が省略されています。さらに、最初
の文字列では時間が省略されており、2 番目の文字列では分が省略されています。
現在は 2003 年であると仮定しましょう。
INSERT timestamp_log
(1002
,CAST ('January 23 04:05' AS TIMESTAMP FORMAT 'MMMMBDDBMI:SS')
,CAST ('01-23 04:05' AS TIMESTAMP FORMAT 'MM-DDBHH:SS'));
SQL 関数、演算子、式および述部
563
第 13 章 データ型の変換
文字から UDT への変換
INSERT 文の結果は、以下のようになります。
SELECT * FROM timestamp_log WHERE id = 1002;
id
start_ts
end_ts
----------- -------------------------- -------------------------1001 2003-01-23 00:04:05.000000 2003-01-23 04:00:05.000000
FORMAT 句の制限事項
文字から TIMESTAMP への変換では、FORMAT 句は以下の書式設定文字だけで構成
すべきではありません。
•
•
•
•
•
•
EEEE
E4
EEE
E3
T
Z
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• デフォルトの書式および FORMAT 句については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
文字から UDT への変換
目的
文字データ列を UDT へ変換します。
CAST 構文
CAST
( character_expression
AS
UDT_data_type (
構文要素
character_expression
変換する文字式。
564
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字から UDT への変換
UDT_data_definition
式が変換されるデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った文字から UDT への明示的な変換はサポートされていま
せん。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
文字から UDT への暗黙的変換
Teradata Database は、以下の操作に対して文字から UDT への暗黙変換を実行しま
す。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST
定義(「使用上の注意」を参照)が存在する必要があります。
CAST 定義のソース文字タイプは、暗黙変換のソース文字タイプと正確に一致して
いる必要はありません。Teradata Database では、CHAR、VARCHAR、または CLOB
ソース タイプを指定する暗黙の CAST 定義を使用することができます。
別々の文字タイプから UDT への変換の場合に複数の暗黙 CAST 定義が存在する場
合、Teradata Database は優先順位の最も高い文字タイプの暗黙 CAST 定義を使用し
ます。以下のリストでは、文字タイプの優先順位が最低から最高の順に並べられて
います。
• CHAR
• VARCHAR
• CLOB
SQL 関数、演算子、式および述部
565
第 13 章 データ型の変換
文字から UDT への変換
CLOB 以外の文字タイプの場合、文字から UDT への暗黙 CAST 定義が存在しないと、
Teradata Database はその代用になる他の CAST 定義を探します。
存在する暗黙 CAST 定義の組み合わせ
Teradata Database の動作
Numeric- DATE- TIME- TIMESTAMP
to-UDT
to-UDT to-UDT -to-UDT
X
数値から UDT への暗黙 CAST 定義を使用する。
数値から UDT への暗黙 CAST 定義が複数存在す
る場合、Teradata Database は SQL エラーを戻
します。
X
DATE から UDT への暗黙 CAST 定義を使用する。
X
TIME から UDT への暗黙 CAST 定義を使用する。
X
X
X
X
エラーを報告する。
X
X
X
X
X
X
X
X
X
X
X
X
X
X
TIMESTAMP から UDT への暗黙 CAST 定義を使
用する。
X
X
X
X
X
X
X
X
X
X
X
Teradata Database は CLOB 以外の文字タイプを代用データ タイプに暗黙でキャス
トしてから、暗黙 CAST 定義を使用して、その代用データ タイプから UDT へのキャ
ストを行なえるため、代用は有効です。
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
566
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
文字データ タイプの割り当て規則
文字データ タイプの割り当て規則
サーバー文字セット
LATIN、UNICODE、KANJISJIS、KANJI1、および GRAPHIC のサーバー文字セット
は、基本的に相互に割り当てが可能です。
式を文字列の列に割り当てるとします。その割り当ては、SQL の UPDATE または
INSERT 文の結果になるか、またはロード ユーティリティの割り当ての結果になり
ます。
式は、文字の列のサーバー文字セットに変換されます。
GRAPHIC データの例外
GRAPHIC データには、以下の例外が適用されます。
• GRAPHIC データをインポートして、そのデータを文字の列に割り当てる場合、
その列を GRAPHIC として定義する必要があります。
• GRAPHIC ではない文字データの場合、そのデータを GRAPHIC として定義されて
いる列に割り当てることはできません。
詳細は、< SQL データ操作言語、B035-1146>の USING 行記述子の説明を参照し
てください。
• GRAPHIC 以外のデータを BTEQ またはロード ユーティリティから GRAPHIC 列
に割り当てることはできません。
詳細は、< SQL データ操作言語、B035-1146>の USING 行記述子の説明を参照し
てください。
• ASCII や EBCDIC などの 1 バイト文字セットから GRAPHIC データを割り当てた
り、エクスポートすることはできません。
DATE から文字への変換
目的
DATE 値を文字列へ変換します。
CAST 構文
CAST
( date_expression
AS
character_data_type
A
)
A
CHARACTER SET
SQL 関数、演算子、式および述部
server_character_set
data_attribute
567
第 13 章 データ型の変換
DATE から文字への変換
構文要素
date_expression
変換する日付式。
character_data_type
式が変換されるデータ型。
character_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で文字データ属性句を使用できます。
Teradata 変換構文
CAST
( date_expression
AS
character_data_type
A
)
A
CHARACTER SET
server_character_set
data_attribute
構文要素
date_expression
変換する日付式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
character_data_type
式が変換されるデータ型。
568
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から文字への変換
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
DATE から CHAR(n)または VARCHAR(n)への変換時に、n は、文字列定数によって
表わされた DATE 値の長さと等しいかそれよりも長くなければなりません。
変換先データ タ
イプ
n
CHAR(n)
文字列定数で表わされた DATE 値 末尾の埋め込み文字が表記を埋め
の長さより長い
るために追加される。
小さすぎる
VARCHAR(n)
結果
文字切り捨てエラーが戻される。
文字列定数で表わされた DATE 値 ブランク埋め込みは文字表記に追
の長さより長い
加されない。
小さすぎる
文字切り捨てエラーが戻される。
制約事項
サーバー文字セットが GRAPHIC の場合、暗黙的にも明示的にも DATE タイプを文
字タイプに変換することはできません。
DATE から CLOB への変換はサポートされていません。
DATE から文字への変換に対する CAST での FORMAT の強制
DATE から文字への変換のデフォルトの書式は、DATE 値に有効な書式を使用します。
デフォルトの書式をオーバーライドするには、FORMAT 句を使って、DATE 値を文
字列に変換できます。ただし、結果の書式は、DATE 値と同じになります。文字列
値で別の書式を使用する場合は、以下で説明するように CAST を併用する必要があ
ります。
DATE 値に関連する書式にかかわらず、DATE から CHAR に値を変換し、その結果に
おいて明示的な FORMAT を強制するには、入れ子 CAST 操作を行なう必要がありま
す。これは、FORMAT 句をデータ タイプに突き合わせるための規則によるものです。
SQL 関数、演算子、式および述部
569
第 13 章 データ型の変換
DATE から文字への変換
例
例: DATE 値から文字列への変換
セッションの日付形式モードが INTEGERDATE、テーブル INTDAT 内の列 F1 が明示
的なフォーマット'YYYY,MMM,DD'を持つ DATE 値であるとします。
SELECT F1 FROM INTDAT ;
結果(タイプの変更はなし)は、以下のレポートになります。
F1
---------1900,Dec,31
この値を CHAR(12)の値に変換し、'MMMBDD,BYYYY'の明示的な出力フォーマット
にすると仮定します。入れ子 CAST 句と FORMAT を使って、目的の結果を入手しま
す。 つまり、文字書式のレポートです。
SELECT
CAST( (CAST (F1 AS FORMAT 'MMMBDD,BYYYY')) AS CHAR(12))
FROM INTDAT;
入れ子 CAST の結果は、以下のレポートになります。
F1
-----------Dec 31, 1900
内部 CAST は DATE 値の表示書式を確立し、外部 CAST は必要な結果のデータ タイ
プを示します。
例: データ値を変換するスクリプトの作成
DATE 値のソースまたはセッションの DATEFORM モードにかかわらず、データ値を
ANSI DATE 書式に変換するためのスクリプトを作成する必要があると仮定します。
入れ子 CAST および FORMAT を使用して、以下の例に示すようにこれを行なうこと
ができます。
SELECT
CAST( (CAST (F1 AS FORMAT 'YYYY-MM-DD')) AS CHAR(10))
FROM INTDAT;
入れ子 CAST の結果は、以下のレポートになります。
F1
---------1900-12-31
570
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から DATE への変換
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
DATE から DATE への変換
目的
DATE から DATE への変換を使用して、DATE タイプの書式またはタイトルを変換し
ます。
CAST 構文
CAST
( date_expression
AS
)
DATE
data_attribute
data_attribute
構文要素
date_expression
変換する日付式。
date_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
CAST では、日付データの代替出力の書式化を可能にする FORMAT 句などのデータ
属性を使用することができます。これは、CAST の Teradata 拡張機能です。
日付形式が INTEGERDATE の DATE タイプを使用する DATE から DATE への変換は、
ANSI SQL:2011 の Teradata 拡張機能です。これは、CAST の Teradata 拡張機能で
す。
SQL 関数、演算子、式および述部
571
第 13 章 データ型の変換
DATE から DATE への変換
Teradata 変換構文
date_expression
(
DATE
)
, data_attribute
,
data_attribute
, DATE
, data_attribute
構文要素
date_expression
変換する日付式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
例: 従業員の生年月日の検索
セッション日付形式モードが INTEGERDATE で作成された employee という名前の
テーブルがあるとします。dob は書式が M3BDDBY4 の DATE 列です。1938 年 1 月
30 日から 1943 年 3 月 30 日の間に生まれた従業員をリストするには、日付情報を
次のように指定します。
SELECT name, dob
FROM employee
WHERE dob BETWEEN 'Jan 30 1938' AND 'Mar 30 1943'
ORDER BY dob;
結果は、Employee テーブルに指定されたとおりの誕生日が戻されます。
Name
---------Inglis C
Peterson J
DOB
----------Mar 07 1938
Mar 27 1942
日付の書式を別の書式に変更するには、次の SELECT 文にします。
572
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から数値への変換
SELECT name, dob (FORMAT 'yy-mm-dd')
FROM employee
WHERE dob BETWEEN 'Jan 30 1938' AND 'Mar 30 1943'
ORDER BY dob ;
書式の指定によって、表示が以下のように変わります。
Name
---------Inglis C
Peterson J
DOB
-------38-03-07
42-03-27
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
DATE から数値への変換
序
DATE データを以下の数値タイプに変換することができます。
•
•
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL(n, m)
NUMBER
FLOAT
CAST 構文
CAST
( date_expression
AS
)
numeric_data_type
data_attribute
構文要素
date_expression
変換する日付式。
numeric_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
SQL 関数、演算子、式および述部
573
第 13 章 データ型の変換
DATE から数値への変換
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で数値データ属性句を使用できます。
Teradata 変換構文
date_expression
numeric_data_type
(
)
data_attribute ,
, data_attribute
構文要素
date_expression
変換する日付式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
numeric_data_type
式が変換されるデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
日付を数値に変換すると、エンコードされて内部に格納された日付の整数値が戻さ
れます。この場合、以下の公式が使用されます。
(year - 1900) * 10000 + (month * 100) + day
指定可能な日付値は、西暦 0001 年 1 月 1 日~西暦 9999 年 12 月 31 日です。
たとえば、1985 年 12 月 31 日は整数 851231、1776 年 7 月 4 日は-1239296、
2041 年 3 月 30 日は 1410330 としてそれぞれ格納されます。
574
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から数値への変換
DATE から DECIMAL(n,m)への変換で、数字(n)の数が小さすぎる場合は、数値オー
バーフローのエラーが発生します。DATE から BYTEINT または SMALLINT への変
換では、戻される値がそのデータ タイプで表現できる値の範囲外である場合は、数
値桁あふれエラーが発生します。
DATE から INTEGER または FLOAT への変換では、エラーは生成されません。
FORMAT 句
DATE から数値への変換における FORMAT 句には、9 または Z の書式制御文字が含
まれるだけです。たとえば、
SELECT CAST (DATE '2007-12-31' AS INTEGER FORMAT '9999999');
DATE から数値への暗黙的変換
Teradata Database は、DATE 型を数値型に割り当て、DATE 型と数値型を比較する、
または数値型をとるシステム関数に DATE 型を渡す場合に、DATE から数値型への
暗黙の変換を実行します。
例
以下は、employee テーブルの dob 列の DATE データを、数値書式に変換する例です。
日付データを DATE タイプとして定義するのが最善の実施方法です。日付データを
数値タイプとして定義しないように注意してください。
表示を日付書式から整数書式に変えるためには、文を以下のように変更します。
SELECT name, dob (INTEGER)
FROM employee
WHERE dob BETWEEN 380307 AND 420825
ORDER BY dob ;
または
SELECT name, CAST (dob AS INTEGER)
FROM employee
WHERE dob BETWEEN 380307 AND 420825
ORDER BY dob ;
表示は以下のようになります。
Name
---------Inglis C
Peterson J
SQL 関数、演算子、式および述部
DOB
-----380307
420327
575
第 13 章 データ型の変換
DATE から Period への変換
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
DATE から Period への変換
目的
PERIOD(DATE)または PERIOD(TIMESTAMP[(n)] [WITH TIME ZONE])としてキャスト
します。
CAST 構文
CAST
( date_expression
AS
)
period_data_type
data_attribute
構文要素
date_expression
変換する日付式。
period_data_type
式が変換されるデータ型。
period_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
使用上の注意
DATE 値は、CAST 関数を使用すると PERIOD(DATE)または PERIOD(TIMESTAMP[(n)]
[WITH TIME ZONE])としてキャストできます。DATE 値を PERIOD(TIME[(n)] [WITH
TIME ZONE])としてキャストしようとすると、エラーが報告されます。
576
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から Period への変換
変換先タイプが PERIOD(DATE)の場合、結果の開始要素は変換元の値に設定されま
す。結果の終了要素は、結果の開始境界に変換先タイプの 1 最小単位(つまり、
INTERVAL '1' DAY)を加算したものに設定されます。結果の終了境界が最大 DATE 値
を超える(つまり、変換元の値が最大 DATE 値に等しい)場合や、結果の終了境界が
最大 DATE 値に等しい(つまり、結果の終了境界値が UNTIL_CHANGED の値に等し
い)場合、エラーが報告されます。
変換先タイプが PERIOD(TIMESTAMP[(n)])の場合、結果の開始要素は現在のセッショ
ンのタイムゾーン、変換元 DATE 値によって作成されたタイムスタンプ値、および
ゼロの時間部分を使用して得られる UTC 値に設定されます。結果の終了要素は、結
果の開始境界に変換先タイプの 1 最小単位を加算したものに設定されます(これはエ
ラーにはなりません)。
変換先タイプが PERIOD(TIMESTAMP[(n)] WITH TIME ZONE)の場合、結果の開始要
素の時間部分は現在のセッションのタイムゾーン、変換元 DATE 値から作成された
タイムスタンプ値、およびゼロの時間部分を使用して得られる UTC 値に設定されま
す。結果の開始要素のタイムゾーンは、現在のセッションのタイムゾーン変位に設
定されます。結果の終了要素は、結果の開始境界に変換先タイプの 1 最小単位を加
算したものに設定されます(これはエラーにはなりません)。
注: 結果は開始境界と最後の値が同じ値になります。
例
例: DATE リテラルを PERIOD(DATE)としてキャストする
以下の例では、DATE リテラルが PERIOD(DATE)としてキャストされます。結果の
開始境界は、変換元から取得します。結果の終了要素は、結果の開始境界に
INTERVAL '1' DAY を加算したものに設定されます。
SELECT CAST(DATE '2005-02-03' AS PERIOD(DATE));
次に示す PERIOD(DATE)値が返されます。
('2005-02-03', '2005-02-04')
例: DATE リテラルを PERIOD(TIMESTAMP(4))としてキャストする
以下の例では、DATE リテラルが PERIOD(TIMESTAMP(4))としてキャストされま
す。結果の開始境界は、DATE リテラルとゼロの時間部分で作成されます。結果の
終了要素は、結果の開始境界に INTERVAL '0.0001' SECOND を加算したものに設定
されます。
SELECT CAST(DATE '2005-02-03' AS PERIOD(TIMESTAMP(4)));
次の PERIOD(TIMESTAMP(4))値が返されます。
('2005-02-03 00:00:00.0000', '2005-02-03 00:00:00.0001')
SQL 関数、演算子、式および述部
577
第 13 章 データ型の変換
DATE から TIMESTAMP への変換
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
DATE から TIMESTAMP への変換
目的
DATE 値を TIMESTAMP または TIMESTAMP WITH TIME ZONE 値に変換します。
CAST 構文
CAST
( date_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
B
A
WITH TIME ZONE
AT
LOCAL
expression
TIME ZONE
B
time_zone_string
)
data_attribute
構文要素
date_expression
変換する日付式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
578
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から TIMESTAMP への変換
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
timestamp_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、タイムスタンプ データの代替出力の書式化を可能
にするために、FORMAT 句を使用することができます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した DATE から TIMESTAMP への変換に、AT
句がサポートされるようになりました。また、INTERVAL 式の他にも追加の式を使
用して、タイムゾーン変位を指定することができます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
Teradata 変換構文
date_expression
(
A
TIMESTAMP
(fractional_seconds_precision)
data_attribute ,
B
A
, WITH TIME ZONE
AT
LOCAL
expression
TIME ZONE
B
time_zone_string
)
, data_attribute
構文要素
date_expression
変換する日付式。
SQL 関数、演算子、式および述部
579
第 13 章 データ型の変換
DATE から TIMESTAMP への変換
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した DATE から TIMESTAMP への
変換に、AT 句がサポートされるようになりました。また、INTERVAL 式の他にも追
加の式を使用して、タイムゾーン変位を指定することができます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
使用上の注意
CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以下の
表に示します。変換先の精度がゼロより高い場合、精度を調整するために結果の末
尾にゼロが追加されます。
580
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から TIMESTAMP への変換
指定内容
THEN...
AT LOCAL
変換元の date_expression から、ローカルのタイムスタンプが生成されま
す。時間の部分は'00:00:00'に設定されます。次に、このローカルのタイム
スタンプ値から、現在のセッションのタイムゾーンに基づいたタイムゾー
ン変位を減算することで、UTC に調整された結果が生成されます。
これは、AT 句を指定しない場合と同じ結果になります。
AT 式または
AT TIME ZONE expression
変換元の date_expression から、ローカルのタイムスタンプが生成されま
す。時間の部分は'00:00:00'に設定されます。次に、このローカル タイム
スタンプ値から、expression で定義されるタイムゾーン変位を減算するこ
とで、UTC に調整された結果が生成されます。
AT time_zone_string または AT
TIME ZONE time_zone_string
変換元の date_expression から、ローカルのタイムスタンプが生成されま
す。時間の部分は'00:00:00'に設定されます。タイムゾーン変位は、
time_zone_string と、ローカルのタイムスタンプ値を基に決定されます。
次に、ローカルのタイムスタンプ値からタイムゾーン変位を減算すること
で、UTC に調整された結果が生成されます。
DATE から TIMESTAMP への暗黙的変換
Teradata Database は、DATE から TIMESTAMP タイプへの暗黙的変換を実行する場
合があります。「DateTime 型の暗黙的変換」を参照してください。
以下の変換をサポートします。
変換元タイプ
変換先タイプ
DATE
TIMESTAMP
ANSIDate 日付形式モードまたは IntegerDate TIMESTAMP WITH TIME ZONE
日付形式モード
TIMESTAMP 値は、比較の場合には常に DATE に変換されます。「TIMESTAMP か
ら DATE への変換」を参照してください。
例
例: DATE 値から TIMESTAMP 値への変換
この例では、CAST の結果は、ソースの式の値'2008-05-14'と、現行セッションの
タイムゾーン変位 INTERVAL '01:00' HOUR TO MINUTE によって UTC に調整され
たデフォルトの時間'00:00:00'から生成されるタイムスタンプになります。したがっ
て、CAST の値は、'2008-05-13 23:00:00' (UTC)になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL '01:00'
HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようになります。
TIMESTAMP '2008-05-14 00:00:00'
SQL 関数、演算子、式および述部
581
第 13 章 データ型の変換
DATE から TIMESTAMP への変換
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0));
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0) AT LOCAL);
例: DATE 値から TIMESTAMP WITH TIME ZONE 値への変換
この例では、CAST の結果は、ソースの式の値'2008-05-14'と、現行セッションのタ
イムゾーン変位 INTERVAL '06:00' HOUR TO MINUTE によって UTC に調整されたデ
フォルトの時間'00:00:00'から生成されるタイムスタンプになります。したがって、
CAST の値は現在のセッションのタイムゾーン変位 INTERVAL '06:00' HOUR TO
MINUTE によって、'2008-05-13 18:00:00' (UTC)になります。
UTC での CAST の結果値はそのタイムゾーン変位 INTERVAL '06:00' HOUR TO
MINUTE に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-14 00:00:00+06:00'
SET TIME ZONE INTERVAL '06:00' HOUR TO MINUTE;
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0) WITH TIME ZONE);
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0) WITH TIME ZONE
AT LOCAL);
例
次の SELECT 文では、CAST の結果は、日付'2008-05-14'と、指定したセッションの
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE によって UTC に調整され
デフォルトの時間'00:00:00'から生成されるタイムスタンプになります。したがっ
て、CAST の値は、'2008-05-14 08:00:00' (UTC)になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL
'05:00:00' HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようにな
ります。TIMESTAMP '2008-05-14 13:00:00'
SET TIME ZONE INTERVAL '05:00' HOUR TO MINUTE;
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0) AT -8);
次の SELECT 文を考慮します。
SELECT CAST(DATE '2008-05-14' AS TIMESTAMP(0) WITH TIME ZONE AT -8);
この場合、CAST の結果はタイムスタンプになります。このタイムスタンプはソース
の式値'2008-05-14'から生成され、デフォルトの時間'00:00:00'は指定されたセッ
ションのタイムゾーン変位(INTERVAL -'08:00' HOUR TO MINUTE)によって UTC に
調整されます。したがって、CAST の値は指定されたセッションのタイムゾーン変位
INTERVAL -'08:00' HOUR TO MINUTE により、UTC で'2008-05-14 08:00:00'にな
ります。
UTC での CAST の結果値はそのタイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE に調整されるため、SELECT 文の結果は、TIMESTAMP '2008-05-14
00:00:00-08:00'になります。現在のセッションのタイムゾーンは影響しません。
582
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
DATE から UDT への変換
例: タイムゾーン文字列に基づく DATE 値から TIMESTAMP 値の変換
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文では、DATE 値'2010-03-09'を、TIMESTAMP 値に変換します。ここでのタ
イムゾーン変位は、タイムゾーン文字列'America Pacific'に基づいています。
SELECT CAST(DATE '2010-03-09' AS TIMESTAMP(0) AT 'America Pacific');
問合わせの結果は、次のとおりです。
2010-03-09
------------------2010-03-09 08:00:00
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
DATE から UDT への変換
目的
DATE データを UDT データに変換します。
CAST 構文
CAST
( date_expression
AS
UDT_data_type (
構文要素
date_expression
変換する日付式。
UDT_data_definition
式が変換されるデータ型。
SQL 関数、演算子、式および述部
583
第 13 章 データ型の変換
DATE から UDT への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った DATE から UDT への明示的な変換はサポートされていま
せん。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
DATE から UDT への暗黙的変換
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST 定
義(「使用上の注意」を参照)が存在する必要があります。
Teradata Database は、以下の操作に対して DATE から UDT への暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への引
数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
DATE から UDT への暗黙 CAST 定義が存在しないと、Teradata Database はその代用
になる他の CAST 定義を探します。
存在する暗黙 CAST 定義の組み合
わせ
Teradata Database の動作
Numeric-to-UDT 文字から UDT
CLOB 以外の文字
タイプ
X
数値から UDT への暗黙 CAST 定義を使用する。
数値から UDT への暗黙 CAST 定義が複数存在する場
合、Teradata Database は SQL エラーを戻します。
X
文字から UDT への暗黙 CAST 定義を使用する。
文字から UDT への暗黙の CAST 定義が複数存在する場
合、Teradata Database は SQL エラーを戻します。
584
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
INTERVAL から文字への変換
存在する暗黙 CAST 定義の組み合
わせ
Teradata Database の動作
Numeric-to-UDT 文字から UDT
CLOB 以外の文字
タイプ
X
X
エラーを報告する。
Teradata Database は DATE タイプを代用データ タイプに暗黙でキャストしてから、
暗黙 CAST 定義を使用して、その代用データ タイプから UDT へのキャストを行な
えるため、代用は有効です。
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
INTERVAL から文字への変換
目的
CAST 構文または Teradata 暗黙的変換構文を使用して、INTERVAL タイプをその正
規化された文字列表現に変換します。
INTERVAL から文字への変換は、CHAR および VARCHAR タイプしかサポートされ
ません。CLOB を変換先のタイプとすることはできません。
CAST 構文
CAST
( interval_expression
AS
A
character_data_type
)
A
CHARACTER SET
server_character_set
data_attribute
構文要素
interval_expression
変換する INTERVAL 式。
SQL 関数、演算子、式および述部
585
第 13 章 データ型の変換
INTERVAL から文字への変換
character_data_type
式が変換されるデータ型。
character_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
これは、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で文字データ属性句を使用できます。
Teradata 変換構文
interval_expression
(
character_data_type
A
data_attribute ,
)
A
,
data_attribute
CHARACTER SET
server_character_set
構文要素
interval_expression
変換する INTERVAL 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
character_data_type
式が変換されるデータ型。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
586
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
INTERVAL から文字への変換
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
INTERVAL から固定長 CHARACTER への変換
ターゲットのデータ型が CHAR(n)である場合、n は、文字列定数によって示された
正規形式の値の長さと等しいかまたはそれよりも長くなければなりません。
n がその長さよりも長い場合には、正規表現を埋め込むために、後続の埋め込み文
字が追加されます。
n が小さすぎる場合には、文字列切り捨てエラーが戻されます。
INTERVAL から VARCHAR への変換
ターゲットのデータ 型が VARCHAR(n)である場合、n は、可変文字列定数によって
示された正規形式の値の長さと等しいかまたはそれよりも長くなければなりません。
n が小さすぎる場合には、文字列切り捨てエラーが戻されます。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
INTERVAL から固定長 CHARACTER への変換
ターゲットのデータ型が CHAR(n)である場合、n は、文字列定数によって示された
正規形式の値の長さと等しいかまたはそれよりも長くなければなりません。
n がその長さよりも長い場合には、正規表現を埋め込むために、後続の埋め込み文
字が追加されます。
n が小さすぎる場合には、文字列切り捨てエラーが戻されます。
INTERVAL から VARCHAR への変換
ターゲットのデータ 型が VARCHAR(n)である場合、n は、可変文字列定数によって
示された正規形式の値の長さと等しいかまたはそれよりも長くなければなりません。
n が小さすぎる場合には、文字列切り捨てエラーが戻されます。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
SQL 関数、演算子、式および述部
587
第 13 章 データ型の変換
INTERVAL から INTERVAL への変換
INTERVAL から INTERVAL への変換
CAST 構文
CAST
( interval_expression
AS
)
interval_data_type
interval_data_attribute
data_attribute
構文要素
interval_expression
変換する INTERVAL 式。
interval_data_type
式が変換される INTERVAL データ型。
interval_data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
ANSI への準拠
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
Teradata 変換構文
interval_expression
(
interval_data_type
,
)
, data_attribute
data_attribute
, interval_data_type
, data_attribute
構文要素
interval_expression
変換する INTERVAL 式。
interval_data_type
式が変換されるデータ型。
588
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
INTERVAL から INTERVAL への変換
data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
これは、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
互換タイプ
両方のデータ タイプが同じ INTERVAL ファミリーのものでなければなりません。
Year-Month または Day-Time。タイプを混ぜることはできません。
INTERVAL データ タイプ
属している INTERVAL ファミリー
• INTERVAL YEAR
Year-Month
• INTERVAL YEAR TO MONTH
• INTERVAL MONTH
• INTERVAL DAY
Day-Time
• INTERVAL DAY TO HOUR
• INTERVAL DAY TO MINUTE
• INTERVAL DAY TO SECOND
• INTERVAL HOUR
• INTERVAL HOUR TO MINUTE
• INTERVAL HOUR TO SECOND
• INTERVAL MINUTE
• INTERVAL MINUTE TO SECOND
• INTERVAL SECOND
INTERVAL タイプの変換は、フィールドと精度とが異なる場合にのみ実行されます。
変換元と変換先のタイプの精度
変換先のデータ タイプの精度が変換元のデータ タイプの対応する精度よりも小さ
い場合には、この変換の結果は桁あふれエラーになる可能性があります。
変換元の最小有効値が変換先の値よりも低い場合、変換先の最小フィールドよりも
精度の低い変換元の値は無視されます。結果は切り捨てられます。この処理の回復
は、システムによって異なります 。
SQL 関数、演算子、式および述部
589
第 13 章 データ型の変換
INTERVAL から INTERVAL への変換
変換元の値の最大有効フィールドが変換先の値の最大有効フィールドよりも高い場
合、12 ヵ月、24 時間などの係数を使用して、変換元の高位フィールドが変換先の
最大有効フィールドのスカラー値の精度に変換されます。
比較されたスカラー値が、変換先のフィールドに定義された精度から桁あふれする
場合は、エラーが戻されます。
INTERVAL から INTERVAL への暗黙的変換
Teradata Database は、場合によっては、INTERVAL から INTERVAL データ型への暗
黙の変換を実行します。「DateTime 型の暗黙的変換」を参照してください。
INTERVAL タイプの変換が実行されるのは、両方のデータ タイプが同じ INTERVAL
ファミリーのものである場合だけです。Year-Month または Day-Time です。「互換
データ型」を参照してください。
例
例: 変換元の最小有効フィールドが変換先よりも低い場合
次の問合わせは‘3-11’を‘3’に変換します。変換元は INTERVAL YEAR(2)です。この変
換では切り捨てが行なわれます。
SELECT CAST(INTERVAL '3-11' YEAR TO MONTH AS INTERVAL YEAR(2));
例: 変換元の最小有効フィールドが変換先よりも低い場合
次の問合わせは‘135 12:37:25.26’を‘3252’に変換します。変換元は DAY(3) TO
SECOND(2)です。
SELECT CAST(INTERVAL '135 12:37:25.26' DAY(3) TO SECOND(2) AS INTERVAL
HOUR(4));
例: 変換元の最小有効フィールドが変換先よりも高い場合
次の問合わせは‘3’を‘3-00’に変換します。変換元は INTERVAL YEAR です。変換で
は、ゼロが挿入されます。
SELECT CAST(INTERVAL '3' YEAR AS INTERVAL YEAR TO MONTH);
例: 変換元の最小有効フィールドが変換先よりも高い場合
次の問合わせは、最後の HOUR 値、3240 を取得するための乗算 135 * 24 の追加変
換を行なった後に‘135 00:00:00.0’を‘3240:00:00.00’に変換します。変換元は DAY
のデータ タイプでした。
SELECT CAST(INTERVAL ' 135 00:00:00.0' DAY AS INTERVAL HOUR TO SECOND);
590
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
INTERVAL から数値への変換
例: 変換元の最大有効フィールドが変換先よりも高い場合
次の問合わせは、まず変換元の INTERVAL 値を‘135 12’として扱ってから、HOURS
を(135*24)+12=3252 として計算します。変換先値の精度が 4 未満である場合(エ
ラーが返される場合)を除き、問合せの結果は INTERVAL ‘3252’ HOUR となります。
変換元は DAY TO SECOND のデータ タイプでした。
SELECT CAST(INTERVAL '135 12:37:25.26' DAY TO SECOND AS INTERVAL HOUR);
例: 割り当て時に行なわれる暗黙的な型変換
INTERVAL YEAR TO MONTH 列を含む次の表について考えます。
CREATE TABLE TimeInfo
(YrToMon INTERVAL YEAR TO MONTH);
次のパラメータ化された要求を使用して列にデータを挿入し、INTERVAL YEAR 値
または INTERVAL MONTH 値を要求に渡す場合、Teradata Database はその値を挿
入する前に INTERVAL YEAR TO MONTH 値に暗黙的に変換します。
INSERT INTO TimeInfo
VALUES (?);
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
INTERVAL から数値への変換
目的
フィールドを 1 つだけ持つ INTERVAL を絶対数値データ タイプに変換します。
この数値は、INTERVAL レコード内の単一数値フィールドの値です。
CAST 構文
CAST
( interval_expression
AS
)
numeric_data_type
data_attribute
構文要素
interval_expression
変換する INTERVAL 式。
SQL 関数、演算子、式および述部
591
第 13 章 データ型の変換
INTERVAL から数値への変換
numeric_data_type
式が変換されるデータ型。
numeric_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
INTERVAL から数値への暗黙的変換
Teradata Database は、場合によっては、INTERVAL データ型から真数データ型への
暗黙の変換を実行します。「DateTime 型の暗黙的変換」を参照してください。
Teradata 変換構文
interval_expression
(
numeric_data_type
data_attribute ,
)
, data_attribute
構文要素
interval_expression
変換する INTERVAL 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
numeric_data_type
式が変換されるデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
592
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
INTERVAL から UDT への変換
INTERVAL から数値への暗黙的変換
Teradata Database は、場合によっては、INTERVAL データ型から真数データ型への
暗黙の変換を実行します。「DateTime 型の暗黙的変換」を参照してください。
例: CAST を使用した、INTERVAL MONTH 値の変換
次のテーブル定義を考えます。
CREATE TABLE sales_intervals
( sdate DATE
, sinterval INTERVAL MONTH
, stotals DECIMAL(5,0));
次の問合わせは、CAST を使用して sinterval 列の INTERVAL MONTH 値を INTEGER
に変換します。
SELECT stotals,
(EXTRACT (MONTH FROM sdate)) + (CAST(sinterval AS INTEGER))
FROM sales_intervals;
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
INTERVAL から UDT への変換
目的
間隔データを UDT データに変換します。
CAST 構文
CAST
( interval_expression
AS
UDT_data_type (
構文要素
interval_expression
変換する INTERVAL 式。
UDT_data_definition
式が変換されるデータ型。
SQL 関数、演算子、式および述部
593
第 13 章 データ型の変換
INTERVAL から UDT への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った INTERVAL から UDT への明示的な変換はサポートされ
ていません。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
INTERVAL から UDT への暗黙的変換
暗黙のデータ型変換を実行するには、以下を指定する CAST 定義(「使用上の注意」
を参照)が必要です。
• AS ASSIGNMENT 句
• 暗黙 CAST の変換元と同じ INTERVAL ファミリー内にある次のようなソース デー
タ タイプ。
INTERVAL データ タイプ
属している INTERVAL ファミリー
• INTERVAL YEAR
Year-Month
• INTERVAL YEAR TO MONTH
• INTERVAL MONTH
• INTERVAL DAY
Day-Time
• INTERVAL DAY TO HOUR
• INTERVAL DAY TO MINUTE
• INTERVAL DAY TO SECOND
• INTERVAL HOUR
• INTERVAL HOUR TO MINUTE
• INTERVAL HOUR TO SECOND
• INTERVAL MINUTE
• INTERVAL MINUTE TO SECOND
• INTERVAL SECOND
CAST 定義の変換元データ タイプは、暗黙タイプ変換の変換元と正確に一致してい
る必要はありません。
Teradata Database は、以下の操作に対して INTERVAL から UDT への暗黙的変換を
実行します。
• UPDATE
• INSERT
594
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から文字への変換
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
数値から文字への変換
目的
数値データ タイプを文字データ タイプに変換します。
CAST 構文
CAST
(numeric_expression
AS
character_data_type
)
data_attribute
構文要素
numeric_expression
数値式。
character_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• 文字セット
• FORMAT
• NAMED
• TITLE
使用するサーバー文字セットを示すために CHARACTER SET 句が指定されていない
場合、ユーザーのデフォルトのサーバー文字セットが使用されます。
SQL 関数、演算子、式および述部
595
第 13 章 データ型の変換
数値から文字への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
numeric_expression
(
character_data_type
A
data_attribute ,
)
A
,
data_attribute
CHARACTER SET
server_character_set
構文要素
numeric_expression
数値式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
character_data_type
式が変換されるデータ型。
使用するサーバー文字セットを示すために character_data_definition が CHARACTER
SET 句を指定していない場合、ユーザー デフォルトのサーバー文字セットが使用さ
れます。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
596
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から文字への変換
数値から文字への暗黙的な変換
SQL 文字列関数の数値引数が CHAR または VARCHAR 文字タイプに暗黙に変換さ
れ、数値引数の形式に以下の書式設定文字が含まれる場合、文字タイプのサーバー
文字セットは UNICODE になります。
• G
• L
• F
• U
• O
• I
• A
• C
• D
• N
その他の書式の場合はいずれも、サーバー文字セットは LATIN になります。
数値の項目を CLOB タイプまたは GRAPHIC 文字に変換することはできません。
CAST と Teradata 変換構文の違い
CAST 関数での処理は、以下のとおりです。
1 数値のデフォルトまたは指定された書式を使用して数値を文字列に変換します。
2 前後の埋め込み文字を取り除きます。
3 変換先の文字列長だけ必要に応じて右側に拡張します。
4 変換先の文字列長に合わせるために非埋め込み文字の切り捨てが必要な場合に
は、文字列切り捨てエラーを報告します。
CAST の操作は、Teradata SQL の変換と以下の点で異なります。
• 結果は左揃えになります。列表示は、位置合わせされません。
• 有効データが切り捨てられた場合には、文字列切り捨てエラーが発生します。
数値データから文字データへ明示的に変換するために Teradata 構文を使用する(す
なわち、CAST を使用しない)場合には、 警告が必要です。
処理は、以下のようになります。
1. 数値のデフォルトまたは指定された FORMAT を使用して数値を文字列に変換し
ます。
前後の埋め込み文字は、切り捨てられません。
2. 必要であれば、埋め込み文字で右側に拡張するか右側から切り捨てて、変換先
の長さ指定に適合させます。
非埋め込み文字が切り捨てられた場合には、文字列切り捨てエラーは報告され
ません。
SQL 関数、演算子、式および述部
597
第 13 章 データ型の変換
数値から文字への変換
サポートされる文字タイプ
数値から文字への変換は、CHAR および VARCHAR タイプしかサポートされません。
数値タイプを CLOB タイプに変換することはできません。
使用上の注意
数値タイプ値を文字列に変換するには、その文字の記述節にデータのタイプ宣言を
含めなければなりません。FORMAT 句それ自体は、数値タイプを文字タイプの値に
変換するために使用することはできません。この句は、結果の値の表示方法を制御
するためにだけ使用することができます。
文字定義に FORMAT 句が含まれていない場合には、元の数値に関連付けられている
書式によってデータの表示方法が決定されます。
数値から文字への Teradata 変換構文の書式では、文字表現への変換のために明示的
またはデフォルトで FORMAT を使用します。FORMAT は、文字列が示している長さ
に応じて、切り捨てたり、埋め込み文字を入れたりします。このために、有効数字
が失われることがあります。
数値タイプから GRAPHIC サーバー文字セットを使用する文字タイプに変換しようと
すると、エラーが発生します。
一般的には、数値は、文字データとしてではなく数値データとして格納する必要が
あります。たとえば、次のコードでテーブルを作成するとします。
CREATE TABLE job AS
(job_code CHAR(6) PRIMARY KEY
,description CHAR(70) );
その後、次の問合わせが行なわれたとします。
SELECT job_code, description
FROM job
WHERE job_code = 1234;
この場合、問題となるのは、'1234'、'1234'、'01234'、'001234'、'+1234'などが
すべて有効な数値リテラル値の文字表記であり、システムでハッシュに使用する値
を識別できないことです。したがって、システムは 、比較できるように、すべての
job_code の値を相当する数値表現に変換するために全テーブル走査を実行しなけれ
ばなりません。
例
例: INTEGER データ型から文字への変換
T1.Field1 には、デフォルト書式が'-(10)9'の数値 INTEGER データ タイプがありま
す。ユーザーには、123456 などの値があり、999999 を超える値はありません。
INTEGER 書式として定義されている値は、CHAR(8)に変換されます。
598
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から文字への変換
次の例は、この数値から文字への変換を実行するための Teradata の構文を示します。
SELECT Field1(CHAR(8)) FROM T1;
結果は、値 123456 に対し'123'を返します。結果には 5 つの先行の埋め込み文字
が含まれ、有効桁が切り捨てられます。
例: 給与の変換
データは次の給与の記述を基に、次の表に示すように変換されます(Δ = 埋め込み文
字)。
Salary (DECIMAL(8,2), FORMAT '$$$,$$9.99')
データ
変換
結果
20000.00
Salary (CHAR(10))
'$20,000.00'
9000.00
Salary (CHAR(10))
'Δ $9,000.00'
20000.00
Salary (FORMAT'9(5)') (CHAR (5))
'20000'
9000.00
CAST (Salary AS CHAR(10))
'$9,000.00Δ '
結果の文字列は、埋め込み文字で拡張されるか、または切り捨てられて、指定され
た文字の記述に従います。
例: 従業員数の変換
EmpNo がデフォルトの書式が'9(6)'の SMALLINT として定義されたとします。
EmpNo の値は 12501 であると想定します。
SELECT EmpNo(CHAR(5)) FROM Employee;
は'1250’を戻します。ここでは先行の埋め込み文字が含まれ、下位桁がありません。
同じ変換のために使用される CAST 関数は、数値を文字表現に変換し、前にある埋
め込み文字を切り捨て、最後に右側に対して切り捨てるか埋め込みます。例えば、
以下の SELECT 文は'12501'を戻します。
SELECT CAST (EmpNo AS CHAR(5)) FROM Employee;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 重要データが切り捨てられる数値から文字への変換の例については、「例:
INTEGER データ型から文字への変換」を参照してください。
• データ タイプ書式、 書式設定文字、FORMAT 句については、< SQL データ型と
リテラル、B035-1143>の「データ タイプの書式および書式句」を参照してくだ
さい。
SQL 関数、演算子、式および述部
599
第 13 章 データ型の変換
数値から DATE への変換
数値から DATE への変換
目的
数値式を DATE データ タイプに変換します。
CAST 構文
CAST
(
numeric_expression
AS
DATE
)
data_attribute
構文要素
numeric_expression
数値式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
使用するサーバー文字セットを示すために CHARACTER SET 句が指定されていない
場合、ユーザーのデフォルトのサーバー文字セットが使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
Teradata 変換構文
numeric_expression
(
DATE
data_attribute ,
)
, data_attribute
構文要素
numeric_expression
数値式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• 文字セット
• FORMAT
• NAMED
600
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から DATE への変換
• TITLE
FORMAT 句を指定すると、代替書式が可能になります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
数値から日付への変換
お勧めしませんが、数値を明示的に日付に変換することは可能です。
Teradata Database は、以下の公式に基づいて、各日付値を 4 バイト整数で格納し
ます。
(year - 1900) * 10000 + (month * 100) + day
たとえば、1985 年 12 月 31 日は整数 851231、1776 年 7 月 4 日は-1239296、
2041 年 3 月 30 日は 1410330 としてそれぞれ格納されます。
以下の表は、列への挿入時に数値日付が解釈される方法を示しています。特に、3
番目の日付の変換に注目してください。これは、1990 年 12 月 01 日を想定した日
付と思われます。
数値
変換先の日付値
901201
1990-12-01
1001201
2000-12-01
19901201
3890-12-01
この公式は 1900 年代の 2 桁の日付に最適なものとしていることに注意する必要が
あります。1900 年代以外の年代にこの書式を使うことは難しいので、代わりに日
付は ANSI 日付定数で指定するのが最善です。
指定可能な値の範囲
指定可能な日付値は、西暦 0001 年 1 月 1 日(-18989899)~西暦 9999 年 12 月 31
日(80991231)です。
数値が有効な日付を表わしていない場合は、エラーが報告されます。
数値から DATE への暗黙タイプ変換
数値タイプを DATE タイプの割り当てで指定することもできます。ただし、この方
法はお勧めできません。Teradata Database は割り当て前に数値から DATE タイプへ
の暗黙的な変換を実行します。数値タイプの値には、有効な値を使用する必要があ
ります。
SQL 関数、演算子、式および述部
601
第 13 章 データ型の変換
数値から INTERVAL への変換
ただし、数値タイプのオペランドと DATE タイプのオペランドが関与する比較操作
の場合、Teradata Database は DATE タイプを数値タイプに変換します。数値タイプ
と DATE タイプを比較して、2 つの DATE タイプの間で比較が行なわれることを期待
する場合、明示的に数値タイプを DATE タイプに変換する必要があります。
例: 数値 INTEGER 式から日付形式への変換
この例では、数値 INTEGER 式を日付形式にキャストします。
SELECT CAST (1071201 AS DATE);
セッションの DateForm モードが ANSIDate に設定されている場合、結果はこのよう
になります。
1071201
---------2007-12-01
関連トピック
詳細は、以下を参照してください。
• 比較操作でのオペランドの暗黙タイプ変換については、比較オペランドの暗黙的
なタイプ変換を参照してください。
• DateTime タイプに関連した割り当てのデータ型互換性規則については、間隔デー
タ タイプの割り当て規則を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
数値から INTERVAL への変換
目的
数値データを、単一の日時フィールドを持つ INTERVAL 値に変換します。
CAST 構文
CAST
( numeric_expression
AS
)
interval_data_type
data_attribute
構文要素
numeric_expression
数値式。
602
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から INTERVAL への変換
interval_data_type
式が変換されるデータ型。
interval_data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で間隔データ属性句を使用できます。
Teradata 変換構文
numeric_expression
(
interval_data_type
data_attribute ,
)
, data_attribute
構文要素
numeric_expression
数値データ タイプを含む式または既存のフィールド。
data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
interval_data_type
式が変換されるデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
数値データは、1 つの日時フィールドを使用して INTERVAL 値に変換されます。
数値は、INTERVAL に許可された値の範囲内にある場合には、INTERVAL の単一
フィールドとして使用されます。そうでない場合には、オーバーフロー エラーが戻
されます。
SQL 関数、演算子、式および述部
603
第 13 章 データ型の変換
数値から数値への変換
数値から INTERVAL への暗黙的変換
Teradata Database は、場合によっては、真数データ型から INTERVAL データ型への
暗黙の変換を実行します。「DateTime 型の暗黙的変換」を参照してください。
例: 数値データから INTERVAL 値への変換
以下の問合わせは、'-5'を返します(先行の埋め込み文字が 3 つ付く)。
SELECT CAST(-5 AS INTERVAL YEAR(4));
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
数値から数値への変換
目的
あるデータ タイプが定義された数値式を異なる数値データ タイプに変換します。
CAST 構文
CAST
( numeric_expression
AS
)
numeric_data_type
data_attribute
data_attribute
構文要素
numeric_expression
数値式。
numeric_data_type
式が変換されるデータ型。
numeric_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
604
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から数値への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI SQL の拡張として、CAST では、numeric_expression の代替書式を可能にする
FORMAT 句などのデータ属性を使用することができます。
Teradata 変換構文
CAST
( numeric_expression
AS
)
numeric_data_type
data_attribute
data_attribute
構文要素
numeric_expression
数値式。
numeric_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
数値から数値への暗黙的な変換
数値の項目は、算術または比較操作が実行される前に、同じ数値タイプに変換され
ます。戻される結果は、基底となる同じタイプです。
たとえば、INTEGER 値が FLOAT 値に加算される前に、INTEGER 値は結果のデー
タ タイプである FLOAT に変換されます。
SQL 関数、演算子、式および述部
605
第 13 章 データ型の変換
数値から数値への変換
FLOAT/REAL/DOUBLE PRECISION への変換
浮動小数点の数値は正確な値ではないため、DECIMAL 値および整数値を FLOAT 値
に変換すると、精度が失われたり、正確には表わせない数値を生成するという結果
を招くことがあります。例えば、値 0.1 を FLOAT にキャストすると、その値は厳密
には 0.1 ではなくなります。
変換時の切り捨ておよび端数処理
DECIMAL/NUMERIC の BIGINT、INTEGER、BYTEINT、または SMALLINT への変換
は、小数部分を切り捨てます。DECIMAL への変換は、四捨五入された結果になりま
す。範囲を超えた場合は、操作が失敗することがあります。
FLOAT/REAL/DOUBLE PRECISION への変換では、使用可能な最近似値に端数処理
(丸め)されます。小数や、9,007,199,254,740,992 よりも大きな数は、どちらも正
確に表現できる保証はありません。そのため、表現可能な最近似値が選択されます。
最近似値と見なされる 2 つの表現可能な値があるときには、最小有効ビットが 0 で
表わされる値が選択されます。例えば、0.1 を FLOAT 列に格納すると、その値はわ
ずかに大きな値に丸められます
(0.1000000000000000055511151231257827021181583404541015625)。
切り上げ/切り捨てについては、< SQL データ型とリテラル、B035-1143>の
「DECIMAL/NUMERIC データ タイプ」を参照してください。
数値変換の例を、いくつか示します。
値
変換後
結果
20000.99
INTEGER
20000
20000.99
DECIMAL(6,1)
20001.0
20000.99
DECIMAL(4, 1)
エラー
200000
SMALLINT
エラー
DECIMAL タイプのサイズ制限があるアプリケーションでの CAST の使用
一部のアプリケーションでは、DECIMAL タイプが 15 桁以下にならなければなりま
せん。
こうした要件を持つアプリケーションが 15 桁を上回る DECIMAL の列にアクセスし
たり、15 桁を上回る DECIMAL の結果を生じる可能性のある式を使用しなければな
らなくなることがあります。DECIMAL 型サイズの要件を満たすには、CAST を使用
して DECIMAL 型を 15 または 15 未満の桁に変換します。
たとえば、次のような式を考慮してみます。A、B、C は、DECIMAL(8,2)として定義
された列です。
SELECT (A*B)/C FROM table1;
606
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から数値への変換
結果値は 15 桁を下回る可能性がありますが、A*B は最大 18 桁になります。
結果が必ず 16 桁を下回るようにするには、CAST を使用します。
SELECT CAST ((A*B)/C AS DECIMAL(15,2)) FROM table1;
数値の桁あふれを防ぐための CAST の使用
Teradata SQL のコンパイラの動作の性質上、大きな値が予期される場合は必ず式の
引数に CAST を使用するのは重要なことです。
たとえば、f1 が DECIMAL(14,2)と定義されており、これを整数倍する、あるいは
SUM(f1)を計算するとします。
この場合に、以下の演算について考慮してみます。
CAST(f1 AS DECIMAL(18,2))*100
または
SUM(CAST(f1 AS DECIMAL(18,2)))
上記の方法は、正しい結果集合を得るための適切な方法です。
一方、次のように式の結果をキャストするとします。
CAST(f1*100 AS DECIMAL(18,2))
または
CAST(SUM(f1) AS DECIMAL(18,2)
このとき、計算時(および CAST が作成される前)に、望むような結果ではない、オー
バーフローが発生することがあります。
例
例: 数値 INTEGER 式のキャスト
この例では、IntegerField という数値 INTEGER 式を DECIMAL(7,2)にキャストしま
す。
CAST (IntegerField AS DECIMAL (7,2))
例: FORMAT 句を変更して数値を表示する
FORMAT 句を使用して列に定義された基礎となるデータ タイプを変更することはで
きませんが、その句を使用して、数値の表示を変更することはできます。
たとえば、両方とも DECIMAL (7,2)と定義されている列の Wholesale と Retail の
フィールド値がそれぞれ 12467.75 と 21500.50 の場合、次の式
SQL 関数、演算子、式および述部
607
第 13 章 データ型の変換
数値から UDT への変換
CAST (Wholesale - Retail AS FORMAT '-99999')
の結果は、次のとおりです。
-09033
FORMAT 句は、レコード モード(クライアント システムの内部書式 )でクライアン
ト システムへ戻されるデータには影響を与えません 。
前の例で、クライアント システムへ戻される値は 、依然として小数の書式にパック
されています(すなわち、-9032.75)。
CAST での FORMAT の使用は、ANSI 標準の Teradata 拡張機能です。
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• バイナリ算術式の暗黙タイプ変換については、2 項算術演算子の結果のデータ タ
イプを参照してください。
• 比較操作での暗黙的な型の変換の詳細については、比較オペランドの暗黙的なタ
イプ変換を参照してください。
数値から UDT への変換
目的
数値データを UDT データに変換します。
CAST 構文
CAST
( numeric_expression
AS
UDT_data_type (
構文要素
numeric_expression
数値式。
UDT_data_definition
式が変換される UDT の型(FORMAT、NAMED、または TITLE データ属性句が続く)。
608
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
数値から UDT への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った数値から UDT への明示的な変換はサポートされていま
せん。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。CREATE CAST の詳
細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を参照してください。
数値から UDT への暗黙的変換
Teradata Database は、以下の操作に対して数値から UDT への暗黙的変換を実行し
ます。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST
定義(「使用上の注意」を参照)が存在する必要があります。
キャスト定義のソース数値型は、暗黙の変換のソース数値型と正確に一致している
必要はありません。Teradata Database は、BYTEINT、SMALLINT、INTEGER、
BIGINT、DECIMAL/NUMERIC、NUMBER、または REAL/FLOAT/DOUBLE ターゲッ
ト型を指定する暗黙的なキャスト定義を使用することができます。
別々の数値型から UDT への変換で複数の暗黙的なキャスト定義が存在する場合、
Teradata Database は優先順位の最も高い数値型の暗黙的なキャスト定義を使用しま
す。以下のリストでは、数値型の優先順位が最低から最高の順に並べられています。
•
•
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL/NUMERIC
NUMBER
REAL/FLOAT/DOUBLE
SQL 関数、演算子、式および述部
609
第 13 章 データ型の変換
Period から文字への変換
数値から UDT への暗黙 CAST 定義が存在しない場合、Teradata Database は代用可
能なその他の CAST 定義を検索します。
存在する暗黙 CAST 定義の組 Teradata Database の動作
み合わせ
DATE-toUDT
Character-toUDT
X
DATE から UDT への暗黙 CAST 定義を使用する。
X
文字から UDT への暗黙 CAST 定義を使用する。
CLOB は文字タイプにはなりません。
文字から UDT への暗黙の CAST 定義が複数存在する場合、
Teradata Database は SQL エラーを戻します。
X
X
エラーを報告する。
Teradata Database は数値型を代用データ型に暗黙的にキャストしてから、暗黙的な
キャスト定義を使用して、その代用データ型から UDT へのキャストを行なえるた
め、代用は有効です。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
Period から文字への変換
目的
Period データ タイプを正規形式の文字列表現へ変換します。
Period から文字への変換は、CHAR および VARCHAR タイプのみサポートされます。
CLOB を変換先のタイプとすることはできません。
CAST 構文
CAST
( period_expression
AS
A
character_data_type
)
A
CHARACTER SET
610
server_character_set
data_attribute
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から文字への変換
構文要素
period_expression
変換される PERIOD 式。
character_data_type
式が変換されるデータ型。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
character_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
ANSI を拡張したことで、CAST で文字データ属性句を使用できます。
Teradata 変換構文
period_expression
(
character_data_type
A
data_attribute ,
)
A
,
data_attribute
CHARACTER SET
server_character_set
構文要素
period_expression
変換される PERIOD 式。
character_data_type
式が変換されるデータ型。
data_attribute
以下のデータ属性のいずれか 1 つ。
SQL 関数、演算子、式および述部
611
第 13 章 データ型の変換
Period から文字への変換
• FORMAT
• NAMED
• TITLE
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
使用上の注意
期間式は、CAST 関数や Teradata キャスト構文を使用するか、フィールド モードの
出力を形成するときに、文字列表現としてキャストできます。キャストする期間式
に関連付けられた書式に書式化した文字列の最大長を L とします。結果の文字列は、
期間式の開始境界と終了境界を表わす 2 つの文字列を含みます。それぞれの最大長
は L であり、それぞれが単一引用符(' ')で囲まれ、カンマとスペース(, )で区切られ、
左右の括弧[( )]で囲まれます。したがって、結果の文字列の最大長は 2*L+8 になり
ます。 これが、例えば、フォーマットが月の正式名称を含み、境界に対する特定の
月が 7 月(July)の場合には、実際の長さが K とした場合、その長さは 2*L+8 より小
さくなり、変換先タイプは CHARACTER(n)または VARCHAR(n)となります。
• n が K に等しい場合、期間は長さが K の結果の文字列にキャストされます。
• n が K より大きく、変換先が VARCHAR(n)の場合、期間は長さが K の結果の文字
列にキャストされます。
• n が K より大きく、変換先が CHARACTER(n)の場合、期間は結果の文字列にキャ
ストされ、長さが n になるまで末尾の埋め込み文字が追加されます。
• n が K より小さく、セッションが ANSI モードの場合、切り捨てエラーが報告さ
れます。
• n が K より小さく、セッションが Teradata モードの場合、長さを n に切り捨てた
文字列が返されます。
TIME 要素タイプと TIMESTAMP 要素タイプを持つ Period データ タイプのデータの
場合、期間式の UTC 値はデータの値のタイムゾーンに調整されます。また、データ
の値にタイムゾーンがない場合は、現在のセッションのタイムゾーンに調整されま
す。UTC からの変換の例外は、PERIOD(TIMESTAMP(n))値の終了境界が
UNTIL_CHANGED を表わすために使用される最大値と等しい場合です。この場合、
値は変更されません。このような調整を行なっために、結果の終了境界が開始境界
より小さいように見える場合がありますが、UTC では終了境界は開始境界より大き
くなっています。これが発生する理由は、TIME データ タイプの時間値が 24 時間単
位でラップされる(つまり、時間値は「モジュール 24」を使用して取得される)ため
です。
例: PERIOD データ型からその正規化された文字列表現への変換
pts は、PERIOD '(2005-02-02 12:12:12.34, 2006-02-03 12:12:12.34)'の値を持つ
テーブル t の PERIOD(TIMESTAMP(2))列だとします。
612
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から DATE への変換
以下の例では、CAST 関数を使用して PERIOD(TIMESTAMP(2))列を
CHARACTER(52)としてキャストします。
SELECT CAST(pts AS CHARACTER(52)) FROM t;
次の結果が返されます。
('2005-02-02 12:12:12.34', '2006-02-03 12:12:12.34')
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
Period から DATE への変換
目的
Period データを DATE 値に変換します。
CAST 構文
CAST
( expression
AS
ansi_sql_data_type
)
data_definition_list
period_expression
変換される PERIOD 式。
date_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で DATE データ属性句を使用できます。
SQL 関数、演算子、式および述部
613
第 13 章 データ型の変換
Period から Period への変換
使用上の注意
PERIOD(DATE)値または PERIOD(TIMESTAMP(n) [WITH TIME ZONE])値は、CAST 関
数を使用すると DATE としてキャストできます。変換元の最後の値は、変換元の開
始境界と等しくなければなりません。そうでないと、エラーが報告されます。
変換元のタイプが PERIOD(DATE)の場合、結果は変換元の開始境界になります。
変換元のタイプが PERIOD(TIMESTAMP(n) [WITH TIME ZONE])の場合、結果は現在
のセッションのタイムゾーンに調整した後の変換元の開始境界の日付部分になります。
変換元のタイプが PERIOD(TIME(n) [WITH TIME ZONE])の場合、エラーが報告され
ます。
例: PERIOD データから DATE 値への変換
pd がテーブル t 内の PERIOD(DATE)列で、PERIOD '(2005-02-02, 2005-02-03)'の値
を持つとします。
以下の例では、PERIOD(DATE)列が DATE としてキャストされます。結果は、列の開
始境界になります。
SELECT CAST(pd AS DATE) FROM t;
次の結果が返されます。
2005-02-02
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、B035-1143>
を参照してください。
Period から Period への変換
CAST 構文
CAST
( period_expression
AS
)
period_data_type
data_attribute
data_attribute
614
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から Period への変換
構文要素
period_expression
変換される PERIOD 式。
period_data_type
式が変換されるデータ型。
period_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
互換タイプ
以下の表では、変換元と変換先のタイプがどちらも Period データ タイプの場合に、
許容される組み合わせを示します。
変換元タイプ
変換先タイプ
PERIOD (DATE)
PERIOD (DATE)
PERIOD(TIMESTAMP[(m)] [WITH TIME ZONE])
PERIOD(TIME[(n)] [WITH
TIME ZONE])
PERIOD(TIME[(m)] [WITH TIME ZONE])
m はターゲットの精度です。この m はソースの精度 n 以上で
なければなりません。m のデフォルトは 6 です。
PERIOD(TIMESTAMP[(m)] [WITH TIME ZONE])
m はターゲットの精度です。この m はソースの精度 n 以上で
なければなりません。m のデフォルトは 6 です。
PERIOD(TIMESTAMP[(n)]
WITH TIME ZONE)
PERIOD (DATE)
PERIOD(TIME[(m)] [WITH TIME ZONE])
m はターゲットの精度です。この m はソースの精度 n 以上で
なければなりません。m のデフォルトは 6 です。
PERIOD(TIMESTAMP[(m)] [WITH TIME ZONE])
SQL 関数、演算子、式および述部
615
第 13 章 データ型の変換
Period から Period への変換
変換元タイプ
変換先タイプ
m はターゲットの精度です。この m はソースの精度 n 以上で
なければなりません。m のデフォルトは 6 です。
PERIOD(DATE)から PERIOD(TIMESTAMP)
PERIOD(DATE)値は、CAST 関数を使用すると PERIOD(TIMESTAMP[(n)] [WITH TIME
ZONE])としてキャストできます。
結果要素の UTC 値は、日付部分を対応する変換元の要素に、時間部分を 0 にそれぞ
れ設定して作成されたタイムスタンプからの現在のセッションのタイムゾーンに対
する調整後に取得されます。変換先タイプが PERIOD(TIMESTAMP[(n)] WITH TIME
ZONE)の場合、結果のタイムゾーン フィールドは両方とも現在のセッションのタイ
ムゾーン変位に設定されます。ただし、これには例外があります。変換元の終了境
界が最大 DATE 値の場合、結果の終了境界は最大の TIMESTAMP 値に設定されます。
PERIOD(TIME)から PERIOD(TIME)
PERIOD(TIME(n) [WITH TIME ZONE])値は、CAST 関数を使用すると
PERIOD(TIME[(n)] [WITH TIME ZONE])としてキャストできます。
変換元の UTC 値が、結果の UTC 値にコピーされます。変換先のタイプに WITH TIME
ZONE が指定されていて、変換元にタイムゾーンが含まれている場合には、変換元
のタイムゾーン変位が対応する結果要素にコピーされます。変換元にタイムゾーン
が含まれていない場合には、現在のセッションのタイムゾーン変位が両方の要素に
コピーされます。例えば、現在のセッションのタイムゾーン変位が INTERVAL "08:00" HOUR TO MINUTE で、変換元の PERIOD(TIME(0) WITH TIME ZONE)の値
が PERIOD '(12:12:12+08:00, 12:12:13+08:00)'だとします。この変換元の UTC 値
は、('04:12:12', '04:12:13')になります。結果の UTC 値は、この値に設定されます。
この結果を出力するときに、UTC 値が現在のセッションのタイムゾーンに調整され、
結果は('20:12:12', '20:12:13')になります。
注: UTC での CURRENT_DATE が DATE '2006-07-28'だとすると、この値は実際には
前日のものになります。これがタイムスタンプ要素だとすると、出力の開始境界は
'2006-07-27 20:12:12'になるでしょう。
変換先の精度が変換元の精度より高い場合、秒の小数桁の末尾にゼロが追加されま
す。変換先の精度が変換元の精度より低い場合、エラーが報告されます。
PERIOD(TIME)から PERIOD(TIMESTAMP)
PERIOD(TIME(n) [WITH TIME ZONE])値は、CAST 関数を使用すると
PERIOD(TIMESTAMP[(n)] [WITH TIME ZONE])としてキャストできます。
変換元の時間値は、対応する UTC 値を基にセッションのタイムゾーンに調整されま
す。各結果要素の日付部分は、CURRENT_DATE に設定されます。時、分、秒は、前
616
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から Period への変換
述の調整を実行した後の変換元からコピーされ、タイムスタンプ値は対応する UTC
値に変換されます。
変換先のタイプに WITH TIME ZONE が指定されていて、変換元にタイムゾーンが
含まれている場合には、変換元のタイムゾーン変位が対応する結果要素にコピーさ
れます。変換元にタイムゾーンが含まれていない場合には、現在のセッションのタ
イムゾーン変位が両方の要素にコピーされます。
変換先の精度が変換元の精度より高い場合、秒の小数桁の末尾にゼロが追加されま
す。変換先の精度が変換元の精度より低い場合、エラーが報告されます。
PERIOD(TIMESTAMP)から PERIOD(DATE)
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])値は、CAST 関数を使用すると
PERIOD(DATE)としてキャストできます。
結果要素は、変換元の境界を現在のセッションのタイムゾーンに応じて調整した後、
それぞれが対応する変換元の境界の日付部分に設定されます(変換元の終了境界が最
大値の場合、その終了境界に対する調整は実行されません)。タイムゾーンの調整に
よって日付が変わる場合には、変更後の値が使用されます。結果の日付部分が同じ
になる場合には、エラーが報告されます。
PERIOD(TIMESTAMP)から PERIOD(TIME)
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])値は、CAST 関数を使用すると
PERIOD(TIME[(n)] [WITH TIME ZONE])としてキャストできます。
変換元の開始および終了 UTC 値の日付部分は、同じ DATE 値でなければなりませ
ん。そのようにしないと、エラーが報告されます。結果要素の時間部分は、対応す
る変換元の時間部分からコピーされます。変換先のタイプに WITH TIME ZONE が
指定されていて、変換元にもタイムゾーンが含まれている場合には、変換元のタイ
ムゾーン変位が対応する結果要素にコピーされます。変換元にタイムゾーンが含ま
れていない場合には、現在のセッションのタイムゾーン変位が両方の要素にコピー
されます。
変換先の精度が変換元の精度より高い場合、秒の小数桁の末尾にゼロが追加されま
す。変換先の精度が変換元の精度より低い場合、エラーが報告されます。
PERIOD(TIMESTAMP)から PERIOD(TIMESTAMP)
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])値は、CAST 関数を使用すると
PERIOD(TIMESTAMP[(n)] [WITH TIME ZONE])としてキャストできます。
結果の日付と時間の部分は、対応する変換元の日付と時間の部分に設定されます。
変換先のタイプに WITH TIME ZONE が指定されていて、変換元にもタイムゾーン
が含まれている場合には、変換元のタイムゾーン変位が対応する結果要素にコピー
されます。変換元にタイムゾーンが含まれない場合には、現在のセッションのタイ
SQL 関数、演算子、式および述部
617
第 13 章 データ型の変換
Period から Period への変換
ムゾーン変位が両方の要素にコピーされます。ただし例外として、変換元の終了境
界が最大値の場合は、結果の終了境界のタイムゾーンは+00:00 になります。
変換先の精度が変換元の精度より高い場合、秒の小数桁の末尾にゼロが追加されま
す。変換先の精度が変換元の精度より低い場合、エラーが報告されます。
例
例: PERIOD(DATE)から PERIOD(TIMESTAMP)
p は、PERIOD '(2005-02-02, 2006-02-03)'の値を持つテーブル t1 の PERIOD(DATE)
列で、現在のセッションのタイムゾーン変位が INTERVAL -'08:00' HOUR TO MINUTE
だとします。
以下の例では、PERIOD(DATE)列を PERIOD(TIMESTAMP(6))としてキャストします。
日付部分は対応する結果要素のために変換元から取得され、時間部分にはゼロが設
定されます。
SELECT CAST(p AS PERIOD(TIMESTAMP(6))) FROM t1;
次の結果が返されます。
('2005-02-02 00:00:00.000000', '2006-02-03 00:00:00.000000')
例: 変換元の最小有効フィールドが変換先よりも低い場合
p は、PERIOD '(12:12:12.45, 13:12:12.67)'の値を持つテーブル t の
PERIOD(TIME(2))列で、現在のセッションのタイムゾーン変位が INTERVAL -'08:00'
HOUR TO MINUTE だとします。
以下の例では、PERIOD(TIME(2))列を PERIOD(TIME(6) WITH TIME ZONE)として
キャストします。時間部分は、対応する結果要素の精度が 6 になるように秒の小数
桁の末尾にゼロを追加した変換元から取得し、両方の結果のタイムゾーンには現在
のセッションのタイムゾーン変位が設定されます。
SELECT CAST(p AS PERIOD(TIME(6)WITH TIME ZONE)) FROM t;
次の結果が返されます。
('12:12:12.450000-08:00', '13:12:12.670000-08:00')
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
618
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から TIME への変換
Period から TIME への変換
目的
Period データを TIME 値に変換します。
CAST 構文
CAST
A
( period_expression
A
AS
TIME
)
(fractional_seconds_precision)
WITH TIME ZONE
data_attribute
構文要素
period_expression
変換される PERIOD 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で TIME データ属性句を使用できます。
使用上の注意
PERIOD(TIME(n) [WITH TIME ZONE])値または PERIOD(TIMESTAMP(n) [WITH
TIME ZONE])値は、CAST 関数を使用すると TIME[(n)] [WITH TIME ZONE]として
キャストできます。変換元の最後の値は、変換元の開始境界と等しくなければなり
ません。そうでないと、エラーが報告されます。
変換先の精度が変換元の精度より高い場合、精度を調整するために結果の末尾にゼ
ロが追加されます。変換先の精度が変換元の精度より低い場合、エラーが報告され
ます。
SQL 関数、演算子、式および述部
619
第 13 章 データ型の変換
Period から TIMESTAMP への変換
変換元のタイプが PERIOD(TIME(n) [WITH TIME ZONE])または
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])の場合、結果の時間部分は変換元の開
始境界の時間部分から取得されます。変換元と変換先のタイプがどちらも WITH TIME
ZONE の場合、結果のタイムゾーンフィールドは変換元の開始境界のタイムゾーン
変位に設定されます。変換先のタイプのみが WITH TIME ZONE の場合、結果のタイ
ムゾーンフィールドは現在のセッションのタイムゾーン変位に設定されます 。
変換元のタイプが PERIOD(DATE)の場合、エラーが報告されます。
例
pt は、PERIOD '(12:12:12.34, 12:12:12.35)'の値を持つテーブル t の
PERIOD(TIME(2))列だとします。
以下の例では、PERIOD(TIME(2))列を TIME(6)としてキャストしています。TIME(6)
の結果は変換元の開始境界から取得され、精度が 6 になるよう秒の小数桁の末尾に
ゼロが追加されます。
SELECT CAST(pt AS TIME(6)) FROM t;
次の結果が返されます。
12:12:12.340000
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、B035-1143>
を参照してください。
Period から TIMESTAMP への変換
目的
Period データを TIMESTAMP 値に変換します。
CAST 構文
CAST
( period_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
A
)
WITH TIME ZONE
620
data_attribute
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
Period から TIMESTAMP への変換
構文要素
period_expression
変換される PERIOD 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
timestamp_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、日時データの代替出力の書式化を可能にするため
に、FORMAT 句を使用することができます。
使用上の注意
PERIOD(DATE)、PERIOD(TIME(n) [WITH TIME ZONE])、または
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])の値は、CAST 関数を使用すると
TIMESTAMP[(n)] [WITH TIME ZONE]としてキャストできます。変換元の最後の値
は、変換元の開始境界と等しくなければなりません。そうでないと、エラーが報告
されます。
変換元の型が PERIOD(TIME(n) [WITH TIME ZONE])または PERIOD(TIMESTAMP(n)
[WITH TIME ZONE])の場合、次のようになります。
• 変換先の精度が変換元の精度より高い場合、精度を調整するために結果の末尾に
ゼロが追加されます。
• 変換先の精度が変換元の精度より低い場合、エラーが報告されます。
変換元のタイプが PERIOD(DATE)の場合、結果は現在のセッションのタイムゾーン
に調整された変換元の開始境界とゼロの時間部分で作成されます。変換先のタイプ
が WITH TIME ZONE ならば、現在のセッションのタイムゾーン変位も追加されます。
変換元のタイプが PERIOD(TIME(n) [WITH TIME ZONE])の場合、変換元の(UTC で
の)開始境界は現在のセッションのタイムゾーン変位に調整されます。結果のタイム
スタンプ部分は、CURRENT_DATE と前述の調整を実行した後に取得した変換元の
開始境界の時間部分から作成されます。結果のタイムスタンプ値は、UTC に変換さ
れます。変換元と変換先のタイプがどちらも WITH TIME ZONE の場合、結果のタ
イムゾーンフィールドは変換元の開始境界のタイムゾーン変位に設定されます 。変
SQL 関数、演算子、式および述部
621
第 13 章 データ型の変換
符号付きゾーン DECIMAL 変換
換先のタイプのみが WITH TIME ZONE の場合、結果のタイムゾーンフィールドは現
在のセッションのタイムゾーン変位に設定されます。
変換元のタイプが PERIOD(TIMESTAMP(n) [WITH TIME ZONE])の場合、結果のタイ
ムスタンプ部分は変換元の開始境界のタイムスタンプ部分になります。変換元と変
換先のタイプがどちらも WITH TIME ZONE の場合、結果のタイムゾーンフィールド
は変換元の開始境界のタイムゾーン変位に設定されます。変換先のタイプのみが
WITH TIME ZONE の場合、結果のタイムゾーンフィールドは現在のセッションのタ
イムゾーン変位に設定されます。
例
pts は、PERIOD '(03.02.05 12:12:12.34, 03.02.05 12:12:12.35)'の値を持つテーブ
ル t の PERIOD(TIMESTAMP(2))列だとします。
以下の例では、列 pts を TIMESTAMP(6)としてキャストしています。結果は、精度
が 6 になるよう秒の小数桁の末尾にゼロが追加された変換元の開始境界になります。
SELECT CAST(pts AS TIMESTAMP(6)) FROM t;
次の結果が返されます。
2005-02-03 12:12:12.340000
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
符号付きゾーン DECIMAL 変換
Teradata SQL は、符号付きゾーン(外部)小数である入力データを数値データ タイプ
に変換できるので、数値演算を列の値に対して実行できるようになります。符号付
きゾーン小数が格納されることになる列は、どの数値データ タイプでもかまいません。
S 符号文字を組み込んだ FORMAT 句は、 Teradata Database に渡されるとき、およ
び Teradata Database から渡されるときにデータをフィルタ処理します。
入力データ列の右端の文字は、ゾーン(オーバーパンチ)ビットを含んでいると想定さ
れます。
ゾーンと数値の組み合わせを表わす文字を次の表に示します。
622
最後の文字(入 数値変換
力文字列)
最後の文字(入 数値変換
力文字列)
最後の文字(入 数値変換
力文字列)
{
}
0
n…0
-n … 0
n…0
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
符号付きゾーン DECIMAL 変換
最後の文字(入 数値変換
力文字列)
最後の文字(入 数値変換
力文字列)
最後の文字(入 数値変換
力文字列)
A
n…1
J
-n … 1
1
n…1
B
n…2
K
-n … 2
2
n…2
C
n…3
L
-n … 3
3
n…3
D
n…4
M
-n … 4
4
n…4
E
n…5
N
-n … 5
5
n…5
F
n…6
O
-n … 6
6
n…6
G
n…7
P
-n … 7
7
n…7
H
n…8
Q
-n … 8
8
n…8
I
n…9
R
-n … 9
9
n…9
列の定義では CREATE TABLE または ALTER TABLE 文に、データのロードでは
INSERT 文に、符号付きの FORMAT 句を含めることができます。格納された値をど
のように使用するかにより、FORMAT 句の指定方法が異なります。
符号付きの FORMAT 句が列作成時に指定されている場合、その句は列レベルでデー
タが変換されるため、列に「付属している」とみなされます。すなわち、そのデー
タがロードされる時と検索される時の両方で行なわれます。
CREATE TABLE での FORMAT の使用
CREATE TABLE 文で、次の FORMAT 句が使用されるとき、
CREATE TABLE Test1 (Col1 DECIMAL(4) FORMAT '9999S');
ゾーン付きの入力文字列は、データが次のように直接入力されるか、
INSERT INTO Test1 (Col1) VALUES ('123J');
または、次のように USING 修飾子を使用して、クライアント システムのデータレ
コードから読まれるかどうかにかかわらず、標準の INSERT 文でロードすることが
できます。
USING Ext1 (CHAR(4))
INSERT INTO Test1 (Col1)
VALUES (:Ext1);
データ レコードには、文字列‘123J’が含まれます。
これ以降、次のような単純な選択は、
SELECT Col1 FROM Test1;
次の結果が得られます。
SQL 関数、演算子、式および述部
623
第 13 章 データ型の変換
符号付きゾーン DECIMAL 変換
Col1
---123J
SELECT 文での別の FORMAT の使用
定義済みの書式を無効にするには、別の FORMAT 句が検索の文に必要です。前の例
のテーブルを使用すると、次の 2 つの文の内の 1 つを使用して数値を検索しなけれ
ばなりません。
SELECT Col1 (FORMAT '+9999') FROM Test1;
または
SELECT CAST (Col1 AS INTEGER) FROM Test1;
結果は、以下のようになります。
Col1
-----1231
列に付属していない FORMAT
この書式が列に付属していない場合、符号付きゾーン小数データがロードされるご
とに、および、行の値が符号付きゾーン小数の書式で検索されるごとに、符号付き
の FORMAT 句を使用しなければなりません。
たとえば、以下のように表が CREATE TABLE 文で定義されている場合、
CREATE TABLE Test2 (Col2 DECIMAL(5));
符号付き FORMAT 句を、符号付きゾーン小数文字列の挿入時に必ず組み込む必要が
あります。
これは、例 1 と 2 のように、定義が明示的に定義されているかどうかには関係なく
当てはまります。 例 3 と 4 のように、クライアント システム データ レコードから
読み込まれることによって暗黙に定義されているかどうかには関係なく当てはまり
ます。
624
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
符号付きゾーン DECIMAL 変換
例
例
INSERT INTO Test2 (Col2)
VALUES ('5678B' (DECIMAL(5), FORMAT '99999S'));
例
INSERT INTO Test2 (Col2)
VALUES ('9012L' (DECIMAL(5), FORMAT '99999S'));
例
USING Ext2 (CHAR(5))
INSERT INTO Test2 (Col2)
VALUES (:Ext2 (DECIMAL(5), FORMAT '99999S'));
例
USING Ext2 (CHAR(5))
INSERT INTO Test2 (Col2)
VALUES (:Ext2 (DECIMAL(5), FORMAT '99999S'));
Ext2 には、文字列‘5678B’と‘9012L’が含まれます。
Col2 には付属の FORMAT 句がないので、次のような単純な SELECT の例では、次
の結果が戻されます。
SELECT Col2 FROM Test2;
Col2
------56782.
-90123.
値‘5678B’と‘9012L’を取得するために、符号 FORMAT 句が SELECT 文に含まれてい
る必要があります。
符号付きゾーン小数の値を処理する場合、特に、subquery などの複雑な機能を使用
する場合には、この規則を憶えておくことが重要です。
例
この例は、前の例のデータに基づきます。
CHARACTER データ タイプで作成された列を考えてみます。
CREATE TABLE Test3 (Col3 CHAR(5));
SQL 関数、演算子、式および述部
625
第 13 章 データ型の変換
TIME から文字への変換
列は次のように、符号 FORMAT 句なしで、"付属していない"列から値を選択してロー
ドされます。
INSERT INTO Test3 (Col3)
SELECT Col2 FROM Test2 ;
挿入される値は、次のとおりです。
Col3
----5678
-9012
値'5678B'と'9012L'を挿入するために、符号 FORMAT 句が問合わせ指定に含まれて
いる必要があります。
関連トピック
データ タイプ、データ タイプの書式、書式設定文字、および FORMAT 句について、
詳細は< SQL データ型とリテラル、B035-1143>を参照してください。
TIME から文字への変換
目的
TIME データを文字列に変換します。
CAST 構文
CAST
( time_expression
AS
A
character_data_type
)
A
CHARACTER SET
server_character_set
data_attribute
構文要素
time_expression
変換する TIME 式。
character_data_type
式が変換されるデータ型。
626
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から文字への変換
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
character_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、日時データの文字表現の代替出力の書式化を可能
にするために、FORMAT 句を使用することができます。
Teradata 変換構文
CAST
( time_expression
AS
A
character_data_type
)
A
CHARACTER SET
server_character_set
data_attribute
構文要素
time_expression
変換する TIME 式。
character_data_type
式が変換されるデータ型。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
SQL 関数、演算子、式および述部
627
第 13 章 データ型の変換
TIME から文字への変換
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
TIME から CHAR(n)または VARCHAR(n)への変換時に、n は、文字列定数によって表
わされた TIME 値の長さと等しいかそれよりも長くなければなりません。
変換先データ タイプ
n
結果
CHAR(n)
文字列定数で表わされた
TIME 値の長さより長い
末尾の埋め込み文字が表記を埋める
ために追加される。
小さすぎる
文字切り捨てエラーが戻される。
文字列定数で表わされた
TIME 値の長さより長い
ブランク埋め込みは文字表記に追加
されない。
小さすぎる
文字切り捨てエラーが戻される。
VARCHAR(n)
TIME から CLOB への変換はサポートされていません。
サーバー文字セットが GRAPHIC のときは、TIME 値を文字列に変換することはでき
ません。
TIME から文字への変換に対する CAST での FORMAT の強制
TIME から文字への変換のデフォルトの書式は、TIME 値に有効な書式を使用します。
FORMAT 句を使って、TIME 値を文字列に変換できます。ただし、結果の書式は、
TIME 値と同じになります。文字列値で別の書式を使用する場合は、以下で説明する
ように CAST を併用する必要があります。
TIME 値に関連する書式にかかわらず、TIME から CHAR に値を変換し、その結果に
おいて明示的な FORMAT を強制するには、入れ子 CAST 操作を行なう必要がありま
す。これは、FORMAT 句をデータ タイプに突き合わせるための規則によるものです。
例
テーブル INTTIME のフィールド T1 は、明示的なフォーマット'HH:MI:SSDS(6)'を使
用した TIME(6)値です。この値を CHAR(6)の値に変換し、'HHhMIm'の明示的な出力
フォーマットにすると仮定します。
SELECT T1 FROM INTTIME ;
結果(タイプの変更はなし)は、以下のレポートになります。
628
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から Period への変換
T1
--------------05:57:11.362271
入れ子 CAST 句と FORMAT を使って、目的の結果を入手します。つまり、文字書式
のレポートです。
SELECT
CAST( (CAST (T1 AS FORMAT 'HHhMim'))
AS CHAR(6))
FROM INTTIME;
入れ子 CAST の結果は、以下のレポートになります。
T1
-----05h57m
内部 CAST は TIME 値の表示書式を確立し、外部 CAST は必要な結果のデータ タイ
プを示します。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
TIME から Period への変換
目的
TIIME データを PERIOD(TIME(n) [WITH TIME ZONE])または
PERIOD(TIMESTAMP(n)[WITH TIME ZONE])として変換します。
CAST 構文
CAST
( timestamp_expression
AS
period_data_type
)
data_attribute
構文要素
time_expression
変換する TIME 式。
SQL 関数、演算子、式および述部
629
第 13 章 データ型の変換
TIME から Period への変換
period_data_type
式が変換されるデータ型。
period_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
使用上の注意
TIME(n) [WITH TIME ZONE]値は、CAST 関数を使用すると PERIOD(TIME[(n)]
[WITHTIMEZONE])または PERIOD(TIMESTAMP[(n)] [WITH TIME ZONE])としてキャ
ストできます。
変換先の精度が変換元の精度より高い場合、精度を調整するために結果の境界の末
尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、エラーが報
告されます。
変換元の TIME 値にうるう秒が含まれている場合、秒部分は変換先の精度にまで精
度を切り詰めた 59.999999 に調整されます。
変換先のタイプが PERIOD(TIME[(n)] [WITH TIME ZONE])の場合、結果の開始要素は
(UTC での)変換元の値に設定されます。変換先タイプが PERIOD(TIMESTAMP[(n)]
WITH TIME ZONE)の場合、変換元の時間値は、対応する UTC 値を基に現在のセッ
ションのタイムゾーン変位に調整され、結果の開始要素の日付部分は CURRENT_DATE
に設定されます。時間部分は前述の調整を実行した後に取得した変換元の値に設定
され、結果のタイムスタンプ値は UTC に変換されます。変換元と変換先のタイプが
どちらも WITH TIME ZONE の場合、結果の開始要素のタイムゾーンフィールドは変
換元のタイムゾーンフィールドに設定されます。変換先にのみ WITH TIME ZONE が
ある場合、結果の開始要素のタイムゾーンフィールドは現在のセッションのタイム
ゾーン変位に設定されます。結果の終了要素は、結果の開始境界に変換先タイプの
1 最小単位を加算したものに設定されます。結果の終了境界の値が、
PERIOD(TIME[(n)] [WITH TIME ZONE])の変換先タイプの結果の開始境界よりも小さ
い場合、または結果の終了要素の値が、PERIOD(TIMESTAMP[(n)] [WITH TIME
ZONE])の変換先タイプの対応する TIMESTAMP 値の最大値よりも大きい場合、エ
ラーが報告されます。
注: 変換先タイプが WITH TIME ZONE の場合、結果の開始境界および終了境界は同
じタイムゾーンでなければなりません。
630
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIME への変換
また、結果は開始境界と最後の値が同じ値になることに注意してください。
例
pt は、TIME '12:12:12'の値を持つテーブル t の TIME(0)列で、現在のセッションの
タイムゾーン変位が INTERVAL -'08:00' HOUR TO MINUTE だとします。
以下の例では、TIME(0)列を PERIOD(TIME(4) WITH TIME ZONE)としてキャストし
ます。結果の開始境界は、精度が 4 になるよう末尾にゼロを追加した(UTC での)変
換元と、現在のセッションのタイムゾーン変位から作成されます。結果の終了要素
は、結果の開始境界に INTERVAL '0.0001' SECOND を加算したものに設定されます。
注: 結果の開始要素と終了要素のタイムゾーンは同じになります。
SELECT CAST(pt AS PERIOD(TIME(4) WITH TIME ZONE)) FROM t;
以下に示すような PERIOD(TIME(4) WITH TIME ZONE)値が返されます。
('12:12:12.0000-08:00', '12:12:12.0001-08:00')
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
TIME から TIME への変換
目的
TIIME または TIME WITH TIME ZONE を、任意選択のデータ属性を使用して TIME
または TIME WITH TIME ZONE に変換します。
SQL 関数、演算子、式および述部
631
第 13 章 データ型の変換
TIME から TIME への変換
CAST 構文
CAST
( time_expression
AS
A
TIME
(fractional_seconds_precision)
B
A
WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
expression
TIME ZONE
time_zone_string
)
B
data_attribute
構文要素
time_expression
変換する TIME 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
詳細については、「AT LOCAL および AT TIME ZONE タイムゾーン指定子」を参照
してください。範囲に source という列が複数ある場合は、エラーが戻されます。
AT [TIME ZONE] expression
time_zone_string は、タイムゾーン変位を決定します。
expression のデータ型は INTERVAL HOUR(2) TO MINUTE か、暗黙的に INTERVAL
HOUR(2) TO MINUTE に変換できるデータ型でなければなりません。
632
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIME への変換
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI の拡張として、CAST では、日時データの代替出力の書式化を可能にするため
に、FORMAT 句を使用することができます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した TIME (タイムゾーンの有無は関係なし)
の TIME WITH TIME ZONE への変換に、AT 句がサポートされるようになりました。
また、INTERVAL 式の他にも追加の式を使用して、タイムゾーン変位を指定するこ
とができます。
注: TIME (without time zone)は、ANSI SQL:2011 互換ではありません。Teradata
Database は、現在のセッションのタイムゾーン、または指定されたタイムゾーンに
基づいて、TIME 値を内部的に UTC に変換します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
Teradata 変換構文
time_expression
(
A
TIME
(fractional_seconds_precision)
data_attribute ,
B
A
, WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
expression
TIME ZONE
B
time_zone_string
)
, data_attribute
SQL 関数、演算子、式および述部
633
第 13 章 データ型の変換
TIME から TIME への変換
構文要素
time_expression
変換する TIME 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
time_zone_string は、タイムゾーン変位を決定します。
式で定義されたタイムゾーンの変位を使用します。
expression のデータ型は INTERVAL HOUR(2) TO MINUTE か、暗黙的に INTERVAL
HOUR(2) TO MINUTE に変換できるデータ型でなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した TIME (タイムゾーンの有無
は関係なし)の TIME WITH TIME ZONE への変換に、AT 句がサポートされるように
634
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIME への変換
なりました。また、INTERVAL 式の他にも追加の式を使用して、タイムゾーン変位
を指定することができます。
注: TIME (without time zone)は、ANSI SQL:2011 互換ではありません。Teradata
Database は、現行セッションのタイムゾーン、または指定されたタイムゾーンに基
づいて、TIME 値を内部的に UTC に変換します。
使用上の注意
変換先データ タイプにタイムゾーンがない TIME[(n)]の AT 句を指定すると、エラー
が返されます。
変換先データ タイプが TIME[(n)] WITH TIME ZONE の AT 句を指定した場合の、
CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以下の
表に示します。変換先の精度が変換元の精度より高い場合、精度を調整するために
結果の末尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、エ
ラーが返されます。
指定内容
time_expression の
データ型
THEN...
AT LOCAL
TIME ZONE の有無は
関係なし
THEN...
AT SOURCE
WITH TIME ZONE
変換元の time_expression (UTC)と、現在のセッ
ションのタイムゾーンに基づくタイムゾーン変位
から結果が生成されます。
(SOURCE はキーワードであり、
列参照ではありません)
AT SOURCE
time_expression のデータ型がタイムゾーンなしの
ときには、AT 句を指定しない場合と同じ結果にな
ります。
without TIME ZONE
(SOURCE はキーワードであり、
列参照ではありません)
変換元の time_expression の時間部分(UTC)と、
time_expression に関連付けられたタイムゾーン変
位から結果が生成されます。
これは、AT 句を指定しない場合と同じ結果になり
ます。
AT SOURCE TIME ZONE
WITH TIME ZONE
変換元の time_expression の時間部分(UTC)と、
time_expression に関連付けられたタイムゾーン変
位から結果が生成されます。
これは、AT 句を指定しない場合と同じ結果になり
ます。
AT SOURCE TIME ZONE
without TIME ZONE
エラーが戻されます。
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は
関係なし
変換元の time_expression の時間部分(UTC)と、
expression で定義されるタイムゾーン変位から結
果が生成されます。
SQL 関数、演算子、式および述部
635
第 13 章 データ型の変換
TIME から TIME への変換
time_expression の
データ型
指定内容
AT time_zone_string
TIME ZONE の有無は
または
関係なし
AT TIME ZONE time_zone_string
THEN...
変換元の time_expression の時間部分(UTC)と、
time_zone_string で定義されるタイムゾーン変位か
ら結果が生成されます。タイムゾーン変位は、
time_zone_string、CURRENT_TIMESTAMP AT
'00:00'、および time_expression の TIME 値(UTC)
に基づいて決定されます。
例
例
この例では、現在のセッションのタイムゾーン変位 INTERVAL '01:00' HOUR TO
MINUTE を使用して、TIME 定数の UTC 値'07:30:00'を決定しています。
CAST の結果は、変換元の式値の時間部分'07:30:00' (UTC)と、現在のタイムゾーン
変位 INTERVAL '01:00' HOUR TO MINUTE から生成されます。
UTC での CAST '07:30:00'の結果値がタイムゾーン変位 INTERVAL '01:00' HOUR TO
MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'08:30:00+01:00'
SELECT 文の結果は、UTC の値に基づいて値が比較されるため、TIME
'07:30:00+00:00'と等しくなります。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIME(0) WITH TIME ZONE);
SELECT CAST(TIME '08:30:00' AS TIME(0) WITH TIME ZONE AT LOCAL);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIME 定数の UTC 値'04:30:00'を決定しています。
CAST の結果は、変換元の式値の時間部分'04:30:00' (UTC)と、現在のセッションの
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成されます。
UTC での CAST '04:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'20:30:00-08:00'
SELECT 文の結果は、TIME '04:30+00:00'と等しくなります。
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIME(0)
WITH TIME ZONE AT LOCAL);
636
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIME への変換
例
次の SELECT 文は、変換元の式にタイムゾーン変位が存在しないために、エラーを
返します。
SELECT CAST(TIME '08:30:00' AS TIME(0)
WITH TIME ZONE AT SOURCE TIME ZONE);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIME 定数の UTC 値'04:30:00'を決定しています。
CAST の結果は、変換元の式値の時間部分'04:30:00' (UTC)と、変換元の式のタイム
ゾーン変位 INTERVAL '04:00' HOUR TO MINUTE から生成されます。
UTC での CAST '04:30:00'の結果値がタイムゾーン変位 INTERVAL '04:00:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'08:30:00+04:00'
SELECT 文の結果は、TIME '04:30:00+00:00'と等しくなります。現在のセッション
のタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE は、影響しません。
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIME(0) WITH TIME ZONE);
SELECT CAST(TIME '08:30:00+04:00' AS TIME(0)
WITH TIME ZONE AT SOURCE);
例
この例では、現在のセッションのタイムゾーン変位 INTERVAL -'04:00' HOUR TO
MINUTE を使用して、TIME 定数の UTC 値'12:30:00'を決定しています。
CAST の結果は、変換元の式値の時間部分'12:30:00' (UTC)と、指定したタイムゾー
ン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成されます。
UTC での CAST '12:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00'
HOUR TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'04:30:00-08:00'
SELECT 文の結果は、TIME '12:30:00+00:00'と等しくなります。
SET TIME ZONE INTERVAL -'04:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIME(0) WITH TIME ZONE AT -8);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIME 定数の UTC 値'04:30:00'を決定しています。
CAST の結果は、変換元の式値の時間部分'04:30:00' (UTC)と、指定したタイムゾー
ン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成されます。
SQL 関数、演算子、式および述部
637
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
UTC での CAST '04:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'20:30:00-08:00'
SELECT 文の結果は、TIME '04:30:00+00:00'と等しくなります。現在のセッション
のタイムゾーン変位 INTERVAL '08:00' HOUR TO MINUTE は、影響しません。
SET TIME ZONE INTERVAL '08:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIME(0)
WITH TIME ZONE AT -8);
例
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文では、TIME 値'08:30:00'を、TIME WITH TIME ZONE 値に変換します。ここ
でのタイムゾーン変位はタイムゾーン文字列'America Pacific'に基づきます。
SELECT CAST(TIME '08:30:00' AS TIME(0) WITH TIME ZONE
AT 'America Pacific');
08:30:00
-------------00:30:00-08:00
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 詳細については、「AT LOCAL および AT TIME ZONE タイムゾーン指定子」を参
照してください。範囲に source という列が複数ある場合は、エラーが戻されます。
TIME から TIMESTAMP への変換
目的
TIIME または TIME WITH TIME ZONE を、任意選択のデータ属性を使用して
TIMESTAMP または TIMESTAMP WITH TIME ZONE に変換します。
638
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
CAST 構文
CAST
( time_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
B
A
WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
expression
TIME ZONE
time_zone_string
)
B
data_attribute
構文要素
time_expression
変換する TIME 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
time_zone_string は、タイムゾーン変位を決定します。
式で定義されたタイムゾーンの変位を使用します。
expression のデータ型は INTERVAL HOUR(2) TO MINUTE か、暗黙的に INTERVAL
HOUR(2) TO MINUTE に変換できるデータ型でなければなりません。
SQL 関数、演算子、式および述部
639
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、日時データの代替出力の書式化を可能にするため
に、FORMAT 句を使用することができます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した TIME から TIMESTAMP への変換に、AT
句がサポートされるようになりました。また、INTERVAL 式の他にも追加の式を使
用して、タイムゾーン変位を指定することができます。
注: TIME (without time zone)と TIMESTAMP (without time zone)は ANSI SQL:2011
互換ではありません。Teradata Database は、現行セッションのタイムゾーン、また
は指定されたタイムゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換しま
す。
Teradata 変換構文
time_expression
(
A
TIMESTAMP
(fractional_seconds_precision)
data_attribute ,
B
A
, WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
expression
TIME ZONE
B
time_zone_string
)
, data_attribute
640
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
構文要素
time_expression
変換する TIME 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
time_zone_string は、タイムゾーン変位を決定します。
式で定義されたタイムゾーンの変位を使用します。
expression のデータ型は INTERVAL HOUR(2) TO MINUTE か、暗黙的に INTERVAL
HOUR(2) TO MINUTE に変換できるデータ型でなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した TIME から TIMESTAMP へ
の変換に、AT 句がサポートされるようになりました。また、INTERVAL 式の他にも
追加の式を使用して、タイムゾーン変位を指定することができます。
SQL 関数、演算子、式および述部
641
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
注: TIME (without time zone)と TIMESTAMP (without time zone)は ANSI SQL:2011
互換ではありません。Teradata Database は、現行セッションのタイムゾーン、また
は指定されたタイムゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換しま
す。
使用上の注意
変換先データ型にタイムゾーンがない TIMESTAMP[(n)]の AT 句を指定したときに、
CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以下の
表に示します。変換先の精度が変換元の精度より高い場合、精度を調整するために
結果の末尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、エ
ラーが返されます。
指定内容
time_expression の
データ型
AT LOCAL
TIME ZONE の有無は 変換元の time_expression (UTC)は、現在のセッショ
関係なし
ンのタイムゾーンに基づくタイムゾーン変位を追加
することで調整されます。ローカルのタイムスタン
プ値は、上記のタイムゾーン変位での
CURRENT_DATE と、前回の調整後に取得した
time_expression の時間部分から生成されます。結
果は、このローカルのタイムスタンプ値から上記の
タイムゾーン変位を引いて UTC に調整した、タイ
ムスタンプ値になります。
THEN...
これは、AT 句を指定しない場合と同じ結果になり
ます。
AT SOURCE
WITH TIME ZONE
変換元の time_expression (UTC)は、
time_expression のタイムゾーン変位を加えること
で調整されます。ローカルのタイムスタンプ値は、
CURRENT_DATE (time_expression のタイムゾーン
変位に基づく)と、前回の調整後に取得した
time_expression の時間部分から生成されます。結
果は、このローカルのタイムスタンプ値から、
time_expression のタイムゾーン変位を引いて UTC
に調整されたタイムスタンプ値になります。
without TIME ZONE
エラーが戻されます。
WITH TIME ZONE
変換元の time_expression (UTC)は、
time_expression のタイムゾーン変位を加えること
で調整されます。ローカルのタイムスタンプ値は、
CURRENT_DATE (time_expression のタイムゾーン
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE TIME ZONE
642
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
time_expression の
データ型
指定内容
THEN...
変位に基づく)と、前回の調整後に取得した
time_expression の時間部分から生成されます。結
果は、このローカルのタイムスタンプ値から、
time_expression のタイムゾーン変位を引いて UTC
に調整されたタイムスタンプ値になります。
AT SOURCE TIME ZONE
without TIME ZONE
エラーが戻されます。
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は 変換元の time_expression (UTC)は、expression で
関係なし
定義されたタイムゾーン変位を加えることで調整さ
れます。
ローカルのタイムスタンプ値は、上記のタイムゾー
ン変位での CURRENT_DATE と、上記の調整後に取
得した time_expression の時間部分から生成されま
す。結果は、このローカルのタイムスタンプ値から
上記のタイムゾーン変位を引いて UTC に調整した、
タイムスタンプ値になります。
AT time_zone_string
または
AT TIME ZONE time_zone_string
TIME ZONE の有無は 変換元の time_expression (UTC)は、
関係なし
time_zone_string に基づくタイムゾーン変位を加え
ることで調整されます。タイムゾーン変位は、
time_zone_string、CURRENT_TIMESTAMP AT
'00:00'、および time_expression の TIME 値(UTC)
に基づいて決定されます。
ローカルのタイムスタンプ値は、上記のタイムゾー
ン変位での CURRENT_DATE と、上記の調整後に取
得した time_expression の時間部分から生成されま
す。結果は、このローカルのタイムスタンプ値から
上記のタイムゾーン変位を引いて UTC に調整した、
タイムスタンプ値になります。
変換先データ型が TIMESTAMP[(n)] WITH TIME ZONE の AT 句を指定したときの、
CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以下の
表に示します。変換先の精度が変換元の精度より高い場合、精度を調整するために
結果の末尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、エ
ラーが返されます。
指定内容
time_expression の
データ型
AT LOCAL
TIME ZONE の有無は 変換元の time_expression (UTC)は、現在のセッショ
関係なし
ンのタイムゾーンに基づくタイムゾーン変位を追加
することで調整されます。ローカルのタイムスタン
プ値は、上記のタイムゾーン変位での
SQL 関数、演算子、式および述部
THEN...
643
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
指定内容
time_expression の
データ型
THEN...
CURRENT_DATE と、上記の調整後に取得した
time_expression の時刻部分から生成されます。こ
の結果のタイムスタンプは UTC に調整され、CAST
の結果値(UTC)は、上記のタイムゾーン変位に調整
されます。
time_expression のデータ タイプがタイムゾーンな
しのときには、AT 句を指定しない場合と同じ結果に
なります。
AT SOURCE
WITH TIME ZONE
変換元の time_expression (UTC)は、
time_expression のタイムゾーン変位を加えること
で調整されます。ローカルのタイムスタンプ値は、
CURRENT_DATE (time_expression のタイムゾーン
変位に基づく)と、前回の調整後に取得した
time_expression の時間部分から生成されます。こ
の結果のタイムスタンプは UTC に調整され、CAST
の結果値(UTC)は、time_expression のタイムゾーン
変位に調整されます。
without TIME ZONE
エラーが戻されます。
AT SOURCE TIME ZONE
WITH TIME ZONE
変換元の time_expression (UTC)は、
time_expression のタイムゾーン変位を加えること
で調整されます。ローカルのタイムスタンプ値は、
CURRENT_DATE (time_expression のタイムゾーン
変位に基づく)と、前回の調整後に取得した
time_expression の時間部分から生成されます。こ
の結果のタイムスタンプは UTC に調整され、CAST
の結果値(UTC)は、time_expression のタイムゾーン
変位に調整されます。
AT SOURCE TIME ZONE
without TIME ZONE
エラーが戻されます。
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は 変換元の time_expression (UTC)は、expression で定
関係なし
義されるタイムゾーン変位を加えることで調整され
ます。
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE
(SOURCE はキーワードであり、列参
照ではありません)
ローカルのタイムスタンプ値は、上記のタイムゾー
ン変位での CURRENT_DATE と、上記の調整後に取
得した time_expression の時刻部分から生成されま
644
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
time_expression の
データ型
指定内容
THEN...
す。この結果のタイムスタンプは UTC に調整され、
CAST の結果値(UTC)は、上記のタイムゾーン変位に
調整されます。
AT time_zone_string
または
AT TIME ZONE time_zone_string
TIME ZONE の有無は 変換元の time_expression (UTC)は、
関係なし
time_zone_string に基づくタイムゾーン変位を追加
することで調整されます。タイムゾーン変位は、
time_zone_string、CURRENT_TIMESTAMP AT
'00:00'、および time_expression の TIME 値(UTC)
に基づいて決定されます。
ローカルのタイムスタンプ値は、上記のタイムゾー
ン変位での CURRENT_DATE と、上記の調整後に取
得した time_expression の時刻部分から生成されま
す。この結果のタイムスタンプは UTC に調整され、
CAST の結果値(UTC)は、上記のタイムゾーン変位に
調整されます。
TIME から TIMESTAMP への暗黙的変換
Teradata Database は、場合によっては、TIME から TIMESTAMP データ型への暗黙
の変換を実行します。ただし、TIME から TIMESTAMP への暗黙的な変換は、比較
ではサポートされていません。「DateTime 型の暗黙的変換」を参照してください。
以下の変換をサポートします。
変換元タイプ
変換先タイプ
TIME
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIME WITH TIME ZONE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
例
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14' と仮定すると、次の SELECT 文は次の結果を返します。TIMESTAMP
'2008-05-14 08:30:00'
SQL 関数、演算子、式および述部
645
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0));
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) AT LOCAL);
現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を使用
して、文字列定数の UTC 値'23:30:00'を決定します。
CAST の場合は、変換元の式値'23:30:00' (UTC)が、現在のセッションのタイムゾー
ン変位 INTERVAL '09:00' TO MINUTE に調整され、'08:30:00'が導き出されます。
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付'2008-05-14'
と、変換元の式値'08:30:00'からタイムスタンプが生成されます。タイムゾーン変位
INTERVAL '09:00' HOUR TO MINUTE での、このタイムスタンプ'2008-05-14
08:30:00'は UTC に合わせて調整されるため、CAST の結果は UTC で'2008-05-13
23:30:00'になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL
'09:00:00' HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようにな
ります。TIMESTAMP '2008-05-14 08:30:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'と仮定すると、次の SELECT 文は次の結果を返します。TIMESTAMP
'2008-05-14 13:30:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0));
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0) AT LOCAL);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、現
在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE に調整さ
れ、'13:30:00'が導き出されます。
タイムゾーン変位 INTERVAL HOUR '09:00' TO MINUTE での現在の日付'2008-05-14'
と、変換元の式値'13:30:00'からタイムスタンプが生成されます。タイムゾーン変位
INTERVAL '09:00' HOUR TO MINUTE での、このタイムスタンプ'2008-05-14
13:30:00'は UTC に合わせて調整されるため、CAST の結果は UTC で'2008-05-14
04:30:00'になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL '09:00'
HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようになります。
TIMESTAMP '2008-05-14 13:30:00'
例
次の SELECT 文は、変換元の式にタイムゾーンが存在しないために、エラーを返し
ます。
646
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
SELECT CAST(TIME '08:30:00'
SELECT CAST(TIME '08:30:00'
SELECT CAST(TIME '08:30:00'
AT SOURCE TIME ZONE);
SELECT CAST(TIME '08:30:00'
AT SOURCE);
AS TIMESTAMP(0) AT SOURCE TIME ZONE);
AS TIMESTAMP(0) AT SOURCE);
AS TIMESTAMP(0) WITH TIME ZONE
AS TIMESTAMP(0) WITH TIME ZONE
例
タイムゾーン変位 INTERVAL '9:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での現在
の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返し
ます。TIMESTAMP '2008-05-13 13:30:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0)
AT SOURCE TIME ZONE);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、
変換元のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE に調整されて、
'08:30:00'が導き出されます。
タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での現在の日付
'2008-05-13'と、上記の調整後に取得した変換元の式値の時間部分'08:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL '04:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-13 08:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'2008-05-13 04:30:00'になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL
'09:00:00' HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようにな
ります。TIMESTAMP '13.05.08 13:30:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン INTERVAL -'08:00' HOUR TO MINUTE での現在の
日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返しま
す。TIMESTAMP '2008-05-14 08:30:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) AT -8);
現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を使用
して、文字列定数の UTC 値'23:30:00'を決定します。CAST の場合は、変換元の式
値'23:30:00' (UTC)が、変換先のタイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE に調整され、'15:30:00'が導き出されます。
SQL 関数、演算子、式および述部
647
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在の日付
'2008-05-13'と、上記の調整後に取得した変換元の式値の時間部分'15:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE での、この結果のタイムスタンプ'2008-05-13 15:30:00'は UTC に合わせ
て調整されるため、CAST の結果は UTC で'2008-05-13 23:30:00'になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL
'09:00:00' HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようにな
ります。TIMESTAMP '2008-05-14 08:30:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在
の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返し
ます。TIMESTAMP '2008-05-14 13:30:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0) AT -8);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、変
換先のタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE に調整され、
'20:30:00'が導き出されます。
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在の日付
'2008-05-13'と、上記の調整後に取得した変換元の式値の時間部分'20:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-13 20:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'2008-05-14 04:30:00'になります。
UTC での CAST の結果値は現在のセッションのタイムゾーン変位 INTERVAL '09:00'
HOUR TO MINUTE に調整されるため、SELECT 文の結果は次のようになります。
TIMESTAMP '2008-05-14 13:30:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14' と仮定すると、次の SELECT 文は次の結果を返します。 TIMESTAMP
'2008-05-14 08:30:00+09:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) WITH TIME ZONE);
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) WITH TIME ZONE AT LOCAL);
現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を使用
して、文字列定数の UTC 値'23:30:00'を決定します。CAST の場合は、変換元の式
値'23:30:00' (UTC)が、現在のセッションのタイムゾーン変位 INTERVAL '09:00'
HOUR TO TO MINUTE に調整され、'08:30:00'が導き出されます。
648
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付
'2008-05-14'と、上記の調整後に取得した変換元の式値の時間部分'08:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL '09:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-14 08:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'2008-05-13 23:30:00'と、タイムゾーン変位
INTERVAL '09:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL '09:00:00' HOUR TO
MINUTE に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-14 08:30:00+09:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'だと仮定すると、次の SELECT 文は次の結果を返します。TIMESTAMP
'2008-05-14 13:30:00+09:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0)
WITH TIME ZONE AT LOCAL);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、
現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE に調整
され、'13:30:00'が導き出されます。
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付
'2008-05-14'と、上記の調整後に取得した変換元の式値の時間部分'13:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL '09:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-14 13:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'2008-05-14 04:30:00'と、タイムゾーン変位
INTERVAL '09:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE
に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-14 13:30:00+09:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での現在
の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返し
ます。TIMESTAMP '2008-05-14 08:30:00+04:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0) WITH TIME ZONE);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
SQL 関数、演算子、式および述部
649
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、現
在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO TO MINUTE に調
整され、'13:30:00'が導き出されます。
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付'2008-05-14'
と、上記の調整後に取得した変換元の式値の時間部分'13:30:00'からタイムスタンプ
が生成されます。タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での、こ
のタイムスタンプ'2008-05-14 13:30:00'は UTC に合わせて調整されるため、CAST
の結果は UTC で'2008-05-14 04:30:00'と、タイムゾーン変位 INTERVAL '04:00'
HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL '04:00' INTERVAL TO
MINUTE に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-14 08:30:00+04:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での現在
の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返し
ます。TIMESTAMP '2008-05-13 08:30:00+04:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0) WITH TIME ZONE
AT SOURCE);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、変
換元の式のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE に調整されて、
'08:30:00'が導き出されます。
タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での現在の日付'2008-05-13'
と、上記の調整後に取得した変換元の式値の時間部分'08:30:00'からタイムスタンプ
が生成されます。タイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE での、こ
のタイムスタンプ'2008-05-13 08:30:00'は UTC に合わせて調整されるため、CAST
の結果は UTC で'2008-05-13 04:30:00'と、タイムゾーン変位 INTERVAL '04:00'
HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン INTERVAL '04:00' HOUR TO MINUTE に調
整されるため、SELECT 文の結果は次のようになります。TIMESTAMP '13.05.08
08:30:00+04:00'現在のセッションのタイムゾーンは影響しません。
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在
の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返し
ます。TIMESTAMP '13.05.08 15:30:00-08:00'
650
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から TIMESTAMP への変換
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) WITH TIME ZONE AT -8);
現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を使用
して、文字列定数の UTC 値'23:30:00'を決定します。CAST の場合は、変換元の式
値'23:30:00' (UTC)が、変換先のタイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE に調整され、'15:30:00'が導き出されます。
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在の日付
'2008-05-13'と、上記の調整後に取得した変換元の式値の時間部分'15:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-13 15:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'2008-05-13 23:30:00'と、タイムゾーン変位
INTERVAL -'08:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE
に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-13 15:30:00-08:00'
例
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE での現在の日付が DATE
'2008-05-14'で、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現
在の日付は DATE '2008-05-13'だと仮定します。次の SELECT 文は、次の結果を返
します。TIMESTAMP '13.05.08 20:30:00-08:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0) WITH TIME ZONE
AT -8);
文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE を使用して、
UTC 値'04:30:00'と、その文字列定数のタイムゾーン変位 INTERVAL '04:00' HOUR
TO MINUTE が決定されます。CAST の場合は、変換元の式値'04:30:00' (UTC)が、
変換先のタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE に調整され、
'20:30:00'が導き出されます。
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE での現在の日付
'2008-05-13'と、上記の調整後に取得した変換元の式値の時間部分'20:30:00'からタ
イムスタンプが生成されます。タイムゾーン変位 INTERVAL -'08:00' HOUR TO
MINUTE での、このタイムスタンプ'2008-05-13 20:30:00'は UTC に合わせて調整
されるため、CAST の結果は UTC で'14.05.08 04:30:00'と、タイムゾーン変位
INTERVAL -'08:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE
に調整されるため、SELECT 文の結果は次のようになります。TIMESTAMP
'2008-05-13 20:30:00-08:00'現在のセッションのタイムゾーンは影響しません。
例
この例では、現在のタイムスタンプは次のとおりです。
SQL 関数、演算子、式および述部
651
第 13 章 データ型の変換
TIME から UDT への変換
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文では、TIME 値'08:30:00'を、TIMESTAMP 値に変換します。ここでのタイム
ゾーン変位は、タイムゾーン文字列'America Pacific'に基づきます。
SELECT CAST(TIME '08:30:00' AS TIMESTAMP(0) AT 'America Pacific');
問合わせの結果は、次のとおりです。
08:30:00
------------------2010-03-09 08:30:00
例
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文では、TIME 値'08:30:00+04:00'を、TIMESTAMP 値に変換します。ここでの
タイムゾーン変位は、タイムゾーン文字列'America Pacific'に基づきます。
SELECT CAST(TIME '08:30:00+04:00' AS TIMESTAMP(0)
AT 'America Pacific');
問合わせの結果は、次のとおりです。
08:30:00+04:00
------------------2010-03-10 04:30:00
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、B035-1143>
を参照してください。
TIME から UDT への変換
目的
TIME データを UDT データに変換します。
652
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIME から UDT への変換
CAST 構文
CAST
( timestamp_expression
AS
UDT_data_type (
構文要素
time_expression
変換する TIME 式。
UDT_data_definition
式が変換される UDT の型(FORMAT、NAMED、または TITLE データ属性句が続く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った TIME から UDT への明示的な変換はサポートされてい
ません。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。CREATE CAST の詳
細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を参照してください。
TIME から UDT への暗黙的変換
Teradata Database は、以下の操作に対して TIME から UDT への暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST
定義(「使用上の注意」を参照)が存在する必要があります。
TIME から UDT への暗黙的なキャスト定義が存在しない場合、Teradata Database は
TIME から UDT への暗黙的なキャスト定義に代用できる CHAR から UDT への、ま
たは VARCHAR から UDT への暗黙的なキャスト定義を検索します。Teradata
Database は TIME 型を文字データ型に暗黙的にキャストしてから、暗黙的なキャス
SQL 関数、演算子、式および述部
653
第 13 章 データ型の変換
TIMESTAMP から文字への変換
ト定義を使用して、その文字データ型から UDT へのキャストを行なえるため、代用
は有効です。文字から UDT への暗黙の CAST 定義が複数存在する場合、Teradata
Database は SQL エラーを戻します。
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
TIMESTAMP から文字への変換
目的
TIMESTAMP データを文字列に変換します。
CAST 構文
CAST
( timestamp_expression
AS
A
character_data_type
)
A
CHARACTER SET
server_character_set
data_attribute
構文要素
timestamp_expression
変換する TIME 式。
character_data_type
式が変換されるデータ型。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
character_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
654
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から文字への変換
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で文字データ属性句を使用できます。
Teradata 変換構文
timestamp_expression
(
character_data_type
A
data_attribute ,
)
A
,
data_attribute
CHARACTER SET
server_character_set
構文要素
timestamp_expression
変換する TIMESTAMP 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
character_data_type
式が変換されるデータ型。
server_character_set
変換に使用するサーバー文字セット。CHARACTER SET 句を省略した場合は、ユー
ザー デフォルトのサーバー文字セットが使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
TIMESTAMP から CHAR(n)または VARCHAR(n)への変換時に、n は、文字列定数に
よって表わされた TIMESTAMP 値の長さと等しいかそれよりも長くなければなりま
せん。
SQL 関数、演算子、式および述部
655
第 13 章 データ型の変換
TIMESTAMP から文字への変換
変換先データ タイプ
n
CHAR(n)
文字列定数で表わされた
末尾の埋め込み文字が表記を埋める
TIMESTAMP 値の長さより ために追加される。
長い
小さすぎる
VARCHAR(n)
結果
文字切り捨てエラーが戻される。
文字列定数で表わされた
ブランク埋め込みは文字表記に追加
TIMESTAMP 値の長さより されない。
長い
小さすぎる
文字切り捨てエラーが戻される。
TIMESTAMP から CLOB への変換はサポートされていません。
サーバー文字セットが GRAPHIC の場合は、TIME 値を文字列に変換することはでき
ません。
TIMESTAMP から文字への変換に対する CAST での FORMAT の強制
TIMESTAMP から文字への変換のデフォルトの書式は、TIMESTAMP 値に有効な書式
を使用します。
この書式をオーバーライドするには、FORMAT 句を使って、TIMESTAMP 値を文字
列に変換できます。ただし、結果の書式は、TIMESTAMP 値と同じになります。文
字列値で別の書式を使用する場合は、以下で説明するように CAST を併用する必要
があります。
TIMESTAMP 値に関連する書式にかかわらず、TIMESTAMP から CHAR に値を変換
し、その結果において明示的な FORMAT を強制するには、入れ子 CAST 操作を行な
う必要があります。これは、FORMAT 句をデータ タイプに突き合わせるための規則
によるものです。
例
テーブル INTTIMESTAMP のフィールド TS1 は、明示的なフォーマット'Y4-MMDDBHH:MI:SSDS(6)'を使用した TIMESTAMP 値です。この値を CHAR(19)の値に変換
し、'M3BDD,BY4BHHhMIm'の明示的な出力フォーマットにすると仮定します。
SELECT TS1 FROM INTTIMESTAMP;
結果(タイプの変更はなし)は、以下のレポートになります。
TS1
-------------------------1900-12-31 08:25:37.899231
入れ子 CAST 句と FORMAT を使って、目的の結果を入手します。つまり、文字書式
のレポートです。
656
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
SELECT
CAST( (CAST (TS1 AS FORMAT 'M3BDD,BY4BHHhMIm'))
AS CHAR(19))
FROM INTTIMESTAMP;
入れ子 CAST の結果は、以下のレポートになります。
TS1
------------------Dec 31, 1900 08h25m
内部 CAST は TIMESTAMP 値の表示書式を確立し、外部 CAST は必要な結果のデー
タ タイプを示します。
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
TIMESTAMP から DATE への変換
目的
TIMESTAMP データを DATE 値に変換します。
CAST 構文
CAST
( timestamp_expression
AS
A
DATE
)
A
AT
LOCAL
data_attribute
SOURCE
TIME ZONE
expression
TIME ZONE
time_zone_string
構文要素
timestamp_expression
変換する TIMESTAMP 式。
SQL 関数、演算子、式および述部
657
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
date_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、代替書式を可能にする FORMAT などの DATE データ属性
句を CAST で使用できます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した TIMESTAMP から DATE への変換に、AT
句がサポートされるようになりました。また、INTERVAL 式の他にも追加の式を使
用して、タイムゾーン変位を指定することができます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
658
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
Teradata 変換構文
timestamp_expression
(
B
DATE
data_attribute ,
)
B
AT
LOCAL
, data_attribute
SOURCE
TIME ZONE
expression
TIME ZONE
time_zone_string
構文要素
timestamp_expression
変換する TIME 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
SQL 関数、演算子、式および述部
659
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した TIMESTAMP から DATE への
変換に、AT 句がサポートされるようになりました。また、INTERVAL 式の他にも追
加の式を使用して、タイムゾーン変位を指定することができます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
使用上の注意
次の表は、CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結
果を示しています。タイムゾーンの調整により、DATE 値の YEAR、MONTH、およ
び DAY フィールドが変更される場合があります。
指定内容
timestamp_expressio THEN...
n のデータ型
AT LOCAL
TIME ZONE の有無は 現在のセッションのタイムゾーンに基づくタイムゾー
関係なし
ン変位を加えることで UTC 値を調整した後の、変換
元の timestamp_expression の日付部分が結果になり
ます。
これは、AT 句を指定しない場合と同じ結果になりま
す。
AT SOURCE
WITH TIME ZONE
timestamp_expression に関連付けられたタイムゾー
ン変位を加えることで UTC 値を調整した後の、変換
元の timestamp_expression の日付部分が結果になり
ます。
without TIME ZONE
エラーが戻されます。
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE
(SOURCE はキーワードであり、列参
照ではありません)
660
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
指定内容
timestamp_expressio THEN...
n のデータ型
AT SOURCE TIME ZONE
WITH TIME ZONE
timestamp_expression に関連付けられたタイムゾー
ン変位を加えることで UTC 値を調整した後の、変換
元の timestamp_expression の日付部分が結果になり
ます。
AT SOURCE TIME ZONE
without TIME ZONE
エラーが戻されます。
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は expression で定義されるタイムゾーン変位を加える
関係なし
ことで UTC 値を調整した後の、変換元の
timestamp_expression の日付部分が結果になりま
す。
AT time_zone_string または
AT TIME ZONE time_zone_string
TIME ZONE の有無は 結果は、time_zone_string に基づくタイムゾーン変
関係なし
位を追加してその UTC 値を調整した後の変換元
timestamp_expression の日付部分です。タイムゾー
ン変位は、time_zone_string と、
timestamp_expression の TIMESTAMP 値を基に決
定されます。
TIMESTAMP から DATE への暗黙的変換
Teradata Database は、TIMESTAMP タイプから DATE への暗黙的変換を実行する場
合があります。「DateTime 型の暗黙的変換」を参照してください。
以下の変換をサポートします。
変換元タイプ
変換先タイプ
TIMESTAMP
DATE
TIMESTAMP WITH TIME ZONE
ANSIDate 日付形式モードまたは IntegerDate
日付形式モード
TIMESTAMP 値は、比較の場合には常に DATE に変換されます。
例
例
単一列のテーブルに、TIMESTAMP(0) WITH TIME ZONE タイプの行が 3 つあります。
フィールド値を要求し、それらを DATE としてキャストする問合せが、その現地の
タイムゾーンが-’08:00’に定義されているセッション時に実行されます。
結果として得られるテーブルは、以下のとおりです。
TimeStampWithTimeZone
CastAsDate
-------------------------------------------------
SQL 関数、演算子、式および述部
661
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
1997-10-07 15:43:00+08:00 1997-10-06
1997-10-07 15:47:52-08:00 1997-10-07
1997-10-07 15:43:00-00:00 1997-10-07
格納されたタイムゾーンと現地タイムゾーンの差は最初の行では 16 時間ですが、同
時に TimeStamp 値は 15:43 であり、16 時間よりも少ない点に注意する必要があり
ます。
このような結果の不一致は、TIMESTAMP(0)として TIMESTAMP(0) WITH TIME
ZONE をキャストする類似した問合わせを使用してタイムゾーン情報を省略すると、
解決することができます。
この問合わせの結果のテーブルは、以下のとおりです。
TimeStampWithTimeZone
CastAsTimeStamp
------------------------------------------------1997-10-07 15:43:00+08:00 1997-10-06 23:43:00
1997-10-07 15:47:52-08:00 1997-10-07 15:47:52
1997-10-07 15:43:00-00:00 1997-10-07 07:43:00
CAST の後、値はすべて現地タイムゾーンで表示され、最初の行の値は 16 時間調整
されて、日付が 1 日戻った遅い時間を示します。
例
次の文を考えてみましょう。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-05-31 22:30:00-08:00'
AS DATE AT SOURCE TIME ZONE);
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00' AT '-08:00'
(DATE, AT SOURCE);
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00' (DATE, AT -8);
SELECT TIMESTAMP '2008-06-01 07:30:00' (DATE, AT -8);
これらの SELECT 文は、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE の
日付を返します。つまり、これらの文は'08/05/31'を返します。これらの SELECT
文に AT 句が指定されていない、または AT LOCAL 句が指定されている場合は、現
在のセッションのタイムゾーン変位 INTERVAL '01:00' HOUR TO MINUTE の
'08/06/01'が返されることになります。
次に、AT 句が指定されていなかった場合の、SELECT 文の結果を示します。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-05-31 22:30:00-08:00' AS DATE);
2008-05-31 22:30:00-08:00
------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00'
AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
662
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
2008-06-01 06:30:00+00:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------------2008-05-31 22:30:00-08:00
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00'
AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE (DATE);
2008-06-01 06:30:00+00:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00' (DATE);
2008-06-01 06:30:00+00:00
------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 07:30:00' (DATE);
2008-06-01 07:30:00
------------------08/06/01
次に、現在のセッションのタイムゾーン変位が INTERVAL -'08:00' HOUR TO MINUTE
で、AT 句が指定されていない SELECT 文の結果を示します。
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-05-31 22:30:00-08:00' AS DATE);
2008-05-31 22:30:00-08:00
------------------------08/05/31
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00'
AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE (DATE);
2008-06-01 06:30:00+00:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------------08/05/31
SELECT TIMESTAMP '2008-06-01 06:30:00+00:00' (DATE);
2008-06-01 06:30:00+00:00
------------------------08/05/31
SELECT CAST(TIMESTAMP '2008-06-01 07:30:00+01:00'
AS TIMESTAMP(0)) (DATE);
2008-06-01 07:30:00+01:00
------------------------08/05/31
例
次の文を考えてみましょう。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-02 04:30:00+09:00'
AS DATE AT SOURCE TIME ZONE);
SQL 関数、演算子、式および述部
663
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
SELECT TIMESTAMP '2008-06-01 20:30:00+01:00'
AT TIME ZONE INTERVAL '09' HOUR (DATE, AT SOURCE);
SELECT TIMESTAMP '2008-06-01 20:30:00' (DATE, AT +9);
これらの SELECT 文は、タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE の
日付を返します。つまり、これらの文は'08/06/02'を返します。これらの SELECT
文に AT 句が指定されていない、または AT LOCAL 句が指定されている場合は、現
在のセッションのタイムゾーン変位 INTERVAL '01:00' HOUR TO MINUTE の
'08/06/01'が返されることになります。
次に、AT 句が指定されていなかった場合の、SELECT 文の結果を示します。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-02 04:30:00+09:00' AS DATE);
2008-06-02 04:30:00+09:00
------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 20:30:00+01:00'
AT TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
2008-06-01 20:30:00+01:00 AT TIME ZONE INTERVAL 9:00 HOUR TO MINUTE
-------------------------------------------------------------------2008-06-02 04:30:00+09:00
SELECT TIMESTAMP '2008-06-01 20:30:00+01:00'
AT TIME ZONE INTERVAL '09:00' HOUR TO MINUTE (DATE);
2008-06-01 20:30:00+01:00 AT TIME ZONE INTERVAL 9:00 HOUR TO MINUTE
-------------------------------------------------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 20:30:00' (DATE);
2008-06-01 20:30:00
------------------08/06/01
次に、現在のセッションのタイムゾーン変位が INTERVAL '09:00' TO MINUTE で、
AT 句が指定されていない SELECT 文の結果を示します。
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-02 04:30:00+09:00' AS DATE);
2008-06-02 04:30:00+09:00
------------------------08/06/02
SELECT TIMESTAMP '2008-06-01 20:30:00+01:00'
AT TIME ZONE INTERVAL '09:00' HOUR TO MINUTE (DATE);
2008-06-01 20:30:00+01:00 AT TIME ZONE INTERVAL 9:00 HOUR TO MINUTE
-------------------------------------------------------------------08/06/02
SELECT CAST(TIMESTAMP '2008-06-01 20:30:00+01:00'
AS TIMESTAMP(0)) (DATE);
664
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
2008-06-01 20:30:00+01:00
------------------------08/06/02
例
次の文を考えてみましょう。
SET TIME ZONE INTERVAL '10:00' HOUR TO MINUTE;
SELECT CAST((TIMESTAMP '2008-06-01 18:30:00+01:00' AT '05:45')
AS DATE AT SOURCE);
SELECT CAST((TIMESTAMP '2008-06-01 18:30:00+01:00' AT 5.75)
AS DATE AT SOURCE);
SELECT TIMESTAMP '2008-06-01 23:15:00+05:45'
(DATE, AT SOURCE TIME ZONE);
SELECT TIMESTAMP '2008-06-02 03:30:00' (DATE, AT '05:45');
SELECT TIMESTAMP '2008-06-02 03:30:00' (DATE, AT 5.75);
これらの SELECT 文は、タイムゾーン変位 INTERVAL '05:45' HOUR TO MINUTE の
日付を返します。つまり、これらの文は'08/06/01'を返します。これらの SELECT
文に AT 句が指定されていない、または AT LOCAL 句が指定されている場合は、現
在のセッションのタイムゾーン変位 INTERVAL '10:00' HOUR TO MINUTE の
'08/06/02'が返されることになります。
次に、AT 句が指定されていなかった場合の、SELECT 文の結果を示します。
SET TIME ZONE INTERVAL '10:00' HOUR TO MINUTE;
SELECT TIMESTAMP '2008-06-01 18:30:00+01:00'
AT TIME ZONE INTERVAL '05:45' HOUR TO MINUTE;
2008-06-01 18:30:00+01:00 AT TIME ZONE INTERVAL 5:45 HOUR TO MINUTE
-------------------------------------------------------------------2008-06-01 23:15:00+05:45
SELECT CAST((TIMESTAMP '2008-06-01 18:30:00+01:00'
AT TIME ZONE INTERVAL '05:45' HOUR TO MINUTE) AS DATE);
2008-06-01 18:30:00+01:00 AT TIME ZONE INTERVAL 5:45 HOUR TO MINUTE
-------------------------------------------------------------------08/06/02
SELECT TIMESTAMP '2008-06-01 23:15:00+05:45' (DATE);
2008-06-01 23:15:00+05:45
------------------------08/06/02
SELECT TIMESTAMP '2008-06-02 03:30:00' (DATE);
2008-06-02 03:30:00
------------------08/06/02
次に、現在のセッションのタイムゾーン変位が INTERVAL '05:45' HOUR TO MINUTE
で、AT 句が指定されていない SELECT 文の結果を示します。
SQL 関数、演算子、式および述部
665
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
SET TIME ZONE INTERVAL '05:45' HOUR TO MINUTE;
SELECT CAST((TIMESTAMP '2008-06-01 18:30:00+01:00'
AT TIME ZONE INTERVAL'05:45' HOUR TO MINUTE) AS DATE);
2008-06-01 18:30:00+01:00 AT TIME ZONE INTERVAL 5:45 HOUR TO MINUTE
-------------------------------------------------------------------08/06/01
SELECT TIMESTAMP '2008-06-01 23:15:00+05:45' (DATE);
2008-06-01 23:15:00+05:45
------------------------08/06/01
SELECT CAST(TIMESTAMP '2008-06-02 03:30:00+10:00'
AS TIMESTAMP(0)) (DATE);
2008-06-02 03:30:00+10:00
------------------------08/06/01
例
次の文を考えてみましょう。
SET TIME ZONE +1;
SELECT CAST((TIMESTAMP '2008-06-01 08:30:00' AT TIME ZONE -8)
AS DATE AT SOURCE TIME ZONE);
この SELECT 文は、タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE の日付
を返します。つまり、この文は'08/05/31'を返します。この SELECT 文に AT 句が指
定されていない、または AT LOCAL 句が指定されている場合は、現在のセッション
のタイムゾーン変位 INTERVAL HOUR '01:00' MINUTE の'08/06/01'が返されること
になります。
次に、AT 句が指定されていなかった場合の、SELECT 文の結果を示します。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT TIMESTAMP '2008-06-01 08:30:00'
AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
2008-06-01 08:30:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------2008-05-31 23:30:00-08:00
SELECT CAST((TIMESTAMP '2008-06-01 08:30:00'
AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE) AS DATE);
2008-06-01 08:30:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------08/06/01
次に、現在のセッションのタイムゾーン変位が INTERVAL -'08:00' HOUR TO MINUTE
で、AT 句が指定されていない SELECT 文の結果を示します。
666
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から DATE への変換
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST((CAST(TIMESTAMP '2008-06-01 08:30:00+01:00'
AS TIMESTAMP(0)) AT TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE)
AS DATE);
2008-06-01 08:30:00+01:00 AT TIME ZONE INTERVAL -8:00 HOUR TO MINUTE
-------------------------------------------------------------------08/05/31
例
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文では、TIMESTAMP 値'2010-03-09 22:30:00-08:00'を、DATE 値に変換しま
す。ここでのタイムゾーン変位は、タイムゾーン文字列'America Pacific'に基づきま
す。
SELECT CAST(TIMESTAMP '2010-03-09 22:30:00-08:00' AS DATE
AT 'America Pacific');
問合わせの結果は、次のとおりです。
2010-03-09 22:30:00-08:00
------------------------10/03/09
例
次の SELECT 文は、変換元の式に TIMESTAMP WITH TIME ZONE データ タイプが
存在しないために、エラーを返します。
SELECT
SELECT
SELECT
SELECT
CAST(TIMESTAMP '2008-06-01 08:30:00' AS DATE AT SOURCE);
CAST(TIME '08:30:00+03:00' AS DATE AT SOURCE TIME ZONE);
CAST(TIME '08:30:00' AS DATE AT SOURCE);
CAST(DATE '2008-06-01' AS DATE AT SOURCE TIME ZONE);
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
SQL 関数、演算子、式および述部
667
第 13 章 データ型の変換
TIMESTAMP から Period への変換
TIMESTAMP から Period への変換
目的
TIMESTAMP 値を PERIOD(DATE)、PERIOD(TIME[(n)][WITH TIME ZONE])、または
PERIOD(TIMESTAMP[(n)][WITH TIME ZONE])として変換します。
CAST 構文
CAST
( time_expression
AS
)
period_data_type
data_attribute
構文要素
timestamp_expression
変換する TIMESTAMP 式。
period_data_type
式が変換されるデータ型。
period_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST でデータ属性句を使用できます。
使用上の注意
TIMESTAMP(n) [WITH TIME ZONE]値は、CAST 関数を使用すると PERIOD(DATE)、
PERIOD(TIME[(n)] [WITH TIME ZONE])、または PERIOD(TIMESTAMP[(n)] [WITH
TIME ZONE])としてキャストできます。
変換先タイプが PERIOD(TIME(n) [WITH TIME ZONE])または
PERIOD(TIMESTAMP(n)[WITH TIME ZONE])の場合、次のようになります。
• 変換先の精度が変換元の精度より高い場合、精度を調整するために結果の境界の
末尾にゼロが追加されます。
• 変換先の精度が変換元の精度より低い場合、エラーが報告されます。
668
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から Period への変換
変換先のタイプが PERIOD(DATE)の場合、結果の開始境界は現在のセッションのタ
イムゾーンに調整された変換元の開始境界の日付部分になります。
変換先のタイプが PERIOD(TIME[(n)])の場合、結果の開始境界は変換元の(UTC で
の)値の時間部分になります。
変換先のタイプが PERIOD(TIME[(n)] WITH TIME ZONE)の場合、結果の開始境界
は、変換元の値の(UTC での)時間部分と、変換元のタイプが WITH TIME ZONE の場
合は変換元のタイムゾーン変位から、また変換元のタイプが WITH TIME ZONE で
ない場合は現在のセッションのタイムゾーン変位から作成されます。
変換先のタイプが PERIOD(TIMESTAMP[(n)])の場合、結果の開始境界は変換元の
(UTC での)値のタイムスタンプ部分になります。
変換先のタイプが PERIOD(TIMESTAMP[(n)] WITH TIME ZONE)の場合、結果の開始
境界は、変換元の(UTC での)値のタイムスタンプ部分と、変換元のタイプが WITH
TIME ZONE の場合は変換元のタイムゾーン変位から、また変換元のタイプが WITH
TIME ZONE でない場合は現在のセッションのタイムゾーン変位から作成されます。
変換元の TIMESTAMP 値にうるう秒が含まれている場合、秒部分は変換先の精度に
まで精度を切り詰めた 59.999999 に調整されます。
結果の終了要素は、結果の開始境界に変換先タイプの 1 最小単位を加算したものに
設定されます。結果の終了境界が、PERIOD(DATE)または PERIOD(TIMESTAMP[(n)])
の変換先タイプに許容された DATE または TIMESTAMP のそれぞれの最大値を超え
る場合や、終了境界の値が、UTC 形式で PERIOD(TIME[(n)])の変換先タイプの結果
の開始境界より小さい場合には、エラーが報告されます。
注: 変換先タイプが WITH TIME ZONE の場合、結果の開始境界および終了境界は同
じタイムゾーンでなければなりません。
また、結果は開始境界と最後の値が同じ値になることに注意してください。
例
以下の例では、TIMESTAMP(6)リテラルを PERIOD(DATE)としてキャストします。
結果の開始要素は変換元の値の日付部分に設定されます。結果の終了要素は、結果
の開始境界に INTERVAL '1' DAY を加算したものに設定されます。
SELECT CAST(TIMESTAMP '2005-02-03 12:12:12.340000' AS PERIOD(DATE));
次の結果が返されます。
('2005-02-03', '2005-02-04')
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
SQL 関数、演算子、式および述部
669
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
TIMESTAMP から TIME への変換
目的
TIMESTAMP データを TIME 値に変換します。
CAST 構文
CAST
( timestamp_expression
AS
A
TIME
(fractional_seconds_precision)
B
A
WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
TIME ZONE
expression
time_zone_string
)
B
data_attribute
構文要素
timestamp_expression
変換する TIMESTAMP 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
670
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST で TIME データ属性句を使用できます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した TIMESTAMP から TIME への変換に、AT
句がサポートされるようになりました。また、INTERVAL 式の他にも追加の式を使
用して、タイムゾーン変位を指定することができます。
注: TIME(タイムゾーンなし)と TIMESTAMP(タイムゾーンなし)は ANSI SQL:2011 準
拠ではありません。Teradata Database は、現行セッションのタイムゾーンまたは指
定されたタイムゾーンに基づいて TIME 値または TIMESTAMP 値を UTC に内部的に
変換します。
Teradata 変換構文
CAST
( timestamp_expression
AS
A
TIME
(fractional_seconds_precision)
B
A
WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
TIME ZONE
expression
time_zone_string
)
B
data_attribute
SQL 関数、演算子、式および述部
671
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
構文要素
timestamp_expression
変換する TIMESTAMP 式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した TIMESTAMP から TIME への
変換に、AT 句がサポートされるようになりました。また、INTERVAL 式の他にも追
加の式を使用して、タイムゾーン変位を指定することができます。
672
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
注: TIME (without time zone)と TIMESTAMP (without time zone)は ANSI SQL:2011
互換ではありません。Teradata Database は、現行セッションのタイムゾーン、また
は指定されたタイムゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換しま
す。
使用上の注意
変換先データ タイプにタイムゾーンがない TIME[(n)]の AT 句を指定すると、エラー
が返されます。
変換先データ タイプが TIME[(n)] WITH TIME ZONE の AT 句を指定した場合の、
CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以下の
表に示します。変換先の精度が変換元の精度より高い場合、精度を調整するために
結果の末尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、エ
ラーが返されます。
指定内容
timestamp_expressio THEN...
n のデータ型
AT LOCAL
TIME ZONE の有無は 変換元の timestamp_expression (UTC)と、現在の
関係なし
セッションのタイムゾーンに基づくタイムゾーン変
位から結果が生成されます。
timestamp_expression のデータ型がタイムゾーンな
しのときには、AT 句を指定しない場合と同じ結果に
なります。
AT SOURCE
WITH TIME ZONE
(SOURCE はキーワードであり、列参
照ではありません)
変換元の timestamp_expression の時間部分(UTC)
と、timestamp_expression に関連付けられたタイム
ゾーン変位から結果が生成されます。
これは、AT 句を指定しない場合と同じ結果になりま
す。
AT SOURCE
without TIME ZONE
エラーが戻されます。
WITH TIME ZONE
変換元の timestamp_expression の時間部分(UTC)
と、timestamp_expression に関連付けられたタイム
ゾーン変位から結果が生成されます。
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE TIME ZONE
これは、AT 句を指定しない場合と同じ結果になりま
す。
AT SOURCE TIME ZONE
without TIME ZONE
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は 変換元の timestamp_expression の時間部分(UTC)
関係なし
と、expression で定義されるタイムゾーン変位から
結果が生成されます。
SQL 関数、演算子、式および述部
エラーが戻されます。
673
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
指定内容
timestamp_expressio THEN...
n のデータ型
AT time_zone_string
または
AT TIME ZONE time_zone_string
TIME ZONE の有無は 結果は変換元 timestamp_expression (UTC)の時間部
関係なし
分と、time_zone_string に基づくタイムゾーン変位
から生成されます。タイムゾーン変位は、
time_zone_string と、UTC での
timestamp_expression の TIMESTAMP 値に基づい
て決定されます。
TIMESTAMP から TIME への暗黙的変換
Teradata Database は、場合によっては、TIMESTAMP から TIME データ型への暗黙
の変換を実行します。ただし、TIMESTAMP から TIME への暗黙的な変換は、比較で
はサポートされていません。「DateTime 型の暗黙的変換」を参照してください。
以下の変換をサポートします。
変換元タイプ
変換先タイプ
TIMESTAMP
TIME
TIME WITH TIME ZONE
TIMESTAMP WITH TIME ZONE
TIME
TIME WITH TIME ZONE
例
例
この例では、現在のセッションのタイムゾーン変位 INTERVAL '01:00' HOUR TO
MINUTE を使用して、TIMESTAMP 定数の UTC 値'2008-06-01 07:30:00'を決定して
います。
CAST の結果は、変換元の式値'2008-06-01 07:30:00' (UTC)の時間部分と、現在の
タイムゾーン変位 INTERVAL '01:00' HOUR TO MINUTE から生成された時間になり
ます。
UTC での CAST '07:30:00'の結果値がタイムゾーン変位 INTERVAL '01:00' HOUR TO
MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'08:30:00+01:00'
SELECT 文の結果は、UTC の値に基づいて値が比較されるため、TIME
'07:30:00+00:00'と等しくなります。
SET TIME ZONE INTERVAL '01:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00' AS TIME(0)
674
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
WITH TIME ZONE);
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00' AS TIME(0)
WITH TIME ZONE AT LOCAL);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIMESTAMP 定数の UTC 値'2008-06-01 04:30:00'を決定
しています。
CAST の結果は、変換元の式値'2008-06-01 04:30:00' (UTC)の時間部分と、現在の
セッションのタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成さ
れます。
UTC での CAST '04:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00'
HOUR TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'20:30:00-08:00'
SELECT 文の結果は、TIME '04:30+00:00'と等しくなります。
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIME(0) WITH TIME ZONE AT LOCAL);
例
次の SELECT 文は、変換元の式にタイムゾーン変位が存在しないために、エラーを
返します。
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00'
AS TIME(0) WITH TIME ZONE AT SOURCE);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIMESTAMP 定数の UTC 値'2008-06-01 04:30:00'を決定
しています。
CAST の結果は、変換元の式値'2008-06-01 04:30:00' (UTC)の時間部分と、変換元
の式のタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE から生成されます。
UTC での CAST '04:30:00'の結果値がタイムゾーン変位 INTERVAL '04:00:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'08:30:00+04:00'
SELECT 文の結果は、TIME '04:30:00+00:00'と等しくなります。現在のセッション
のタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE は、影響しません。
SET TIME ZONE INTERVAL -'08:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIME(0) WITH TIME ZONE);
SQL 関数、演算子、式および述部
675
第 13 章 データ型の変換
TIMESTAMP から TIME への変換
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIME(0) WITH TIME ZONE AT SOURCE TIME ZONE);
例
この例では、現行セッションのタイムゾーン変位 INTERVAL -'04:00' HOUR TO
MINUTE を使用して、TIMESTAMP 定数の UTC 値'2008-06-01 12:30:00'を決定して
います。
CAST の結果は、ソース式の値の時刻部分'2008-06-01 12:30:00'(UTC)と、指定した
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成された時間です。
UTC での CAST '12:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'04:30:00-08:00'
SELECT 文の結果は、TIME '12:30:00+00:00'と等しくなります。
SET TIME ZONE INTERVAL -'04:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00'
AS TIME(0) WITH TIME ZONE AT -8);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、TIMESTAMP 定数の UTC 値'2008-06-01 04:30:00'を決定し
ています。
CAST の結果は、ソース式の値の時刻部分'2008-06-01 04:30:00'(UTC)と、指定した
タイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE から生成された時間です。
UTC での CAST '04:30:00'の結果値はそのタイムゾーン変位 INTERVAL -'08:00' HOUR
TO MINUTE に調整され、SELECT 文の結果は次のようになります。TIME
'20:30:00-08:00'
SELECT 文の結果は、TIME '04:30:00+00:00'と等しくなります。現在のセッション
のタイムゾーン変位 INTERVAL '08:00' HOUR TO MINUTE は、影響しません。
SET TIME ZONE INTERVAL '08:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIME(0) WITH TIME ZONE AT -8);
例
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
676
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
次の文は、TIMESTAMP 値'2010-03-09 08:30:00'を、TIMESTAMP WITH TIME
ZONE 値に変換します。ここでのタイムゾーン変位は、タイムゾーン文字列'America
Pacific'に基づきます。
SELECT CAST(TIMESTAMP '2010-03-09 08:30:00' AS TIME(0) WITH TIME ZONE
AT 'America Pacific');
問合わせの結果は、次のとおりです。
2010-03-09 08:30:00
------------------00:30:00-08:00
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
TIMESTAMP から TIMESTAMP への変換
目的
TIMESTAMP データを、精度情報が異なる、または WITH TIME ZONE 定義の
TIMESTAMP 値に変換します。
CAST 構文
CAST
A
(
timestamp_expression
A
AS
B
TIMESTAMP
(fractional_seconds_precision)
WITH TIME ZONE
B
)
AT
LOCAL
data_attribute
SOURCE
TIME ZONE
expression
TIME ZONE
time_zone_string
構文要素
timestamp_expression
変換する TIMESTAMP 式。
SQL 関数、演算子、式および述部
677
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI の拡張として、CAST では、日時および間隔データの文字表現の代替出力の書
式化を可能にするために、FORMAT 句を使用することができます。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、CAST を使用した TIMESTAMP から TIMESTAMP への変換
に、AT 句がサポートされるようになりました。また、INTERVAL 式の他にも追加の
式を使用して、タイムゾーン変位を指定することができます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
678
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
Teradata 変換構文
timestamp_expression
(
A
TIMESTAMP
(fractional_seconds_precision)
data_attribute ,
B
A
, WITH TIME ZONE
AT
LOCAL
SOURCE
TIME ZONE
expression
TIME ZONE
B
time_zone_string
)
, data_attribute
構文要素
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
timestamp_expression
変換する TIMESTAMP 式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
AT LOCAL
現在のセッションのタイムゾーンに基づくタイムゾーン変位を使用します。
AT SOURCE [TIME ZONE]
次の場合に、timestamp_expression に付随するタイムゾーンを使用します。
• AT SOURCE TIME ZONE が指定される。
• AT SOURCE が without TIME ZONE で指定され、範囲に source という列がない。
その他の場合、AT SOURCE が without TIME ZONE で指定され、source という列が
存在する場合、SOURCE はこの列を参照し、列の値は CAST のタイムゾーン変位と
して使用されます。必要な場合、列値が型 INTERVAL HOUR(2) TO MINUTE に暗黙
的に変換されます。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
SQL 関数、演算子、式および述部
679
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
AT 句は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、Teradata 変換構文を使用した TIMESTAMP から
TIMESTAMP への変換に、AT 句がサポートされるようになりました。また、
INTERVAL 式の他にも追加の式を使用して、タイムゾーン変位を指定することがで
きます。
注: TIMESTAMP (without time zone)は、ANSI SQL:2011 互換ではありません。
Teradata Database は、現行セッションのタイムゾーン、または指定されたタイム
ゾーンに基づいて、TIMESTAMP 値を内部的に UTC に変換します。
使用上の注意
変換先のデータ タイプにタイムゾーンがない TIMESTAMP[(n)]の AT 句を指定する
と、エラーが返されます。
変換先データ タイプが TIMESTAMP[(n)] WITH TIME ZONE の AT 句を指定したとき
の、CAST 関数、または各種の指定オプションに基づいた Teradata 変換の結果を以
下の表に示します。変換先の精度が変換元の精度より高い場合、精度を調整するた
めに結果の末尾にゼロが追加されます。変換先の精度が変換元の精度より低い場合、
エラーが返されます。
指定内容
timestamp_expressio THEN...
n のデータ型
AT LOCAL
TIME ZONE の有無は 変換元の timestamp_expression のタイムスタンプ部
関係なし
分(UTC)と、現在のセッションのタイムゾーンに基
づいた結果のタイムゾーン変位から結果が生成され
ます。
変換元のデータ タイプにタイムゾーンがないときに
は、AT 句を指定していない場合と同じになります。
AT SOURCE
(SOURCE はキーワードであり、列参
照ではありません)
WITH TIME ZONE
変換元の timestamp_expression のタイムスタンプ部
分(UTC)と、timestamp_expression に関連付けられ
たタイムゾーン変位から結果が生成されます。
これは、AT 句を指定しない場合と同じ結果になりま
す。
680
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
指定内容
timestamp_expressio THEN...
n のデータ型
AT SOURCE
without TIME ZONE
エラーが戻されます。
WITH TIME ZONE
変換元の timestamp_expression のタイムスタンプ部
分(UTC)と、timestamp_expression に関連付けられ
たタイムゾーン変位から結果が生成されます。
(SOURCE はキーワードであり、列参
照ではありません)
AT SOURCE TIME ZONE
これは、AT 句を指定しない場合と同じ結果になりま
す。
AT SOURCE TIME ZONE
without TIME ZONE
エラーが戻されます。
AT 式または
AT TIME ZONE expression
TIME ZONE の有無は 変換元の timestamp_expression のタイムスタンプ部
関係なし
分(UTC)と、expression で定義されるタイムゾーン
変位から結果が生成されます。
AT time_zone_string
または
AT TIME ZONE time_zone_string
TIME ZONE の有無は 結果は変換元 timestamp_expression (UTC)のタイム
関係なし
スタンプ部分と、 time_zone_string. に基づくタイム
ゾーン変位から生成されます。タイムゾーン変位は、
time_zone_string と、UTC での
timestamp_expression の TIMESTAMP 値に基づい
て決定されます。
例
例
次の SELECT 文は、エラーを返します。これは、変換先のデータ タイプに
TIMESTAMP WITH TIME ZONE データ タイプが存在しないためです。
SELECT CAST(TIMESTAMP '2008-06-01
AT LOCAL);
SELECT CAST(TIMESTAMP '2008-06-01
AT LOCAL);
SELECT CAST(TIMESTAMP '2008-06-01
AT SOURCE TIME ZONE);
SELECT CAST(TIMESTAMP '2008-06-01
AT SOURCE);
SELECT CAST(TIMESTAMP '2008-06-01
SELECT CAST(TIMESTAMP '2008-06-01
AT -6);
SQL 関数、演算子、式および述部
08:30:00' AS TIMESTAMP(0)
08:30:00+01:00' AS TIMESTAMP(0)
08:30:00' AS TIMESTAMP(0)
08:30:00+01:00' AS TIMESTAMP(0)
08:30:00' AS TIMESTAMP(0) AT +3);
08:30:00+01:00' AS TIMESTAMP(0)
681
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、UTC 値'2008-06-01 04:30:00'と、文字列定数のタイムゾー
ン変位 INTERVAL '04:00' HOUR TO MINUTE を決定しています。
CAST の結果は、変換元の値式'2008-06-01 04:30:00'(UTC)と、現在のセッションの
タイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL '09:00' HOUR TO MINUTE
に調整され、SELECT 文の結果は次のようになります。TIMESTAMP '01.06.08
13:30:00+09:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIMESTAMP(0) WITH TIME ZONE AT LOCAL);
例
次の SELECT 文は、変換元の式にタイムゾーン変位が存在しないために、エラーを
返します。
SELECT CAST(TIMESTAMP '2008-06-01
AS TIMESTAMP(0) WITH TIME ZONE
SELECT CAST(TIMESTAMP '2008-06-01
AS TIMESTAMP(0) WITH TIME ZONE
08:30:00'
AT SOURCE TIME ZONE);
08:30:00'
AT SOURCE);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、UTC 値'2008-06-01 04:30:00'と、文字列定数のタイムゾー
ン変位 INTERVAL '04:00' HOUR TO MINUTE を決定しています。
CAST の結果は、変換元の値式'2008-06-01 04:30:00'(UTC)と、それのタイムゾーン
変位 INTERVAL '04:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL '04:00' HOUR TO MINUTE
に調整され、SELECT の結果は次のようになります。TIMESTAMP '01.06.08
08:30:00+04:00'現在のセッションのタイムゾーンは影響しません。
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIMESTAMP(0) WITH TIME ZONE);
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIMESTAMP(0) WITH TIME ZONE AT SOURCE TIME ZONE);
例
この例では、現在のセッションのタイムゾーン変位 INTERVAL '09:00' HOUR TO
MINUTE を使用して、文字列定数の UTC 値'2008-05-31 23:30:00'を決定しています。
682
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
CAST の結果は、変換元の値式 UTC で'2008-05-31 23:30:00'と、変換先のタイム
ゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE
に調整され、SELECT 文の結果は次のようになります。TIMESTAMP '2008-05-31
15:30:00-08:00'
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00' AS TIMESTAMP(0)
WITH TIME ZONE AT -8);
例
この例では、文字列定数 INTERVAL '04:00' HOUR TO MINUTE で指定されたタイム
ゾーン変位を使用して、UTC 値'2008-06-01 04:30:00'と、文字列定数のタイムゾー
ン変位 INTERVAL '04:00' HOUR TO MINUTE を決定しています。
CAST の結果は、変換元の値式 UTC で'2008-06-01 04:30:00'と、変換先のタイム
ゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE を併せたものになります。
UTC での CAST の結果値はタイムゾーン変位 INTERVAL -'08:00' HOUR TO MINUTE
に調整され、SELECT 文の結果は次のようになります。TIMESTAMP '2008-05-31
20:30:00-08:00' 現在のセッションのタイムゾーンは影響しません。
SET TIME ZONE INTERVAL '09:00' HOUR TO MINUTE;
SELECT CAST(TIMESTAMP '2008-06-01 08:30:00+04:00'
AS TIMESTAMP(0) WITH TIME ZONE AT -8);
例
この例では、現在のタイムスタンプは次のとおりです。
Current TimeStamp(6)
-------------------------------2010-03-09 19:23:27.620000+00:00
次の文は、TIMESTAMP 値'2010-03-09 08:30:00'を、TIMESTAMP WITH TIME
ZONE 値に変換します。ここでのタイムゾーン変位は、タイムゾーン文字列'America
Pacific'に基づきます。
SELECT CAST(TIMESTAMP '2010-03-09 08:30:00' AS TIMESTAMP(0)
WITH TIME ZONE AT 'America Pacific');
問合わせの結果は、次のとおりです。
2010-03-09 08:30:00
------------------------2010-03-09 00:30:00-08:00
SQL 関数、演算子、式および述部
683
第 13 章 データ型の変換
TIMESTAMP から TIMESTAMP への変換
例
この例では、table1 の tswz 列に、次のタイムスタンプ データが格納されています。
SELECT * FROM table1;
問合わせの結果は、次のとおりです。
tswz
----------------------------------2011-11-04 13:14:00.860000-07:00
SELECT 問合わせでタイムゾーン文字列を指定した AT 句を使用して、異なるタイム
ゾーン内の同じ時間を取得できます。たとえば、
SELECT CAST(tswz AS TIMESTAMP WITH TIME ZONE AT 'gmt')
FROM table1;
問合わせの結果は、次のとおりです。
tswz
----------------------------------2011-11-04 20:14:00.860000+00:00
同様に、タイムゾーン変位を指定した AT 句を使用して、同じ結果を得ることができ
ます。
SELECT CAST(tswz AS TIMESTAMP WITH TIME ZONE AT TIME ZONE '00:00')
FROM table1;
問合わせの結果は、次のとおりです。
tswz
----------------------------------2011-11-04 20:14:00.860000+00:00
次の問合わせは、明示的な CAST なしで同じ結果を生成します。
SELECT tswz AT 'gmt' FROM table1;
問合わせの結果は、次のとおりです。
tswz AT TIME ZONE 'gmt'
----------------------------------2011-11-04 20:14:00.860000+00:00
関連トピック
データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
684
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
TIMESTAMP から UDT への変換
詳細については、AT LOCAL および AT TIME ZONE タイムゾーン指定子を参照して
ください。
TIMESTAMP から UDT への変換
目的
TIMESTAMP データを UDT データに変換します。
CAST 構文
CAST
( timestamp_expression
AS
UDT_data_type (
構文要素
timestamp_expression
変換する TIMESTAMP 式。
UDT_data_definition
式が変換される UDT の型(FORMAT、NAMED、または TITLE データ属性句が続く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った TIMESTAMP から UDT への明示的な変換はサポートさ
れていません。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
TIMESTAMP から UDT への暗黙的変換
Teradata Database は、以下の操作に対して TIMESTAMP から UDT への暗黙的変換
を実行します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
SQL 関数、演算子、式および述部
685
第 13 章 データ型の変換
TRYCAST
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST 定
義(「使用上の注意」を参照)が存在する必要があります。
TIMESTAMP から UDT への暗黙的なキャスト定義が存在しない場合、Teradata
Database は代用できる CHAR から UDT への、または VARCHAR から UDT への暗黙
的なキャスト定義を検索します。Teradata Database は TIMESTAMP 型を文字データ
型に暗黙的にキャストしてから、暗黙的なキャスト定義を使用して、文字データ型
から UDT へのキャストを行なえるため、代用は有効です。文字から UDT への暗黙
の CAST 定義が複数存在する場合、Teradata Database は SQL エラーを戻します。
関連トピック
データ型およびデータ属性について、詳細は< SQL データ型とリテラル、B035-1143>
を参照してください。
CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を
参照してください。
TRYCAST
目的
TRYCAST は文字列を受け取り、 AS キーワードの後に指定されたデータ型にキャス
トしようとします(CAST と似ています)。変換が失敗した場合、TRYCAST はエラーで
はなく NULL を返します。
構文
構文要素
instring
LATIN または UNICODE 文字セット内の CHAR または VARCHAR 式。
data_type
以下のサポート対象データ型のいずれか 1 つ。
•
•
•
•
686
BYTEINT
SMALLINT
INT
BIGINT
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT からバイトへの変換
•
•
•
•
•
•
•
•
•
FLOAT
DECIMAL
NUMBER
CHAR(LATIN または UNICODE)
VARCHAR(LATIN または UNICODE)
DATE
TIME(ゾーン付き)
TIMESTAMP(ゾーン付き)
すべての INTERVAL 型
出力
エラーがなければ、変換の結果が返されます。エラーがある場合は、NULL が返さ
れます。結果のデータ型は、data_type 入力によって指定されたデータ型になります。
例
例
SELECT TRYCAST('-2.5' AS DECIMAL(5,2));
*** Query completed. One row found. One column returned.
*** Total elapsed time was 1 second.
TRYCAST('-2.5')
---------------2.50
例: TRYCAST 変換の失敗
TRYCAST 変換の失敗例:
SELECT TRYCAST('abc' AS DECIMAL(5,2));
*** Query completed. One row found. One column returned.
*** Total elapsed time was 1 second.
TRYCAST('abc')
--------------?
UDT からバイトへの変換
目的
UDT 式をバイト データ タイプに変換します。
SQL 関数、演算子、式および述部
687
第 13 章 データ型の変換
UDT からバイトへの変換
CAST 構文
CAST
( UDT_expression
AS
byte_data_type )
構文要素
UDT_expression
UDT データ型となる式。
byte_data_definition
UDT_expression の変換先の BLOB、BYTE または VARBYTE バイト型(任意選択の
FORMAT、NAMED または TITLE 属性句が続く)。
ANSI への準拠
これは、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
byte_data_type
data_attribute ,
)
, data_attribute
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
byte_data_type
UDT_expression の変換先の BLOB、BYTE または VARBYTE バイト タイプ。
ANSI への準拠
これは、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
688
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT からバイトへの変換
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT からバイトへの暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
UDT からバイトへの暗黙のデータ型変換を実行するには、以下を指定する CAST 定
義(「使用上の注意」を参照)が必要です。
• AS ASSIGNMENT 句
• BYTE、VARBYTE、または BLOB ターゲット データ タイプ
CAST 定義の変換先のデータ タイプは、暗黙タイプ変換の変換先と正確に一致し
ている必要はありません。
UDT から別々のバイト タイプへの変換の場合に複数の暗黙 CAST 定義が存在する場
合、Teradata Database は優先順位の最も高いバイト タイプの暗黙 CAST 定義を使
用します。以下のリストでは、バイト タイプの優先順位が最低から最高の順に並べ
られています。
• BYTE
• VARBYTE
• BLOB
例
image が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE history
(id INTEGER
,information image );
image UDT に適した CAST 定義が存在するという想定で、以下の文は、information
列の値を BYTE に変換します。
SQL 関数、演算子、式および述部
689
第 13 章 データ型の変換
UDT から文字への変換
SELECT CAST (information AS BYTE(20))
FROM history
WHERE id = 100121;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 結果が UDT データ タイプとなる式については、SQL UDF を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から文字への変換
目的
UDT 式を文字データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
character_data_type )
構文要素
UDT_expression
UDT データ型となる式。
character_data_definition
式が変換されるデータ型(FORMAT、NAMED、または TITLE 属性句が続く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
character_data_type
data_attribute ,
690
)
, data_attribute
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から文字への変換
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
character_data_type
式が変換される CHAR や VARCHAR などのデータ型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT から文字への暗黙的変換を実行し
ます。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST
定義(「使用上の注意」を参照)が存在する必要があります。
キャスト定義のターゲット文字型は、暗黙の変換のターゲット文字型と正確に一致
している必要はありません。Teradata Database では、CHAR、VARCHAR、または
CLOB ターゲット型を指定する暗黙的なキャスト定義を使用することができます。
UDT から別々の文字型への変換の場合に複数の暗黙的なキャスト定義が存在する場
合、Teradata Database は優先順位の最も高い文字型の暗黙的なキャスト定義を使用
SQL 関数、演算子、式および述部
691
第 13 章 データ型の変換
UDT から文字への変換
します。以下のリストでは、文字型の優先順位が最低から最高の順に並べられてい
ます。
• CHAR
• VARCHAR
• CLOB
UDT から文字への暗黙的なキャスト定義が存在しない場合、Teradata Database は
UDT から文字への暗黙的なキャスト定義に代用できるその他のキャスト定義を検索
します。
存在する暗黙 CAST 定義の組み合わせ
Teradata Database の動作
UDT-to- UDT-to- UDT-to- UDT-tonumeric DATE
TIME
TIMESTAM
P
X
UDT から数値への暗黙 CAST 定義を使用する。
UDT から数値への暗黙の CAST 定義が複数存在
する場合、Teradata Database は SQL エラーを
戻します。
X
UDT から DATE への暗黙 CAST 定義を使用する。
X
UDT から TIME への暗黙 CAST 定義を使用する。
X
X
X
X
エラーを報告する。
X
X
X
X
X
X
X
X
X
X
X
X
X
X
UDT から TIMESTAMP への暗黙 CAST 定義を使
用する。
X
X
X
X
X
X
X
X
X
X
X
Teradata Database は暗黙的なキャスト定義を使用して UDT を代用データ型にキャ
ストしてから、その代用データ型を文字型に暗黙的にキャストできるため、代用は
有効です。
692
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から DATE への変換
例
euro が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE euro_sales_table
(quarter INTEGER
,region VARCHAR(20)
,sales euro );
euro UDT に適した CAST 定義が存在するという想定で、以下の文は、sales 列の値
を CHAR(10)に変換します。
SELECT region, CAST (sales AS CHAR(10))
FROM euro_sales_table
WHERE quarter = 1;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から DATE への変換
目的
UDT 式を DATE データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
DATE
)
data_attribute
構文要素
UDT_expression
UDT データ型となる式。
date_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
SQL 関数、演算子、式および述部
693
第 13 章 データ型の変換
UDT から DATE への変換
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
DATE
data_attribute ,
)
, data_attribute
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST 定
義(「使用上の注意」を参照)が存在する必要があります。
Teradata Database は、以下の操作に対して UDT から DATE への暗黙的変換を実行
します。
• UPDATE
• INSERT
694
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から DATE への変換
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
UDT から DATE への暗黙的なキャスト定義が存在しない場合、Teradata Database
は UDT から DATE への暗黙的なキャスト定義に代用できるその他のキャスト定義を
検索します。
存在する暗黙 CAST 定義の組み合
わせ
Teradata Database の動作
UDT-to-Numeric UDT-to-Character
(non-CLOB)
X
UDT から数値への暗黙 CAST 定義を使用する。
UDT から数値への暗黙の CAST 定義が複数存在する場
合、Teradata Database は SQL エラーを戻します。
X
UDT から文字への暗黙 CAST 定義を使用する。
UDT から文字への暗黙の CAST 定義が複数存在する場
合、Teradata Database は SQL エラーを返します。
X
X
エラーを報告する。
Teradata Database は暗黙的なキャスト定義を使用して UDT を代用データ型にキャ
ストしてから、その代用データ型を DATE 型に暗黙的にキャストできるため、代用
は有効です。
例
datetime_record が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE support
(id INTEGER
,information datetime_record );
datetime_record UDT に適した CAST 定義が存在するという想定で、以下の文は、
information 列の値を DATE に変換します。
SELECT id, CAST (information AS DATE) FROM support;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
SQL 関数、演算子、式および述部
695
第 13 章 データ型の変換
UDT から INTERVAL への変換
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から INTERVAL への変換
目的
UDT 式を INTERVAL データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
interval_data_type )
構文要素
UDT_expression
UDT データ型となる式。
interval_data_definition
変換先の事前定義の間隔型(任意選択の NAMED または TITLE 属性句が続く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
interval_data_type
data_attribute ,
)
, data_attribute
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• NAMED
• TITLE
696
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から INTERVAL への変換
interval_data_type
UDT_expression の変換先である事前定義された INTERVAL 型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
暗黙のデータ型変換を実行するには、以下を指定する CAST 定義(「使用上の注意」
を参照)が必要です。
• AS ASSIGNMENT 句
• 暗黙 CAST の変換先と同じ INTERVAL ファミリー内にある次のようなターゲッ
ト データ タイプ。
INTERVAL データ タイプ
属している INTERVAL ファミリー
• INTERVAL YEAR
Year-Month
• INTERVAL YEAR TO MONTH
• INTERVAL MONTH
• INTERVAL DAY
Day-Time
• INTERVAL DAY TO HOUR
• INTERVAL DAY TO MINUTE
• INTERVAL DAY TO SECOND
• INTERVAL HOUR
• INTERVAL HOUR TO MINUTE
• INTERVAL HOUR TO SECOND
• INTERVAL MINUTE
• INTERVAL MINUTE TO SECOND
• INTERVAL SECOND
CAST 定義の変換先のデータ タイプは、暗黙タイプ変換の変換先と正確に一致して
いる必要はありません。
Teradata Database は、以下の操作に対して UDT から INTERVAL への暗黙的変換を
実行します。
• UPDATE
SQL 関数、演算子、式および述部
697
第 13 章 データ型の変換
UDT から数値への変換
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への引
数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
例
datetime_record が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE support
(id INTEGER
,information datetime_record );
datetime_record UDT に適した CAST 定義が存在するという想定で、以下の文は、
information 列の値を INTERVAL MONTH に変換します。
SELECT id, CAST (information AS INTERVAL MONTH) FROM support;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から数値への変換
目的
UDT 式を数値データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
numeric_data_type )
構文要素
UDT_expression
UDT データ型となる式。
698
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から数値への変換
numeric_data_definition
変換先の事前定義の数値型(任意選択の FORMAT、NAMED または TITLE 属性句が続
く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
numeric_data_type
data_attribute ,
)
, data_attribute
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
numeric_data_type
UDT_expression の変換先の事前定義の数値型。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT から数値への暗黙的変換を実行し
ます。
SQL 関数、演算子、式および述部
699
第 13 章 データ型の変換
UDT から数値への変換
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への引
数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST 定
義(「使用上の注意」を参照)が存在する必要があります。
キャスト定義のターゲット数値型は、暗黙の変換のターゲット数値型と正確に一致
している必要はありません。Teradata Database は、BYTEINT、SMALLINT、
INTEGER、BIGINT、DECIMAL/NUMERIC、NUMBER、または REAL/FLOAT/
DOUBLE ターゲット型を指定する暗黙的なキャスト定義を使用することができます。
UDT から別々の数値型への変換の場合に複数の暗黙的なキャスト定義が存在する場
合、Teradata Database は優先順位の最も高い数値型の暗黙的なキャスト定義を使用
します。以下のリストでは、数値型の優先順位が最低から最高の順に並べられてい
ます。
•
•
•
•
•
•
•
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL/NUMERIC
NUMBER
REAL/FLOAT/DOUBLE
UDT から数値への暗黙的なキャスト定義が存在しない場合、Teradata Database は
UDT から数値への暗黙的なキャスト定義に代用できるその他のキャスト定義を検索
します。
存在する暗黙 CAST 定義の組 Teradata Database の動作
み合わせ
UDT-toDATE
UDT-toCharacter
X
UDT から DATE への暗黙 CAST 定義を使用する。
X
UDT から文字への暗黙 CAST 定義を使用する。
CLOB は文字タイプにはなりません。
UDT から文字への暗黙の CAST 定義が複数存在する場合、
Teradata Database は SQL エラーを返します。
X
700
X
エラーを報告する。
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から TIME への変換
Teradata Database は暗黙的なキャスト定義を使用して UDT を代用データ型にキャ
ストしてから、その代用データ型を数値型に暗黙的にキャストできるため、代用は
有効です。
例
euro が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE euro_sales_table
(quarter INTEGER
,region VARCHAR(20)
,sales euro );
euro UDT に適した CAST 定義が存在するという想定で、以下の文は、sales 列の値
を DECIMAL(10,2)に変換します。
SELECT SUM (CAST (sales AS DECIMAL(10,2))) FROM euro_sales_table;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から TIME への変換
目的
UDT 式を TIME データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
A
TIME
(fractional_seconds_precision)
)
A
WITH TIME ZONE
SQL 関数、演算子、式および述部
data_attribute
701
第 13 章 データ型の変換
UDT から TIME への変換
構文要素
UDT_expression
UDT データ型となる式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
Teradata 変換構文
UDT_expression
(
A
TIME
data_attribute ,
A
)
(fractional_seconds_precision)
,
data_attribute
WITH TIME ZONE
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
702
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から TIME への変換
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT から TIME への暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST
定義(「使用上の注意」を参照)が存在する必要があります。
TIME から UDT への暗黙的なキャスト定義が存在しない場合、Teradata Database は
TIME から UDT への暗黙的なキャスト定義に代用できる CHAR から UDT への、ま
たは VARCHAR から UDT への暗黙的なキャスト定義を検索します。Teradata
Database は暗黙的なキャスト定義を使用して UDT を文字データ型にキャストして
から、その文字データ型を DATE 型に暗黙的にキャストできるため、代用は有効で
す。UDT から文字への暗黙の CAST 定義が複数存在する場合、Teradata Database は
SQL エラーを戻します。
例
datetime_record が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE support
(id INTEGER
,information datetime_record );
datetime_record UDT に適した CAST 定義が存在するという想定で、以下の文は、
information 列の値を TIME WITH TIME ZONE に変換します。
SELECT id, CAST (information AS TIME WITH TIME ZONE) FROM support;
SQL 関数、演算子、式および述部
703
第 13 章 データ型の変換
UDT から TIMESTAMP への変換
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から TIMESTAMP への変換
目的
UDT 式を TIMESTAMP データ タイプに変換します。
CAST 構文
CAST
( UDT_expression
AS
A
TIMESTAMP
(fractional_seconds_precision)
)
A
WITH TIME ZONE
data_attribute
構文要素
UDT_expression
UDT データ型となる式。
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
time_data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
704
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から TIMESTAMP への変換
Teradata 変換構文
UDT_expression
A
TIMESTAMP
(
data_attribute ,
A
)
(fractional_seconds_precision)
,
data_attribute
WITH TIME ZONE
構文要素
UDT_expression
UDT データ型となる式。
data_attribute
以下のデータ属性のいずれか 1 つ。
• FORMAT
• NAMED
• TITLE
fractional_seconds_precision
SECOND フィールドの小数部の有効桁数を表わす 1 桁の数字。有効な範囲は、0 か
ら 6 です。デフォルトは 6 です。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。CREATE CAST の詳
細は、<SQL データ定義言語 - 構文規則および例、B035-1144>を参照してください。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT から TIME への暗黙的変換を実行
します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
SQL 関数、演算子、式および述部
705
第 13 章 データ型の変換
UDT から UDT への変換
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
暗黙のデータ型変換を実行するには、AS ASSIGNMENT 句を指定する適切な CAST 定
義(使用上の注意を参照)が存在していなければなりません。
UDT から TIME への暗黙的なキャスト定義が存在しない場合、Teradata Database は
UDT から TIME への暗黙的なキャスト定義に代用できる UDT から CHAR への、また
は UDT から VARCHAR へのキャスト定義を検索します。Teradata Database は暗黙
的なキャスト定義を使用して UDT を文字データ型にキャストしてから、その文字
データ型を DATE 型に暗黙的にキャストできるため、代用は有効です。UDT から文
字への暗黙的なキャスト定義が複数存在する場合、Teradata Database は SQL エラー
を戻します。
例
datetime_record が UDT である次のようなテーブルの定義を考えます。
CREATE TABLE support
(id INTEGER
,information datetime_record );
datetime_record UDT に適した CAST 定義が存在するという想定で、以下の文は、
information 列の値を TIME WITH TIME ZONE に変換します。
SELECT id, CAST (information AS TIME WITH TIME ZONE) FROM support;
関連トピック
詳細は、以下を参照してください。
• データ タイプおよびデータ属性について、詳細は< SQL データ型とリテラル、
B035-1143>を参照してください。
• 結果が UDT データ タイプとなる式については、「SQL UDF」を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
UDT から UDT への変換
目的
UDT 式を別の UDT タイプに変換します。
706
SQL 関数、演算子、式および述部
第 13 章 データ型の変換
UDT から UDT への変換
CAST 構文
CAST
( UDT_expression
AS
UDT_data_type )
構文要素
UDT_expression
UDT データ型となる式。
UDT_data_definition
式が変換される UDT の型(FORMAT、NAMED、または TITLE データ属性句が続く)。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
ANSI を拡張したことで、FORMAT などのデータ属性句を CAST で使用できます。
使用上の注意
Teradata 変換構文を使った UDT から UDT への明示的な変換はサポートされていま
せん。
UDT の関与するデータ型の変換には、その UDT に適した CAST 定義が必要です。
UDT の CAST を定義するには、CREATE CAST 文を使用します。
暗黙タイプ変換
Teradata Database は、以下の操作に対して UDT から UDT への暗黙的なキャストを
実行します。
• UPDATE
• INSERT
• ストアド プロシージャ、外部ストアド プロシージャ、UDF、および UDM への
引数の引渡し。
• このマニュアル中の他の箇所に明記されている特定のシステム演算子と関数 (DBS
制御レコードの DisableUDTImplCastForSysFuncOp フィールドが TRUE に設定さ
れていない場合に限る)。
UDT が関与する暗黙のデータ タイプ変換を実行できるのは、CAST 定義に AS
ASSIGNMENT 句を指定した場合のみです。詳細については、<SQL データ定義言語
- 構文規則および例、B035-1144>の「CREATE CAST」を参照してください。
例
euro と us_dollar が UDT である次のようなテーブルの定義を考えます。
SQL 関数、演算子、式および述部
707
第 13 章 データ型の変換
UDT から UDT への変換
CREATE TABLE euro_sales_table
(euro_quarter INTEGER
,euro_region VARCHAR(20)
,euro_sales euro );
CREATE TABLE us_sales_table
(us_quarter INTEGER
,us_region VARCHAR(20)
,us_sales us_dollar );
euro UDT を us_dollar UDT に変換するのに適した CAST 定義が存在するという想定
で、以下の文は、us_dollar UDT から euro UDT への変換を実行します。
INSERT INTO euro_sales_table
SELECT us_quarter, us_region, CAST (us_sales AS euro)
FROM us_sales_table;
関連トピック
詳細は、以下を参照してください。
• 暗黙的な型の変換。
• 明示的なデータ型の変換における CAST
• 詳細については、<SQL データ定義言語 - 構文規則および例、B035-1144>の
「CREATE CAST」を参照してください。
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
708
SQL 関数、演算子、式および述部
第 14 章
データ タイプ変換関数
TO_BYTES
目的
特定のエンコーディングでの文字の並びをビットの並びにデコードします。以下の
エンコーディングがサポートされています 。
• BaseX
• BaseY
• Base64M (MIME)
• ASCII
X は 2 の累乗(たとえば、2、8、16)、Y は 2 の累乗ではありません(たとえば、10
や 36)。
構文
TO_BYTES
(instring, in_encoding )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
instring
文字列値(デコード対象の文字の並び)。
in_encoding
instring で指定した文字の並びを返すために TO_BYTES が使用するエンコード。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
709
第 14 章 データ タイプ変換関数
TO_BYTES
呼出し
TO_BYTES は埋め込みサービス システム関数です 。埋め込みサービス関数の有効化
と呼び出しについて、詳細は埋め込みサービス システム関数 を参照してください。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• instring = VARCHAR または CLOB
• in_encoding = VARCHAR(64)
TO_BYTES への 2 つの入力パラメータは、同じ文字セットを使用する必要がありま
す。パラメータは、Latin と Unicode など、異なる文字セットを使用することはでき
ません。
in_encoding がサポートされているエンコーディングの 1 つでない場合は、エラー
が返されます。
instring と in_encoding のどちらかが NULL の場合、結果は NULL になります。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
CLOB または BLOB の最大入力または出力サイズは 4,000,000 バイトです。サイズ
が超過すると、エラーが報告されます。
結果のタイプ
結果のデータ タイプは VARBYTE または BLOB です。
例
例: 文字のシーケンスを Base16 にデコードする
以下の問合わせを実行します。
SELECT CAST (TO_BYTES ('5A', 'base16') as BTYE (16));
TO_BYTES('5A','base16')
'5A-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00'が返ります。
例: 文字のシーケンスを Base36 にデコードする
以下の問合わせを実行します。
710
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
FROM_BYTES
SELECT CAST (TO_BYTES ('-22EEVX', 'base36') as BYTE (16));
TO_BYTES('-22EEVX','base36')
'F8-8D-33-23-00-00-00-00-00-00-00-00-00-00-00-00'が返ります。
関連トピック
詳細については、<SQL 外部ルーチン プログラミング 、B035-1147>の「互換デー
タ型」を参照してください。
FROM_BYTES
目的
ビットの並びを文字列の並びにエンコードします。文字の並びは、そのエンコーディ
ングでの表現になります。以下のエンコーディングがサポートされています 。
• BaseX
• BaseY
• Base64M (MIME)
• ASCII
X は 2 の累乗(たとえば、2、8、16)、Y は 2 の累乗ではありません(たとえば、10
や 36)。
構文
FROM_BYTES
(instring, out_encoding )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
instring
2 進数列値(エンコード対象の文字の並び)。
out_encoding
エンコーディング。FROM_BYTES では、このエンコーディングを使用して、instring
で指定した文字列の並びをエンコードします。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
SQL 関数、演算子、式および述部
711
第 14 章 データ タイプ変換関数
FROM_BYTES
呼出し
FROM_BYTES は埋め込みサービス システム関数です。埋め込みサービス関数の有効
化と呼び出しについて、詳細は埋め込みサービス システム関数を参照してください。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• instring = VARBYTE または BLOB
• out_encoding = VARCHAR(64)
out_encoding がサポートされているエンコーディングの 1 つでない場合は、エラー
が返されます。
変換の結果が結果のデータ タイプの長さを超えた場合は、エラーが生成されます。
instring と out_encoding のどちらかが NULL の場合、結果は NULL になります。
戻り型の文字セットは、Latin または Unicode に設定されます。戻り型の文字セット
は、エンコーディング入力パラメータの文字セットに一致するように設定されます。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
CLOB または BLOB の最大入力または出力サイズは 4,000,000 バイトです。サイズ
が超過すると、エラーが報告されます。
結果のタイプ
結果のデータ タイプは VARCHAR または CLOB です。戻り値は NULL になる場合が
あります。
例
例 1: Base10 ビットのシーケンスを文字シーケンスにエンコードする
以下の問合わせを実行します。
SELECT from_bytes('5A1B'XB, 'base10');
'23067'が返ります。
例 2: ASCII ビットのシーケンスを文字シーケンスにエンコードする
以下の問合わせを実行します。
SELECT from_bytes('5A3F'XB, 'ASCII');
712
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_NUMBER
'Z\ESC 'が返ります。
例 3: Base16 ビットのシーケンスを文字シーケンスにエンコードする
以下の問合わせを実行します。
SELECT from_bytes('5A1B'XB, 'base16');
'5A1B'が返ります。
関連トピック
詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
TO_NUMBER
目的
string_expr を NUMBER データ タイプに変換します。
構文
)
TO_NUMBER ( string_expr
TD_SYSFNLIB.
, format_arg
, NLS_param
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_expr
文字式。string_expr には format_arg で指定されたフォーマットで数値が含まれま
す。変換に失敗すると NULL が返されます。
format_arg
文字式。
この構文要素が無効な場合、エラーが返されます。
この構文要素が NULL の場合、NULL が返されます。
NLS_param
文字式。
NLS_param では、次の数値書式構成要素で返される文字を指定します。
• 10 進数文字
SQL 関数、演算子、式および述部
713
第 14 章 データ タイプ変換関数
TO_NUMBER
•
•
•
•
グループ分離文字
ローカルの通貨記号
二重通貨記号
国際通貨記号
param の有効な値は、次のとおりです。
NUMERIC_CHARACTERS = ' 'dg ' '
CURRENCY = ' ' text ' '
DUAL_CURRENCY = ' ' text ' '
ISO_CURRENCY= ' ' text ' '
•
•
•
•
文字 d と g は、それぞれ 10 進数文字とグループ分離記号を表わします。これらは、
異なる単一バイトの文字にする必要があります。text は単一引用符で囲む必要があ
ります。通貨記号は、10 文字まで使用できます。
SDF (データの表示方法の使用)ファイルを使用して、デフォルト フォーマッティン
グが決定されます。NLS_param を指定することで、SDF ファイルで指定されたデ
フォルトを上書きします。
NLS_param が NULL の場合は NULL が返されます。
format_arg 書式構成要素
書式構成要素
Example...
戻り値
, (カンマ)
9,999
指定した位置にカンマが返されます。
• 数値書式の先頭をカンマにすることはできません。
• 数値書式の 10 進数文字またはピリオドの右側にカンマを指定する
ことはできません。
. (ピリオド)
9.99
小数点。
数値書式内では 1 つのピリオドのみ指定できます。
$
$9999
先頭にドル記号($)の付いた値。
0
09999
先頭にゼロ。
9990
末尾にゼロ。
9
9999
指定した桁数の値。正の場合は先頭に空白が追加され、負の場合は先
頭にマイナス記号が追加されます。
B
B9999
固定小数点数の整数部分の空白(整数部分がゼロの場合)。
C
C999
ISO 通貨記号(SDF ファイル内の ISOCurrency 構成要素で指定されます)。
D
99D99
非通貨値の整数部と小数部を分離する文字。
これは、SDF ファイル内の RadixSeparator 構成要素で指定されていま
す。
EEEE
714
9.9EEEE
科学表記法での値。
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_NUMBER
書式構成要素
Example...
戻り値
G
9G999
グループ分離記号。非通貨値の整数部の桁グループを分離する文字。
これは、SDF ファイル内の GroupSeparator 構成要素で指定されていま
す。
L
L999
ローカル通貨。ローカル通貨を表わす文字列(SDF ファイル内の
Currency 構成要素で指定されています)。
MI
9999MI
末尾のマイナス記号(値が負の場合)。
MI 書式構成要素は、数値書式の最後の部分にのみ指定できます。
PR
9999PR
<山括弧>で囲まれた負の値。
または、空白で囲まれた正の値。
PR 書式構成要素は、数値書式の最後の部分にのみ指定できます。
S
S9999
9999S
先頭または末尾にマイナス記号が付いた負の値。
先頭または末尾にプラス記号が付いた正の値。
S 書式構成要素は、数値書式の最後の部分にのみ指定できます。
TM
TM
TM9
TME
テキスト最小フォーマット。できるだけ少ない文字数を返します。こ
の構成要素は、大文字と小文字が区別されません。
TM または TM9 は、数値を固定表記法で返します(出力が 64 文字を超
えない場合)。出力が 64 文字を超える場合、数値は科学表記法で返さ
れます。
TME は、数値を最小文字数の科学表記で返します。
この構成要素を他の構成要素の前に指定することはできません。この
要素の後ろには 9 または E (または e)を 1 つ指定できますが、それらを
組み合わせることはできません。
U
U9999
二重通貨。二重通貨を表わす文字列(SDF ファイル内の DualCurrency
構成要素で指定されています)。
V
999V99
値を n 回だけ 10 倍します(必要に応じて丸めが実行されます)。この n
は、V の後ろの 9 の数になります。
X
XXXXX
xxxxx
指定した桁数の 16 進数値。指定した数値が整数でない場合、この関数
はその数値を整数に丸めます。
この構成要素は、正またはゼロのみを受け入れます。負の値の場合、
エラーを返します。この構成要素の前にはゼロ(先行ゼロを返します)ま
たは FM を指定できます。それ以外の構成要素の場合、エラーを返し
ます。ゼロまたは FM を指定していない場合、戻される値の先頭には
常に空白が追加されます。
SQL 関数、演算子、式および述部
715
第 14 章 データ タイプ変換関数
TO_NUMBER
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_NUMBER は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、VARCHAR データ タイプでなければなりません。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のデータ タイプに変
換できる、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
TO_NUMBER は戻り値のデータ タイプが NUMBER のスカラー関数です。
使用上の注意
次に、Teradata がサポートする TO_NUMBER 構文の例を示します。いずれの例も、
Oracle がサポートする TO_NUMBER 構文とは異なります。この関数には次の特徴が
あります。
• 閉じ山括弧のない PR 書式構成要素をサポートしません。この例では、数値が正
しい書式ではないため、NULL が返されます。
SELECT TO_NUMBER ('<123', '999PR')
• PR 書式構成要素を使用し、数値が正数である場合には、数値の最後にスペースを
挿入できます。この例では、123 が返されます。
SELECT TO_NUMBER (' 123 ', '999PR')
• 複数桁を科学表記法で指定できます。この例では、12000 が返されます。
SELECT TO_NUMBER ('12E3', '99EEEE')
• 科学表記法の整数部分でカンマを使用できます。この例では、1234000 が返さ
れます。
SELECT TO_NUMBER ('1,234E3', '9,999EEEE')
• 書式に小数がないときでも、引数が 2 つあるときには、カンマを検証します。こ
の例では、数値が正しい書式ではないため、NULL が返されます。
716
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_CHAR(Numeric)
SELECT TO_NUMBER ('1234', '9,999')
• 空の文字列をそれ以外の文字列と同じように扱います。この例では、書式が有効
でないため、NULL ではなくエラーが返されます。
SELECT TO_NUMBER ('', 'BAD Format')
• ピリオド(.)およびカンマ(,)と、D および G を同じ書式文字列で使用できます。こ
の例では、1234.99 が返されます。
SELECT TO_NUMBER ('1,234.99', '9,999D99')
例
例: string_expr の NUMBER データ型への変換
以下の問合わせは結果として 1789.96 を返します。
SELECT TO_NUMBER ('1789.96', '9999.99');
例: ドルの金額を NUMBER データ型に変換する
以下の問合わせは 123 を返します。
SELECT TO_NUMBER('dollar123','L999','NLS_CURRENCY=''dollar''');
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
TO_CHAR(Numeric)
目的
numeric_expr を文字列に変換します。
構文
TO_CHAR
TD_SYSFNLIB.
( numeric_expr
)
, format_arg
, NLS_param
SQL 関数、演算子、式および述部
717
第 14 章 データ タイプ変換関数
TO_CHAR(Numeric)
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_expr
数値式。
変換に失敗すると、'#'文字が返されます。数値の整数部分が書式文字列で指定した
桁数に満たない場合、可変個数の'#'文字による文字列が返されます。返される'#'文
字の個数は、書式文字列または numeric_expr のデータ型に基づいた結果の文字列に
許容された、最大サイズと等しくなります。これには、任意選択のプラス/マイナス
記号を表わす 1 つの'#'文字が含まれます。
以下に例を示します。
SELECT TO_CHAR(12345678,'99')
'###'が返ります。
SELECT TO_CHAR(12345678,'99999')
'######'が返ります。
SELECT TO_CHAR(12345678,'99V9')
'####'が返ります。
format_arg
文字式。
format_arg は、数値をフォーマットするために使用されます。format_arg が省略さ
れると、numeric_expr は、その値の有効桁数を過不足なく保持できる長さの文字列
に変換されます。
この構文要素が無効な場合、エラーが返されます。
format_arg 値については、「TO_NUMBER」を参照してください。
NLS_param
文字式。
NLS_param では、次の数値書式構成要素で返される文字を指定します。
•
•
•
•
•
10 進数文字
グループ分離文字
ローカルの通貨記号
二重通貨記号
国際通貨記号
param の有効な値は、次のとおりです。
• NUMERIC_CHARACTERS = ' 'dg ' '
• CURRENCY = ' ' text ' '
• DUAL_CURRENCY = ' ' text ' '
718
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_CHAR(Numeric)
• ISO_CURRENCY= ' ' text ' '
文字 d と g は、それぞれ 10 進数文字とグループ分離記号を表わします。これらは、
異なる単一バイトの文字にする必要があります。text は単一引用符で囲む必要があ
ります。通貨記号は、10 文字まで使用できます。
SDF (データの表示方法の使用)ファイルを使用して、デフォルト フォーマッティン
グが決定されます。NLS_param を指定することで、SDF ファイルで指定されたデ
フォルトを上書きします。
NLS_param が NULL の場合は NULL が返されます。
NLS_param 値については、「TO_NUMBER」を参照してください。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_CHAR(Numeric)は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_expr = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• format_arg = CHAR または VARCHAR
• NLS_param=CHAR または VARCHAR
結果のタイプ
TO_CHAR(Numeric)は戻りデータ タイプが VARCHAR CHARACTER SET UNICODE
のスカラー関数です。
例: numeric_expr から文字列への変換
以下の問合わせを実行します。
SELECT TO_CHAR(50000, '$99,999.99');
'$50,000.00'が返されます。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
719
第 14 章 データ タイプ変換関数
TO_CHAR(DateTime)
TO_CHAR(DateTime)
目的
date_timestamp_value を文字列に変換します。
構文
TO_CHAR
( date_timestamp_value
TD_SYSFNLIB.
)
, format_arg
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_timestamp_value
日時または間隔の引数。
format_arg
文字式。
有効な format_arg 値については、「TO_DATE」を参照してください。
format_arg は、数値を書式化するために使用されます。format_arg が省略される
と、numeric_expr は、その値の有効桁数を過不足なく保持できる長さの文字列に変
換されます。
この構文要素が無効な場合、エラーが返されます。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_CHAR(DateTime)は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• date_timestamp_value = DATE、TIME、TIME WITH TIME ZONE、TIMESTAMP、
TIMESTAMP WITH TIME ZONE、または INTERVAL YEAR TO MONTH などの間
隔データ型。
720
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_DATE
• format_arg = CHAR または VARCHAR
結果のタイプ
TO_CHAR(DateTime)は戻りデータ タイプが VARCHAR CHARACTER SET UNICODE
のスカラー関数です。
例: date_timestamp_value から文字列への変換
以下の問合わせを実行します。
SELECT TO_CHAR(DATE '2003-12-23', 'DD-MON-YYYY');
結果として'23-DEC-2003'を返します。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
TO_DATE
目的
string_expr を DATE データ タイプに変換します。
TO_DATE は、データを別の日時データ タイプに変換することはありません。
string_expr が DATE 値の TO_DATE 関数を使用してはいけません。返される DATE
値の最初の 2 桁は、format_arg またはデフォルトのデータ書式に応じて、元の
string_expr と異なることがあります。
構文
TO_DATE
( string_expr, format_arg )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_expr
文字式。
変換に失敗すると、TO_DATE はエラーを戻します。
SQL 関数、演算子、式および述部
721
第 14 章 データ タイプ変換関数
TO_DATE
format_arg
文字の引数。
format_arg は、string_expr のフォーマットを指定する日付フォーマットです 。
format_arg を省略した場合、次に示すデフォルトの日付書式が使用されます。YYYY-
MM-DD
format_arg が NULL の場合、TO_DATE は NULL を返します。
formal_arg が有効でない場合はエラーが返されます。
format_arg 書式構成要素
構成要素
説明
-
句読点文字は無視され、引用符で囲まれたテキストも無視されま
す。
/
,
.
;
:
「テキスト」
AD
A.D.
AD 識別子。
AM
A.M.
正午識別子。
BC
B.C.
BC 識別子。
CC
SCC
世紀。
4 桁で表わした年の最後の 2 桁が 01 から 99 の範囲以内にある
場合、世紀は、その年の最初の 2 桁よりも 1 だけ大きくなります。
4 桁で表わした年の最後の 2 桁が 00 の場合、世紀は、その年の
最初の 2 桁と同じになります。
注: CC および SCC は、TO_CHAR 関数でのみサポートされていま
す。
722
D
曜日(1 から 7)。
DAY
曜日の名前。
DD
月の日にち(1-31)。
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_DATE
構成要素
説明
DDD
年の日にち(1-366)。
DL
詳細表記の日付。フォーマット文字列'FMDay, Month FMDD,
YYYY'と同じです。
注: DL は TO_CHAR 関数でのみサポートされています。
DS
省略表記の日付。書式文字列'FMMM/DD/YYYYFM'と同じです。
注: DS は TO_CHAR 関数でのみサポートされています。
DY
曜日名の略語。
E
サポートしていません。
EE
サポートしていません。
FF [1..9]
小数秒。
[1..9]を使用して小数桁の数を指定します。
FF の後ろに続く数字がない場合は、入力データ タイプの小数秒
の数と等しい桁数の 10 進数値が出力されます。そのデータ タイ
プに小数桁がない場合、FF はなにも出力しません。
注: 6 桁を超える小数桁は切り捨てられます。
FM
書式最小モード。先頭や末尾に空白が付加されていない値が返さ
れます。これは、最小スペースを使用する必要のあるセクション
の前と後に、'FM'を追加することでオンとオフを切り替えること
ができます。
注: FM は TO_CHAR 関数でのみサポートされています。
FX
文字データと書式モデルが完全一致することが必要になります。
注: FX は TO_CHAR 関数ではサポートされていません。
HH
HH12
1 日の時間(1-12)。
HH24
1 日の時間(0-23)。
IW
ISO モデルに基づいた年の週(1 から 52、または 1 から 53)。
注: IW は TO_CHAR 関数でのみサポートされています。
IYY
IY
I
IYYY
SQL 関数、演算子、式および述部
ISO 年の後ろ 3 桁、2 桁、または 1 桁。
注: I、IY、および IYY は、TO_CHAR 関数でのみサポートされて
います。
ISO 年に基づいた 4 桁の年。
723
第 14 章 データ タイプ変換関数
TO_DATE
構成要素
説明
注: IYYY は TO_CHAR 関数でのみサポートされています。
J
ユリウス日。紀元前 4713 年 1 月 1 日からの日数。J を付けて指
定する日数は整数でなければなりません。
Teradata では、ユリウス日との一連の計算にグレゴリオ暦を使
用します。
MI
分(0 から 59)。
MM
月(01 から 12)。
MON
月の略語。
MONTH
月の名前。
PM
P.M.
正午識別子。
Q
年の四半期(1、2、3、4)。
注: Q は TO_CHAR 関数でのみサポートされています。
RM
ローマ数字の月(I から XII)。
RR
2 桁のみを使用して 20 世紀の日付を 21 世紀に格納します。現
在の年と、指定された年がどちらも 0 から 49 の範囲内にある場
合、日付は現在の世紀のものになります。
注: RR は TO_CHAR 関数ではサポートされていません。
RRRR
丸めた年。4 桁または 2 桁の入力を受け入れます。2 桁の入力
は、RR と同じ結果が返されます。
注: RRRR は TO_CHAR 関数ではサポートされていません。
SP
つづり。後に SP の付いた数値要素は英単語でつづられます。こ
の単語は構成要素の大文字表記にあわせて、大文字で表記されま
す。
たとえば、次のようになります。'DDDSP'はすべてに大文字を指
定します。'DddSP'は最初の文字に大文字を指定します。また、
'dddSP'はすべてに小文字を指定します。
注: SP は TO_CHAR 関数でのみサポートされています。
724
SS
秒(0 から 59)。
SSSSS
午前 0 時からの経過秒数(0 から 86399)。
TS
省略表記の時間。'HH:MI:SS AM'書式の文字列と同じです。
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_DATE
構成要素
説明
注: TS は TO_CHAR 関数でのみサポートされています。
TZD
サポートしていません。
TZH
タイムゾーンの時間。
TZM
タイムゾーンの分。
TZR
タイムゾーンの地域。'TZH:TZM'フォーマットの文字列と同じで
す。
注: TZR は TO_CHAR 関数でのみサポートされています。
WW
年の週(1 から 53)。第 1 週は、その年の最初の日から、その年
の 7 日目の日まで続きます。
注: WW は TO_CHAR 関数でのみサポートされています。
W
月の週(1 から 5)。第 1 週は、その月の最初の日から 7 日目の日
で終わります。注:W は TO_CHAR 関数でのみサポートされてい
ます。
X
ローカルの基数文字。
Y,YYY
この位置にカンマの付いた年。
YEAR
SYEAR
省略していない年。S を指定すると紀元前の日付の先頭にマイナ
ス符号が付加されます。
注: YEAR および SYEAR は、TO_CHAR 関数でのみサポートされ
ています。
YYYY
SYYYY
4 桁の年。S を指定すると紀元前の日付の先頭にマイナス符号が
付加されます。
YYY
YY
Y
年の後ろ 3 桁、2 桁、または 1 桁。
現在の年と、指定された年がどちらも 0 から 49 の範囲内にある
場合、日付は現在の世紀のものになります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_DATE は埋め込みサービス システム関数です 。
SQL 関数、演算子、式および述部
725
第 14 章 データ タイプ変換関数
TO_TIMESTAMP
引数のタイプと規則
この関数に渡された式は、VARCHAR データ タイプでなければなりません。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
TO_DATE は戻り値のデータ タイプが DATE のオーバーロード スカラー関数です。
例: string_expr から DATE データ型への変換
以下の問合わせを実行します。
SELECT TO_DATE ('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH: MI
A.M.');
これは、結果として 15-JAN-89 を返します。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
TO_TIMESTAMP
目的
string_expr または integer_expr を TIMESTAMP データ タイプに変換します。
構文
TO_TIMESTAMP
TD_SYSFNLIB.
726
(
string_expr , format_arg
)
integer_expr
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_TIMESTAMP
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_expr
文字の引数。
変換に失敗すると、TO_TIMESTAMP はエラーを返します。
format_arg
文字式。
format_arg は、string_expr のフォーマットを指定する日付フォーマットです 。
有効な format_arg 値については、「TO_DATE」を参照してください。
指定された小数秒の 6 桁を超える部分は切り捨てられます。
format_arg を省略した場合、TO_TIMESTAMP はデフォルトのタイムスタンプの書
式 YYYY-MM-DD HH24:MI:SS.FF6 を使用します。
この構文要素が NULL の場合、NULL が返されます。
この構文要素が無効な場合、エラーが返されます。
integer_expr
数値の引数。
TO_TIMESTAMP 関数では、 integer_expr がこの関数に渡されると、POSIX 紀元変
換を暗黙的に行ないます。
POSIX 紀元は、協定世界時(UTC)の 1970 年 1 月 1 日午前 0 時から経過した秒数で
す。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_TIMESTAMP は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、VARCHAR データ タイプまたは次の数値データ タイプで
ある必要があります。
• BYTEINT
• SMALLINT
• INTEGER
SQL 関数、演算子、式および述部
727
第 14 章 データ タイプ変換関数
TO_TIMESTAMP_TZ
• BIGINT
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
TO_TIMESTAMP は戻り値のデータ タイプが TIMESTAMP(6)のオーバーロード スカ
ラー関数です。
例
例: string_expr または integer_expr から TIMESTAMP データ型への変換
以下の問合わせを実行します。
SELECT TO_TIMESTAMP ('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY,
HH: MI A.M.');
これは、結果として 1989-01-15 11:00:00.000000 を返します。
例: POSIX 紀元の変換
次の問合わせは、POSIX 紀元変換の例です。
SELECT TO_TIMESTAMP(242525);
これは、結果として 1970-01-03 19:22:05.000000 を返します。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
TO_TIMESTAMP_TZ
目的
string_expr を TIMESTAMP WITH TIME ZONE データ タイプに変換します。
728
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_TIMESTAMP_TZ
構文
TO_TIMESTAMP_TZ ( string_expr
TD_SYSFNLIB.
)
( , format_arg )
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_expr
文字の引数。
変換に失敗すると、TO_TIMESTAMP_TZ はエラーを返します。
format_arg
文字式。
format_arg は、string_expr のフォーマットを指定する日付フォーマットです 。
format_arg は、データを別の日時データ型に変換することはありません。
指定された小数秒の 6 桁を超える部分は切り捨てられます。
format_arg が省略されると、デフォルトのタイムゾーン付きタイムスタンプの書式
YYYY-MM-DD HH24:MI:SS.FF6 TZH:TZM が使用されます。
有効な format_arg 値については、「TO_DATE」を参照してください。
この構文要素が NULL の場合、NULL が返されます。
この構文要素が無効な場合、エラーが返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_TIMESTAMP_TZ は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、VARCHAR データ タイプでなければなりません。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
SQL 関数、演算子、式および述部
729
第 14 章 データ タイプ変換関数
TO_YMINTERVAL
結果のタイプ
TO_TIMESTAMP_TZ は戻り値のデータ タイプが TIMESTAMP(6) WITH TIME ZONE
のオーバーロード スカラー関数です。
例: string_expr を TIMESTAMP WITH TIME ZONE データ型に変換する
以下の問合わせを実行します。
SELECT TO_TIMESTAMP_TZ ('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY,
HH: MI A.M.');
これは、結果として 1989-01-15 11:00:00.000000+00:00 を返します。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
TO_YMINTERVAL
目的
次のいずれかで指定される string_value を
• SQL 間隔書式
• ISO 継続時間書式
INTERVAL YEAR(4) TO MONTH 値に変換します。
INTERVAL(4) YEAR TO MONTH 値を超える値は、エラーの原因になります。
構文
TO_YMINTERVAL
( string_value )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
730
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_YMINTERVAL
string_value
文字式。
string_value が空の文字列か NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_YMINTERVAL は埋め込みサービス システム関数です 。埋め込みサービス関数
の有効化と呼び出しについて、詳細は埋め込みサービス システム関数を参照してく
ださい。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
CHAR、VARCHAR
string_value の書式
• SQL 間隔書式
INTERVAL 型の年月の書式は、[+ | -]YY-MM です。YY は 0 から 9999 の整数に
なり、MM は 0 から 11 の整数になります。
• ISO 継続時間書式
継続時間のフォーマットは、[-]P[n]Y[n]M[n]です。n は要素の値を指定します(例
えば、4Y は 4 年間になります)。
これは、ISO 継続時間の書式のサブセットを表わし、P、Y、M 以外の引数を使用
すると、無視されます。先行ゼロや後続ゼロは、任意選択です。構成要素内にス
ペースを入れることはできません。構成要素がゼロの場合は省略できますが、少
なくとも 1 つの構成要素と、その数値が必要になります。
先頭のマイナス記号は、負の間隔を示します。省略されると、間隔は正になりま
す。プラス記号は使用できません。
要素の値は、0 から間隔を超えない任意の値の整数になります。値は、それらの
通常の時間範囲を超えていてもかまいません。たとえば、1 年は 12 ヶ月ですが、
P14M は 14 ヶ月を表わします。ISO 継続時間の文字指定子は、次のような意味
を持ちます(YEAR TO MONTHS の INTERVAL 型に使用できる指定子は、P、Y お
よび M のみです)。
SQL 関数、演算子、式および述部
731
第 14 章 データ タイプ変換関数
TO_YMINTERVAL
ISO 指定子
定義
P
継続時間。常に先頭になります。
Y
年。年数の後に付きます。
M
月。月数の後に付きます。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
戻り値のデータ タイプは INTERVAL YEAR(4) TO MONTH になります。
例
例 1: SQL 間隔書式として指定されている string_value の変換
以下の問合わせでは、SQL 間隔書式を指定します。
SELECT TO_YMINTERVAL('04-10');
これは、結果として'04-10'を返します。
例 2: ISO 継続時間として指定されている string_value の変換
以下の問合わせでは、ISO 継続時間を指定します。
SELECT TO_YMINTERVAL('P100Y4M');
これは、結果として'100-04' (100 年 4 か月)を返します。
例 3: string_value のエラー
以下の問合わせを実行します。
SELECT TO_YMINTERVAL('P20Y3M4DT12H23M34.234S');
これはエラーが返されます。使用可能な指定子が P、Y、および M のみのためです。
例 4: -14 か月の ISO 継続時間として指定された string_value の変換
以下の問合わせでは、-14 か月の ISO 継続時間を指定します。
SELECT TO_YMINTERVAL('-P14M');
これは、結果として'-01-02' (マイナス 1 年 2 か月)を返します。
732
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_DSINTERVAL
関連トピック
詳細は、以下を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
TO_DSINTERVAL
目的
次のいずれかで指定される string_value を
• SQL 間隔書式
• ISO 継続時間書式
INTERVAL DAY(4) TO SECOND(6)値に変換します。
INTERVAL DAY(4) TO SECOND(6)の値を超える値は、すべてエラーの原因になりま
す。
構文
TO_DSINTERVAL ( string_value )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_vsalue
文字式。
string_value が空の文字列か NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TO_DSINTERVAL は埋め込みサービス システム関数です 。埋め込みサービス関数の
有効化と呼び出しについて、詳細は埋め込みサービス システム関数を参照してくだ
さい。
SQL 関数、演算子、式および述部
733
第 14 章 データ タイプ変換関数
TO_DSINTERVAL
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
• CHAR
• VARCHAR
string_value の書式
• SQL 間隔書式
INTERVAL 型の DAY TO SECOND の書式は、[+ | -]DD HH:MM:SS[.xxxxxx]になり
ます。1 つ以上のスペースで、日付を時間構成要素から分離します。構成要素間
のスペースの数は任意です。DD は 0 から 9999 までの整数、HH は 0 から 23 ま
での整数、MM は 0 から 59 までの整数、および SS は 0 から 59 までの整数にな
ります。任意選択の小数秒は.0 から.999999 までになります。
• ISO 継続時間書式
継続時間の書式は、[-]P[n]DT[n]H[n]M[n][.frac_secs]S になります。この n では、
要素の値を指定します(たとえば、4H は 4 時間になります)。これは、ISO 継続時
間書式のサブセットを表わします。その他の継続時間文字(有効な ISO 文字には、
Y や M などがあります)は、エラーの原因になります。
先行ゼロや後続ゼロは、任意選択です。構成要素内にスペースを入れることはで
きません。構成要素がゼロの場合は省略できますが、少なくとも 1 つの構成要素
と、その数値が必要になります。
先頭のマイナス記号は、負の間隔を示すために使用します。省略されると、間隔
は正になります。プラス記号は使用できません。要素の値は、0 から間隔を超え
ない任意の値の整数になります。小数秒は任意選択であり、.0 から.999999 まで
になります。
T 指定子は、必ず時間構成要素の前に指定します(また、完全な ISO 継続時間構文
内の月(Month)と分(Minute)の M のあいまい性を排除します)。H、M または S の
時間構成要素がない場合、T は無視されます。
値は、それらの通常の時間範囲を超えていてもかまいません。たとえば、1 日は
24 時間ですが、PT72H は 72 時間を表わします。ISO 継続時間の文字指定子は、
次のような意味を持ちます(DAY TO SECOND の INTERVAL 型に使用できる指定子
は P、D、T、H、M および S のみです)。
734
ISO 指定子
定義
P
継続時間。常に先頭になります。
D
日。日数の後に付きます。
T
時間。時間の要素 H、M、および S の前に付きます。
H
時間。時間数の後に付きます。
M
分。分の数の後に付きます。
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
TO_DSINTERVAL
ISO 指定子
定義
S
秒。秒数の後に付きます。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
戻り値のデータ タイプは INTERVAL DAY(4) TO SECOND(6)になります。
例
例 1: SQL 間隔書式として指定されている string_value の変換
以下の問合わせでは、SQL 間隔書式を指定します。
SELECT TO_DSINTERVAL('100 04:23:59');
これは、結果として'100 04:23:59.000000'を返します。
例 2: SQL 間隔書式として指定されている別の string_value の変換
以下の問合わせでは、SQL 間隔書式を指定します。
SELECT TO_DSINTERVAL('100 04:23:59.543');
これは、結果として'100 04:23:59.543000'を返します。
例 3: ISO 継続時間書式として指定されている string_value の変換
以下の問合わせでは、ISO 継続時間を指定します。
SELECT TO_DSINTERVAL('P100DT4H23M59S');
これは、結果として'100 04:23:59.000000'を返します。
例 4: 73 時間の ISO 継続時間として指定されている string_value の変換
以下の問合わせでは、73 時間の ISO 継続時間を指定します。
SELECT TO_DSINTERVAL('PT73H');
これは、結果として'3 01:00:00.000000' (3 日と 1 時間)を返します。
例 5: string_value の変換エラー
以下の問合わせを実行します。
SELECT TO_DSINTERVAL('P2MT12H');
これはエラーが返されます。月の指定子'2M'が許可されないためです。
SQL 関数、演算子、式および述部
735
第 14 章 データ タイプ変換関数
NUMTODSINTERVAL
関連トピック
詳細については、SQL 外部ルーチン プログラミング、B035-1147 の「互換データ
型」を参照してください。
NUMTODSINTERVAL
目的
numeric_value を INTERVAL DAY(4) TO SECOND(6)の値に変換します。
構文
NUMTODSINTERVAL
( numeric_value, interval_unit )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
数値式。
この構文要素が NULL の場合、NULL が返されます。
interval_unit
文字式。
interval_unit では、numeric_value 値の単位を指定します。これは、以下のいずれか
の値になります(大文字と小文字は区別されません)。
• 'DAY'
• 'HOUR'
• 'MINUTE'
• 'SECOND'
INTERVAL DAY(4) TO SECOND(6)の値を超える値は、すべてエラーの原因になります。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
736
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
NUMTODSINTERVAL
呼出し
NUMTODSINTERVAL は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_value = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• interval_unit = CHAR または VARCHAR
結果のタイプ
戻り値のデータ タイプは INTERVAL DAY(4) TO SECOND(6)になります。
例
例 1: numeric_value の INTERVAL DAY(100) TO SECOND 値への変換
以下の問合わせを実行します。
SELECT NUMTODSINTERVAL(100, 'DAY');
これは、結果として'100 00:00:00.000000' (100 日)を返します。
例 2: numeric_value の INTERVAL DAY(100) TO HOURS 値への変換
以下の問合わせを実行します。
SELECT NUMTODSINTERVAL(100, 'HOURS');
これは、結果として'4 04:00:00.000000' (4 日と 4 時間)を返します。
例 3: numeric_value の INTERVAL DAY(100) TO MINUTES 値への変換
以下の問合わせを実行します。
SELECT NUMTODSINTERVAL(1600, 'MINUTES');
これは、結果として'1 02:40:00.000000' (1 日と 2 時間 40 分)を返します。
例 4: numeric_value の INTERVAL DAY(100) TO HOURS 値への変換
以下の問合わせを実行します。
SELECT NUMTODSINTERVAL(3.5, 'HOURS');
これは、結果として 3 時間 30 分を返します。
SQL 関数、演算子、式および述部
737
第 14 章 データ タイプ変換関数
NUMTOYMINTERVAL
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
NUMTOYMINTERVAL
目的
numeric_value を INTERVAL YEAR(4) TO MONTH の値に変換します。
構文
NUMTOYMINTERVAL
( numeric_value, interval_unit )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_value
数値式。
この構文要素が NULL の場合、NULL が返されます。
interval_unit
文字式。
interval_unit では、numeric_value 値の単位を指定します。これは、以下のいずれか
の値になります(大文字と小文字は区別されません)。
• 'YEAR'
• 'MONTH'
INTERVAL YEAR(4) TO MONTH の値を超える値は、すべてエラーの原因になります。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
NUMTOYMINTERVAL は埋め込みサービス システム関数です 。
738
SQL 関数、演算子、式および述部
第 14 章 データ タイプ変換関数
NUMTOYMINTERVAL
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• numeric_value = BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/
NUMERIC、FLOAT/REAL/DOUBLE PRECISION、または NUMBER
• exponent_value = CHAR または VARCHAR
結果のタイプ
戻り値のデータ タイプは INTERVAL YEAR(4) TO MONTH になります。
例
例: numeric_value から INTERVAL YEAR(40) TO MONTH 値への変換
以下の問合わせを実行します。
SELECT NUMTOYMINTERVAL(40, 'YEAR');
これは、結果として'40-00' (40 年 0 か月)を返します。
例: numeric_value から INTERVAL YEAR(100) TO MONTH 値への変換
以下の問合わせを実行します。
SELECT NUMTOYMINTERVAL(100, 'MONTHS');
これは、結果として'08-04' (8 年 4 か月)を返します。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
739
第 14 章 データ タイプ変換関数
NUMTOYMINTERVAL
740
SQL 関数、演算子、式および述部
第 15 章
日時および間隔の関数と式
概要
この章では、ANSI の日時値と間隔値を演算する関数と式について説明し、さらに
ANSI SQL:2011 規格の拡張機能である Teradata DATE 値を演算する関数と式につい
ても説明します。
ANSI の日時データ タイプ
ANSI の日時データ タイプには次のものがあります。
•
•
•
•
•
DATE
TIME
TIME WITH TIME ZONE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
間隔データ タイプ
ANSI の間隔データ タイプは次の 2 つのカテゴリに分かれます。
• 年-月の間隔。以下のものがあります。
• YEAR
• YEAR TO MONTH
• MONTH
• 日-時の間隔。以下のものがあります。
• DAY
• DAY TO HOUR
• DAY TO MINUTE
• DAY TO SECOND
• HOUR
• HOUR TO MINUTE
• HOUR TO SECOND
• MINUTE
• MINUTE TO SECOND
• SECOND
SQL 関数、演算子、式および述部
741
第 15 章 日時および間隔の関数と式
ANSI の日時および間隔データ タイプの割り当て規則
ANSI の日時および間隔データ タイプの割り当て規則
データ タイプの互換性と変換
ANSI の日時または間隔データ タイプに関連した割り当てには、次の規則が適用され
ます。
ソース タイプ
ターゲット タイプ
結果
DATE
DATE
これらの型は互換性があるので、割り当てに変換
を必要としません。
既存の Teradata の割り当てとの互換性について
は、DATE の INTEGER への割り当てや INTEGER
の DATE の割り当て(検証チェック付き)などの非
ANSI 演算では、既存の Teradata の割り当て規則
に従います。
TIME
TIME
これらの型は互換性があるので、割り当てに変換
を必要としません。
Teradata システムの値 TIME は REAL としてエン
コードされ、ANSI の TIME および TIME WITH
TIME ZONE とは互換性がありません。
TIMESTAMP
TIMESTAMP
年-月の間隔
年-月の間隔
日-時刻の間隔
日-時刻の間隔
数値
DATE
DATE
• 文字
• 数値
• TIMESTAMP
文字
これらの型は互換性があるので、割り当てに変換
を必要としません。
Teradata Database は、割り当ての前に暗黙の型変
換を実行します。
参照整合性ルールについては、「暗黙的な型の変
換」を参照してください。
• DATE
• TIME
• TIMESTAMP
TIME
TIMESTAMP
TIMESTAMP
• DATE
• TIME
間隔
742
絶対数値
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の日時および間隔データ タイプの割り当て規則
ソース タイプ
ターゲット タイプ
結果
注: INTERVAL タ
イプはフィールド
が 1 つだけ必要で
す。たとえば、
INTERVAL YEAR
です。
絶対数値
Interval
ANSI の日時と間隔のデータ タイプを伴う割り当てで他のソース/ターゲット デー
タ タイプを組み合わせる場合はすべて、タイプが明示的に変換されなければなりま
せん。
ANSI の DateTime または Interval データ型の明示的変換を実行するには、CAST 関
数を使用します。
構文
CAST
( expression
AS
ansi_sql_data_type
)
data_definition_list
構文要素
expression
異なるデータ型としてキャストされる、データ型が既知の式。
ansi_sql_data_type
式の新しいデータ型。
data_definition_list
式の新しいデータ型またはデータ属性、あるいはその両方。
間隔データ タイプの割り当て規則
年-月の間隔の割り当てには、以下の規則が適用されます。
条件
結果
タイプが一致する
直接的な割り当てになる。
ソースが INTERVAL YEAR でター
ゲットが INTERVAL YEAR TO
MONTH
ターゲットの MONTH の値がゼロに設定される。
SQL 関数、演算子、式および述部
743
第 15 章 日時および間隔の関数と式
ANSI の日時および間隔データ タイプの割り当て規則
条件
結果
ソースが INTERVAL MONTH で
ターゲットが INTERVAL YEAR TO
MONTH
ソースはゼロに初期化されている YEAR フィールドが
組み込まれるように拡張され、その結果の間隔が正規
化される。
たとえば、ソースが'15'の場合、拡張されたソースは
'0-15'になり、'1-03'に正規化されます。
ターゲットが INTERVAL MONTH
でソースが INTERVAL YEAR か
INTERVAL YEAR TO MONTH
割り当ての前にソースが INTERVAL MONTH に変換さ
れる。
たとえば、ソースが '2-11'の場合は'35'に変換されます。
ソースの最下位フィールドがター ソースのフィールドの値は、ターゲットの最下位フィー
ゲットの最下位フィールドより下位 ルドより精度が細かいのものが切り捨てられる。
である
たとえば、INTERVAL '32' MONTH のソースがタイプ
INTERVAL YEAR のターゲット列に割り当てられた場
合、格納される値は'2'になります。
日-時刻の間隔の割り当てには、以下の規則が適用されます。
条件
結果
タイプが一致する
直接的な割り当てになる。
ターゲットにソースの最下位フィー そのフィールドの値はゼロに設定される。
ルドより下位のフィールドがある
たとえば、ソースが INTERVAL '49:30' HOUR TO
MINUTE で、タイプ INTERVAL HOUR(4) TO
SECOND(2)のターゲットの列に割り当てられた場合、
格納される値は'49:30:00.00'です。
ターゲットにソースの最上位フィー ソース タイプはターゲット タイプに一致するように
ルドより上位のフィールドがある 拡張されて新規フィールドがゼロに設定され、最終ス
テップで内容が正規化される。
たとえば、ソースが INTERVAL '49:30' HOUR TO
MINUTE で、タイプ INTERVAL DAY TO MINUTE の
ターゲットの列に割り当てられた場合、格納される値
は'2 1:30'です。
ソースの最下位フィールドがター ソースのフィールドの値は、ターゲットの最下位フィー
ゲットの最下位フィールドより下位 ルドより精度が細かいのものが切り捨てられる。
である
たとえば、ソースが INTERVAL '10:12:58' HOUR TO
SECOND であって、タイプ INTERVAL HOUR TO
MINUTE のターゲット列に割り当てられた場合、格納
される値は'10:12'になります。
744
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI SQL:2011 の日時および間隔値でのスカラー演算
ANSI SQL:2011 の日時および間隔値でのスカラー演算
Teradata SQL では、ANSI の日時値と間隔値に使用できる一連のスカラー演算子が
定義されています。
スカラー演算には次のものがあります。
演算
説明
日時式
日時値となる結果を生じる式。日時式は、同じく日時式または間隔式
である引数をとります。
間隔式
間隔となる結果を生じる式。間隔式には、間隔、日時または Numeric
式である構成要素を組み込むことができます。
データ タイプの互換性
混合データ型の式を解決するための暗黙の変換の実行に関する Teradata Database
規則は、ANSI DateTime 値または Interval 値を使用する演算ではサポートされませ
ん。
ANSI DateTime 式または間隔式を変換するには、CAST 関数を使用します。明示的
なデータ型の変換における CAST を参照してください。
すべての日時および間隔スカラー演算で使われる値には、以下の制限事項が適用さ
れます。
条件
結果
2 つの日時値が同じ日時式にある
両方の値は同じ型を使用する必要があります。
DATE、TIME、および TIMESTAMP の値のタイプを混
合することはできません。
日時値と間隔値が同じ日時式に出現 間隔値には、日時値にも含まれている日時フィールド
する
だけが含まれていなければなりません。
2 つの間隔値が同じ間隔式に出現
する
両方の値は同じ型を使用する必要があります。
Year-Month と Day-Time 間隔を混合することはできま
せん。
ANSI の日時式
目的
DATE、TIME、または TIMESTAMP の値(または値式)で計算を実行し、同じタイプ
の単一の値を戻します。
日時式は、DATE、TIME、または TIMESTAMP 値の結果を戻す任意の式です。
SQL 関数、演算子、式および述部
745
第 15 章 日時および間隔の関数と式
ANSI の日時式
date_time_expression の構文
date_time_term
interval_expression
date_time_expression
date_time_term
+
±
interval_term
date_time_term の構文
date_time_primary
AT
LOCAL
expression
TIME ZONE
time_zone_string
構文要素
date_time_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
式の形式は以下のうちの 1 つになります。
• 単一の date_time_term。
• interval_expression と date_time_term 式の合計。
• date_time_expression と interval_term の合計または差。
date_time_term
単一の date_time_primary、または AT LOCAL、AT [TIME ZONE] expression、また
は AT [TIME ZONE] time_zone_string のタイムゾーン指定子が指定された
date_time_primary。
interval_expression
以下のうちの 1 つです。
• 単一の interval_term。
• interval_term に対して加算または減算された interval_expression。
• start TO end 句に先行する date_time_expression と date_time_term (括弧で囲ま
れる)の差。
date_time_primary
以下の要素の 1 つ。どれも適切な DateTime 型を備えていなければなりません。
• 列参照
• 日時定数値
• 日時関数参照
たとえば、CASE 式または CAST 関数の結果や、または CURRENT_DATE や
CURRENT_TIME のような日時組み込み関数。
• スカラー関数参照
• 集約関数参照
• (table_expression)
スカラー subquery
746
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の日時式
• (date_time_timestamp_expression)
AT LOCAL
現行セッションのタイムゾーンに基づくデフォルトのタイムゾーン変位を使用しま
す。現在のセッションのタイムゾーンは、タイムゾーン文字列として指定されるか、
ローカルのタイムゾーンのオフセットを定義する INTERVAL データ タイプとして表
わされるタイムゾーン変位として指定される。
AT [TIME ZONE] expression
式で定義されたタイムゾーンの変位を使用します。
expression のデータ タイプは INTERVAL HOUR(2) TO MINUTE か、暗黙的に
INTERVAL HOUR(2) TO MINUTE に変換できるデータ タイプでなければなりません。
AT [TIME ZONE] time_zone_string
time_zone_string は、タイムゾーン変位を決定します。
AT LOCAL および AT TIME ZONE タイムゾーン指定子
date_time_primary が TIME または TIMESTAMP 値と評価される場合、あるいはビ
ルトイン関数 CURRENT_DATE または DATE の場合に限り、date_time_primary 内
に AT LOCAL または AT [TIME ZONE]句を含めることができます。
効果は、date_time_term を指定されたタイムゾーン変位に合わせて調整することで
す。
AT [TIME ZONE]句でタイムゾーン変位を指定する expression は(必要なときに可能
であれば)、次に示す表で定義されたデータ型に応じて、タイムゾーン変位またはタ
イムゾーン文字列に暗黙的に変換されます。
expression のデータ タイプ
暗黙の変換
INTERVAL HOUR(n) TO MINUTE
(n が 2 でない場合)
CAST(expression AS INTERVAL HOUR(2) TO MINUTE)
INTERVAL HOUR
INTERVAL DAY
INTERVAL DAY TO HOUR
INTERVAL DAY TO MINUTE
INTERVAL DAY TO SECOND
INTERVAL HOUR
INTERVAL HOUR TO SECOND
INTERVAL MINUTE
INTERVAL MINUTE TO SECOND
INTERVAL SECOND
CAST(expression AS INTERVAL HOUR(2) TO MINUTE)
BYTEINT
SMALLINT
INTEGER
CAST(CAST(expression AS INTERVAL HOUR(2)) AS INTERVAL
HOUR(2) TO MINUTE)
SQL 関数、演算子、式および述部
747
第 15 章 日時および間隔の関数と式
ANSI の日時式
expression のデータ タイプ
暗黙の変換
BIGINT
DECIMAL/NUMERIC(小数部が 0 の
場合)
DECIMAL/NUMERIC (小数部が 0 以 CAST(CAST((expression)*60 AS INTERVAL MINUTE(4)) AS
上の場合)
INTERVAL HOUR(2) TO MINUTE)
CHARACTER SET UNICODE を使用 CAST(CAST(expression AS INTERVAL HOUR(2)) AS INTERVAL
する文字
HOUR(2) TO MINUTE)
上記の CAST 文でエラーが発生した場合、Teradata Database は次
の文を試行します。
CAST(expression AS INTERVAL HOUR(2) TO MINUTE)
この CAST 文でもエラーが発生した場合、Teradata Database は文
字の値をタイムゾーン文字列として処理します。
CHARACTER SET UNICODE ではな TRANSLATE(expression USING
い文字
source_repertoire_name_TO_Unicode)
source_repertoire_name は expression のサーバー文字セットで
す。コード変換された値は、上記の CHARACTER SET UNICODE を
使用した文字値に対する処理が実行されます。
その他
エラーが返されます。
注: 数値から INTERVAL 型への変換には全般的な制限があります。INTERVAL 型には
日時フィールドが 1 つだけ必要になります。ただし、この制限は、AT 句の expression
を暗黙的に変換する際には問題になりません。その理由は、この変換が 2 つの CAST
文を使用して実行されるためです。
INTERVAL HOUR(2) TO MINUTE への変換結果が、INTERVAL -'12:59' HOUR TO
MINUTE と、INTERVAL '14:00' HOUR TO MINUTE の間に収まらない値になると、
エラーが返されます。
AT [TIME ZONE] time_zone_string 句では、2 種類のタイムゾーン文字列を指定でき
ます。
• 独自の夏時間(DST)と、協定世界時(UTC 時間)からの標準タイムゾーン変位に対応
しない、タイムゾーン文字列。
• 独自の DST と、UTC 時間からの標準タイムゾーン変位に対応する、タイムゾーン
文字列。
サポートされているタイムゾーン文字列を次に示します。
独自の DST と標準タイムゾーン変位に対応しない文字列
748
• 'GMT'
• 'GMT+4'
• 'GMT-1'
• 'GMT+1'
• 'GMT+4:30'
• 'GMT-10'
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の日時式
独自の DST と標準タイムゾーン変位に対応しない文字列
• 'GMT+10'
• 'GMT+5'
• 'GMT-11'
• 'GMT+11'
• 'GMT+5:30'
• 'GMT-2'
• 'GMT+11:30'
• 'GMT+5:45'
• 'GMT-3'
• 'GMT+12'
• 'GMT+6'
• 'GMT-4'
• 'GMT+13'
• 'GMT+6:30'
• 'GMT-5'
• 'GMT+14'
• 'GMT+7'
• 'GMT-6'
• 'GMT+2'
• 'GMT+8'
• 'GMT-6:30'
• 'GMT+3'
• 'GMT+8:45'
• 'GMT-7'
• 'GMT+3:30'
• 'GMT+9'
• 'GMT-8'
• 'GMT+9:30'
独自の DST と標準タイムゾーン変位に対応する文字列
• 'Africa Egypt'
• 'Asia Gaza'
• 'Australia Central'
• 'Africa Morocco'
• 'Asia Iran'
• 'Australia Eastern'
• 'Africa Namibia'
• 'Asia Iraq'
• 'Australia Western'
• 'America Alaska'
• 'Asia Irkutsk'
• 'Europe Central'
• 'America Aleutian'
• 'Asia Israel'
• 'Europe Eastern'
• 'America Argentina'
• 'Asia Jordan'
• 'Europe Kaliningrad'
• 'America Atlantic'
• 'Asia Kamchatka'
• 'Europe Moscow'
• 'America Brazil'
• 'Asia Krasnoyarsk'
• 'Europe Samara'
• 'America Central'
• 'Asia Lebanon'
• 'Europe Western'
• 'America Chile'
• 'Asia Magadan'
• 'Indian Mauritius'
• 'America Cuba'
• 'Asia Omsk'
• 'Mexico Central'
• 'America Eastern'
• 'Asia Syria'
• 'Mexico Northwest'
• 'America Mountain'
• 'Asia Vladivostok'
• 'Mexico Pacific'
• 'America Newfoundland'
• 'Asia West Bank'
• 'Pacific New Zealand'
• 'America Pacific'
• 'Asia Yakutsk'
• 'Pacific Samoa'
• 'America Paraguay'
• 'Asia Yekaterinburg'
• 'America Uruguay'
Teradata Database は、このタイムゾーン文字列を解決して、セッションまたは要求
された問合わせに対するタイムゾーン変位を計算します。
注: タイムゾーンの指定に、独自の DST と標準タイムゾーン変位に対応するタイム
ゾーン文字列を使用した場合にのみ、Teradata Database は夏時間の開始と終了を考
慮に入れて自動的にタイムゾーン変位を調整します。GMT 書式の文字列は、標準時
にのみに対応し、独自の夏時間が存在しないタイムゾーン文字列を表わします。た
とえば、インドではタイムゾーン文字列'GMT+5:30'が使用されているでしょう。こ
れは、年間を通して、5 時間 30 分の変位の間隔を適用するために使用できます。
SQL 関数、演算子、式および述部
749
第 15 章 日時および間隔の関数と式
ANSI の日時式
Teradata Database は、システム UDF(ユーザー定義関数)の
GetTimeZoneDisplacement に格納されたルールとタイムゾーン変位の情報に基づい
て、タイムゾーン文字列を解決します。
Teradata が提供するタイムゾーン文字列では要件を満たせないときには、新しいタ
イムゾーン文字列を追加するか、既存のタイムゾーン文字列に変更を加えてくださ
い。そのためには、GetTimeZoneDisplacement UDF に変更を加えるか、新しい規則
を追加することになります。
次に示す状況でも、AT 句を使用してタイムゾーンを明示的に指定できます。
• 以下のビルトイン関数を使用する場合。
• 「CURRENT_DATE」
• 「CURRENT_TIME」
• 「CURRENT_TIMESTAMP」
• 「DATE」
• 「TIME」
注: これらのビルトイン関数を AT LOCAL 句に指定すると、DBS 制御フラグ
TimeDateWZControl の設定に応じて返される値が変化します。
• CAST 関数または Teradata 変換構文を使用して、日時データ タイプを変換する場
合。変換元タイムゾーン、特定のタイムゾーン変位やタイムゾーン文字列、また
は現在のセッションのタイムゾーンとして、CAST や変換に使用するタイムゾー
ンを指定できます。
• フィールドの抽出前に、変換元の式のタイムゾーンを指定するために、EXTRACT
関数を使用する場合。
関連トピック
詳細は、以下を参照してください。
• セッション タイムゾーンの設定については、<SQL データ定義言語 - 構文規則お
よび例、B035-1144>の「SET TIME ZONE、CREATE USER、MODIFY USER」を
参照してください。
• システム タイムゾーン設定については、<ユーティリティ 、B035-1102>の
「System TimeZone Hour」および「System TimeZone Minute」を参照してくださ
い。
• DST を考慮に入れたシステム時間の自動調整については 、<ユーティリティ 、
B035-1102>の「SDF ファイル」および「Teradata Locale Definition ユーティリ
ティ(tdlocaledef)」を参照してください。
• 日時定数の詳細は、< SQL データ型とリテラル、B035-1143>を参照してください。
• 詳細は、「GetTimeZoneDisplacement」を参照してください。
• 詳細については、 「データ型の変換」を参照してください。
• タイムゾーンの詳細については、< SQL データ型とリテラル、B035-1143>の「日
付/時刻データ タイプと間隔データ タイプ」を参照してください。
750
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の日時式
グレゴリオ暦の規則
日時式は、常にグレゴリオ暦の規則内で実行される。
そのような評価の結果、値がフィールドの許容範囲外になったり、DATE および TIME
の自然の規則に従って許容されない値になったりした場合は、エラーが戻される。
例えば、次の演算は、評価の結果の日付が有効でない('1996-09-31')ためエラーを
戻します。
SELECT DATE '1996-08-31' + INTERVAL '1' MONTH;
2 番目のオペランドを少し修正すれば、所定の結果が得られます。
SELECT DATE '1996-08-31' + INTERVAL '30' DAY;
この演算は、所定の結果の'1996-09-30'を戻します。エラーは戻されません。
評価のタイプ
日時値に関与する式は、結果が日時タイプになります。DATE は最下位タイプであ
り TIMESTAMP は最上位タイプです。
日時式に関与する値
結果
日付
日付。
時刻
時間。
タイムスタンプ
タイムスタンプ。
間隔値の加算と減算
日時値に間隔を加算することによって、または日時値から間隔を減算することによっ
て形成された日時値の式は、該当する構成要素フィールドの値の加算または減算を
行ない、該当するモジュロによって精度がより低いフィールドから桁あふれを持ち
越し、カレンダと時計に関する適切な演算を表わすことによって行なわれる。
interval_expression または interval_term には、それに対応する
date_time_expression または date_time_term に含まれている日時フィールドのみを
含めることができます。
TIME または TIMESTAMP 値に対して INTERVAL 値が加算または減算された場合、
結果に関連するタイムゾーン変位値は、TIME または TIMESTAMP 値に関連するタ
イムゾーン変位値と同じになります。
タイムゾーンの関係した計算
タイムゾーンを含んだ日時式で演算を行なう場合、結果は以下のように計算されます。
式 DV の日時値とタイムゾーン値構成要素(UTC に正規化される)を呼び出す。
SQL 関数、演算子、式および述部
751
第 15 章 日時および間隔の関数と式
ANSI の日時式
結果は DV - TZ として計算されます。
例
例: date_time_primary
この例では、date_time_primary はビルトイン時刻関数です。
SELECT CURRENT_TIME;
例: 整数値のタイムゾーン指定子が指定された date_time_term
この例では、 date_time_primary はビルトイン時刻関数であり、タイムゾーン変位
を太平洋標準時の負の整数値で指定しています。
SELECT CURRENT_TIME AT TIME ZONE -8;
例: 10 進数位取りのタイムゾーン指定子が指定された date_time_term
この例では、date_time_primary はビルトイン時刻関数であり、タイムゾーン変位を
ベネズエラのタイムゾーンの 10 進数位取り値で指定しています。
SELECT CURRENT_TIME AT TIME ZONE -4.5;
例: 'hh:mm'文字列のタイムゾーン指定子が指定された date_time_term
この例では、date_time_primary はビルトイン時刻関数であり、タイムゾーン変位を
ベネズエラのタイムゾーンの負の'hh:mm'文字列で指定しています。
SELECT CURRENT_TIME AT TIME ZONE -'4:30';
例: INTERVAL 列のタイムゾーン指定子が指定された date_time_term
この例では、date_time_term は f1 という名前の date_time_primary 列の値です。
TS.f1 はタイプ TIME または TIMESTAMP の値であり、intrvl.a はタイプ INTERVAL
HOUR(2) TO MINUTE の列間隔値です。
SELECT f1 AT TIME ZONE intrvl.a
FROM TS;
例: 間隔リテラルのタイムゾーン指定子が指定された date_time_term
この例では、date_time_term は f1 という名前の date_time_primary 列の値です。
指定された間隔は、タイプ INTERVAL HOUR TO MINUTE の間隔定数値です。
SELECT f1 AT TIME ZONE INTERVAL '01:00' HOUR TO MINUTE
FROM TS;
例: タイムゾーン文字列のタイムゾーン指定子が指定された date_time_term
この例では、date_time_term は f1 という名前の date_time_primary 列の値です。
752
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の日時式
TS.f1 は、タイプ TIME または TIMESTAMP の値であり、タイムゾーン変位はタイ
ムゾーン文字列'America Pacific'に基づきます。
SELECT f1 AT TIME ZONE 'America Pacific'
FROM TS;
例: date_time_expression
この例では、date_time_expression は date_time_term に加算された
interval_expression です。これらの項は加算だけを行なえることに注意する必要が
あります。interval_expression から date_time_term を減算することはできません。
SELECT INTERVAL '20' YEAR + CURRENT_DATE;
例: 加算での date_time_expression
この例では、date_time_expression は、interval_term に加算された別の
date_time_expression から成ります。
列 subscribe_date および subscription_interval は、それぞれ DATE および
INTERVAL MONTH(4)にタイプ付けされます。
SUBSCRIBE_DATE + SUBSCRIPTION_INTERVAL
例: 減算での date_time_expression
date_time_expression から interval_term を減算することもできます。
この例では、interval_term が date_time_expression から減算されます。
列 expiration_date および subscription_interval は、それぞれ DATE および
INTERVAL MONTH(4)にタイプ付けされます。
EXPIRATION_DATE - SUBSCRIPTION_INTERVAL
タイムゾーンの整列順序
タイムゾーンは、同一タイムゾーンを使用して年代順に順序付けされます。
例
TIMESTAMP(0) WITH TIME ZONE 型の列が含まれるテーブルに対して、配列が指
定された SELECT 文を使用した次の例を考えてみてください。
これらの ORDER BY SELECT で示された同じ順番がすべてのタイムゾーン比較操作
に適用されます。
SELECT f1 TIMESTAMPFIELD
FROM timestwz
ORDER BY f1;
この文は、次の結果テーブルを戻します。
SQL 関数、演算子、式および述部
753
第 15 章 日時および間隔の関数と式
ANSI の日時式
TIMESTAMPFIELD
------------------------1997-10-07 15:43:00+08:00
1997-10-07 15:43:00-00:00
1997-10-07 15:47:52-08:00
値は、格納されたタイムゾーン情報と共に表示されますが、配列がすぐに明確にな
らないことに注意する必要があります。
ここで、CAST 関数によってタイムゾーンを標準化すると、年代順の配列が明示的に
示されます。
SELECT CAST(f1 AS TIMESTAMP(0)) TIMESTAMP_NORMALIZED
FROM timestwz
ORDER BY f1;
この文は、次の結果テーブルを戻します。
TIMESTAMP_NORMALIZED
------------------1997-10-06 23:43:00
1997-10-07 07:43:00
1997-10-07 15:45:52
並びは前の問合わせと同じですが、TIMESTAMP 値の表示はセッションに有効なタ
イムゾーン(すなわち '-08:00')に標準化されています。
タイムゾーンの処理を変える、すなわち地方時を反映させると、同じ年代順の並び
でも表示が異なります。
SELECT f1 AT LOCAL LOCALIZED
FROM timestwz
ORDER BY f1;
この文は、次の結果テーブルを戻します。
LOCALIZED
------------------------1997-10-06 23:43:00-08:00
1997-10-07 07:43:00-08:00
1997-10-07 15:45:52-08:00
関連トピック
詳細は、以下を参照してください。
• セッション タイムゾーンの設定については、<SQL データ定義言語 - 構文規則お
よび例、B035-1144>の「SET TIME ZONE、CREATE USER、MODIFY USER」を
参照してください。
• システム タイムゾーン設定については、<ユーティリティ 、B035-1102>の
「System TimeZone Hour」および「System TimeZone Minute」を参照してくださ
い。
754
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の間隔式
• DST を考慮に入れたシステム時間の自動調整については 、<ユーティリティ 、
B035-1102>の「SDF ファイル」および「Teradata Locale Definition ユーティリ
ティ(tdlocaledef )」を参照してください。
• 日時定数の詳細は、< SQL データ型とリテラル、B035-1143>を参照してください。
• 詳細は、「GetTimeZoneDisplacement」を参照してください。
• 詳細については、 「データ型の変換」を参照してください。
• タイムゾーンの詳細については、< SQL データ型とリテラル、B035-1143>の「日
付/時刻データ タイプと間隔データ タイプ」を参照してください。
ANSI の間隔式
目的
間隔値(または値式)で計算を実行し、同じタイプの単一の値を戻します。
定義
間隔式は、間隔値の結果を戻す式です。
interval_expression の構文
interval_term
interval_expression
±
interval_term
date_time_expression
(
date_time_term
)
start
TO end
interval_term の構文
numeric_factor の構文
±
interval_primary
interval_term
*
numeric_factor
/
numeric_term
*
interval_factor
構文要素
interval_expression
以下のうちの 1 つです。
• 単一の interval_term。
• interval_term に対して加算または減算された interval_expression。
• start TO end 句に先行する date_time_expression と date_time_term (括弧で囲ま
れる)の差。
SQL 関数、演算子、式および述部
755
第 15 章 日時および間隔の関数と式
ANSI の間隔式
interval_term
以下の式のうちの 1 つです。
• 単一の interval_factor
• interval_term を numeric_factor によって乗算または除算したもの
• numeric_term と interval_factor の積
interval_factor
符号付きの interval_primary。
date_time_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
式の形式は以下のうちの 1 つになります。
• 単一の date_time_term。
• interval_expression と date_time_term 式の合計。
• date_time_expression と interval_term の合計または差。
date_time_term
単一の date_time_primary、または AT LOCAL、AT [TIME ZONE] expression、また
は AT [TIME ZONE] time_zone_string のタイムゾーン指定子が指定された
date_time_primary。
start
次の構文を持つ、日付または時間間隔の開始を定義する日時値。
YEAR
MONTH
DAY
(precision
)
,fractional_seconds_precision
HOUR
MINUTE
SECOND
説明:
• precision は、許可される桁数(1~4)を指定します。デフォルトの桁数は 2 です。
• fractional_seconds_precision は、SECOND の値の小数点以下の桁数(0~6)を指定
します。デフォルトは 6 です。
MONTH および SECOND 値は、TO end を指定しない場合にのみ使用できます。
TO end
次の構文を持つ、日付または時間間隔の終了を定義する日時値。
MONTH
HOUR
(fractional_seconds_precision)
MINUTE
SECOND
756
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の間隔式
fractional_seconds_precision は、SECOND の値の小数点以下の桁数(0~6)を指定し
ます。デフォルトは 6 です。
end の値は、start.の値よりも下位でなければなりません。
start が YEAR の値の場合、end は MONTH の値でなければなりません。
numeric_factor
符号付きの numeric_primary
numeric_term
numeric_factor または numeric_term を numeric_factor によって乗算または除算し
たもの。
numeric_primary
以下の要素のうちの 1 つ。どれも適切な数値型でなければなりません。
• 列参照
• 数値定数値
• スカラー関数参照
• 集約関数参照
• (table_expression)
スカラー subquery
• (numeric_expression)
interval_primary
以下の要素のうちの 1 つ。どれも適切な INTERVAL 型でなければなりません。
• 列参照
• 間隔定数値
間隔定数の詳細は、< SQL データ型とリテラル、B035-1143>を参照してください。
• スカラー関数参照
• 集約関数参照
• (table_expression)
スカラー subquery
• (interval_expression)
例
間隔式の構成要素と処理の例
この後の例では、間隔式の構成要素を示し、それらの構成要素が処理される方法に
ついて説明します。
interval_term の例
interval_term の定義は、以下の 4 つの形式で表わすことができます。
• interval_factor
SQL 関数、演算子、式および述部
757
第 15 章 日時および間隔の関数と式
ANSI の間隔式
• interval_term * numeric_factor
• interval_term / numeric_factor
• numeric_term * interval_factor
この例では、2 番目の定義を使用しています。
SELECT (INTERVAL '3-07' YEAR TO MONTH) * 4;
この演算の interval_term は、INTERVAL '3-07' YEAR TO MONTH です。
numeric_factor は 4 です。
処理の段階は、以下のようになります。
1 間隔は、INTEGER 値として 43 ヶ月に変換されます。
2 INTEGER 値が 4 倍され、172 ヶ月の結果を生成します。
3 結果は'14-4'に変換されます。
numeric_factor の例
この例では、INTERVAL YEAR TO MONTH に型付けされた値を持つ numeric_factor
を使用しています。
SELECT INTERVAL '10-02' YEAR TO MONTH * 12/5;
この演算での numeric_factor は、整数 12 です。
処理の段階は、以下のようになります。
1 間隔が 12 倍され、間隔の結果を生成します。
2 間隔の結果が 5 で除算され、'24-04'の結果を生成します。
括弧を使って評価の順番を変更すると、結果がまったく異なることに注意する必要
があります。例を示します。
SELECT INTERVAL '10-02' YEAR TO MONTH * (12/5);
この演算では、numeric_factor は(12/5)になります。
処理の段階は、以下のようになります。
1. numeric_factor が計算されて 2.4 の結果を生成します。値はデフォルトで整数な
ので、結果は切り捨てられて 2 になります。
2. 間隔が 2 で乗算され、'20-04'の結果を生成します。
interval_term/numeric_factor の例
次の例では、numeric_factor 値によって除算された interval_term 値を使用していま
す。
SELECT INTERVAL '10-03' YEAR TO MONTH / 3;
interval_term は INTERVAL '10-03' YEAR TO MONTH です。
758
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の間隔式
numeric_factor は 3 です。
処理の段階は、以下のようになります。
1 間隔値は月の値に分解されます。
10 年と 3 ヶ月が評価されて 123 ヶ月になります。
2 間隔の合計が numeric_factor である 3 によって除算され、結果が'3-05'になり
ます。
次の例は、整数の算術で切り捨てが行なわれる方法を示している点を除いて、最初
の例と類似しています。
SELECT INTERVAL '10-02' YEAR TO MONTH / 3;
interval_term は INTERVAL '10-02' YEAR TO MONTH です。
numeric_factor は 3 です。
処理の段階は、以下のようになります。
1. 間隔値は月の値に分解されます。
10 年と 2 ヶ月が評価されて 122 ヶ月になります。
2. 間隔の合計が numeric_factor である 3 によって除算され、40.67 か月という結
果を生成します。値は整数なので、結果が切り捨てられて 40 になります。
3. 間隔の合計が適切な形式に変換し直され、INTERVAL '3-04'という結果を生成し
ます。
numeric_term * interval_primary の例
この形式では、numeric_term の値に乗算と除算のインスタンスを含めることがで
きます。
SELECT 12/5 * INTERVAL '10-02' YEAR TO MONTH;
numeric_term は 12/5 です。
interval_primary は INTERVAL '10-02' YEAR TO MONTH です。
処理の段階は、以下のようになります。
1 numeric_term 12/5 が評価されて 2.4 の結果を生成します。値はデフォルトで
整数なので、結果は切り捨てられて 2 になります。
2 interval_primary が 2 で乗算され、'20-04'の結果を生成します。
numeric_term * ± interval_primary の例
この例では、負の interval_primary を numeric_term 倍し、負の結果を
interval_term に加算します。
SELECT (RACE_DURATION + (2 * INTERVAL -'30' DAY));
この場合の numeric_term は、numeric_primary 2 です。
SQL 関数、演算子、式および述部
759
第 15 章 日時および間隔の関数と式
ANSI の間隔式
interval_primary は INTERVAL -'30' DAY です。
RACE_DURATION は interval_term であり、タイプは INTERVAL DAY TO SECOND で
す。
処理の段階は、以下のようになります。
1 interval_primary が正確な数値、すなわち 60 日に変換されます。
2 この算術に示された演算がオペランド(この時点では両方とも数値)上で行なわれ、
適切な位取りと精度を持つ正確な数値の結果を生成します。
この例では、60 日が RACE_DURATION から減算されます。RACE_DURATION
は、INTERVAL DAY TO SECOND の間隔タイプです。
3 数値の結果が、示された間隔タイプ、DAY TO SECOND に変換し直されます。
interval_expression の例
interval_expression の定義は、以下の 3 つの形式で表わすことができます。
• interval_term
• interval_expression + interval_term
• (date_time_expression - date_time_term) start TO end
この例では、2 番目の定義を使用しています。
SELECT (CAST(INTERVAL '125' MONTH AS INTERVAL YEAR(2) TO MONTH))
+ INTERVAL '12' YEAR;
interval_expression は INTERVAL '125' MONTH です。
interval_term は INTERVAL '12' YEAR です。
処理の段階は、以下のようになります。
1 CAST 関数が、125 か月の interval_expression の値を 10 年と 5 か月に変換しま
す。
2 12 年の interval_term の値が interval_expression の値に加算され、22 年と 5 か
月という結果を生成します。
3 結果が適切なデータ タイプである INTERVAL YEAR(2) TO MONTH に変換され、
'22-05'の結果を生成します。
この例では、interval_expression の 3 番目の定義を使用しています。
date_time_expression の値と date_time_term の値が比較可能であるようにしなけれ
ばなりません。
SELECT (TIME '23:59:59.99' - CURRENT_TIME(2)) HOUR(2) TO SECOND(2);
date_time_expression は TIME '23:59:59.99'です。
date_term は、date_time_primary - CURRENT_TIME(2)です。
処理の段階は、以下のようになります。
760
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ANSI の間隔式
1. 現在のシステム時刻を 18:35:37.83 と仮定します。
2. HOUR(2) TO SECOND(2)の時間間隔 18:35:37.83 が TIME の値 23:59:59.99 か
ら減算され、'5:24:22.16'の結果を生成します。
ここでは interval_expression の 3 番目の定義を使用して、2 つの TIMESTAMP 値の
分単位での差分を確かめる別の例を示します。まずテーブルを定義します。
CREATE TABLE BillDateTime
(start_time TIMESTAMP(0)
,end_time TIMESTAMP(0));
次に、分単位の差を判別します。
SELECT (end_time - start_time) MINUTE(4)
FROM BillDateTime;
処理の段階は、以下のようになります。
1. start_time TIMESTAMP 値が end_time TIMESTAMP 値から減算されて間隔結果
を生じます。
2. MINUTE(4)は 4 桁の精度の分単位の間隔を指定します。この場合、最大 9999
分(約 1 週間)を指定できます。
規則
間隔式には以下の規則が適用されます。
• 間隔に関与する式は、オペランドを整数に変換し、結果の算術式を評価し、次に
結果を適切な間隔に変換し直すことによって評価される。
• interval_expression と interval_primary のデータ型はどちらも INTERVAL であ
る。
• interval_expression には、年-月の間隔構成要素か、日-時刻の間隔構成要素のど
ちらかが含まれていなければならない。間隔のタイプを混合することは許されな
い。
• 間隔に関連した式の場合、日時式や数値式がその中に入っていても、常に間隔と
評価されます。
interval_expression 内の構成要素
結果
間隔タイプのただ 1 つの構成要素
同じ間隔タイプです。
単一の日時値または start TO end 句
日時または start TO end 句の値に対して指定された
日時フィールドを含みます。
間隔タイプの複数の構成要素
構成要素フィールドの間隔タイプのすべての日時
フィールドを含んだ間隔タイプです。
SQL 関数、演算子、式および述部
761
第 15 章 日時および間隔の関数と式
算術演算子および ANSI の DateTime と間隔のデータ型
複数のフィールドをもつ間隔の正規化
解析プログラムが複数のフィールドの間隔値を正規化する方法のために 、間隔値に
定義された精度では正規化後の間隔値を入れるのに十分な大きさでないことがあり
ます。
たとえば INTERVAL YEAR(2) TO MONTH と定義された列に'99-12'という値を挿入
すると、その値は解析プログラムによって'100-00'に正規化されるために、桁あふ
れエラーを起こします。その値を 2 桁の YEAR フィールドを持つと定義された列に
挿入しようとした場合は、年が 3 桁であるために失敗します。
次の式は、タイプの許容範囲の値を超えているために桁あふれエラーを戻します。
まずテーブルを定義します。
CREATE TABLE BillDateTime
(column_1 INTERVAL YEAR
,column_2 INTERVAL YEAR(1) TO MONTH
,column_3 INTERVAL YEAR(2) TO MONTH
,column_4 INTERVAL YEAR(3) TO MONTH );
ここで、次の INSERT 文を使用して値 INTERVAL '999-12' YEAR TO MONTH を挿入
します。
INSERT BillDateTime (column_1, column_4)
VALUES ( INTERVAL '40' YEAR, INTERVAL '999-12' YEAR TO MONTH );
INTERVAL YEAR(3) TO MONTH の値の有効な範囲は-'999-11'から'999-11'までなの
で、結果は桁あふれエラーになります。
'999-12'の値ならば問題がないように見えるかも知れませんが、解析プログラムは
その値を'1000-00' YEAR TO MONTH に正規化するので、それも失敗します。年の
値は次に 4 桁になるので、桁あふれが発生して演算が失敗します。
算術演算子および ANSI の DateTime と間隔のデータ型
ANSI の日時値と間隔値の演算では、スカラー算術演算子+、-、*、および/を使用す
ることができます。ただし、特定の組み合わせの日時値と間隔値に対してのみ演算
子は有効になります。
算術演算子と結果タイプ
日時および間隔のデータ タイプでは、以下の算術演算を行なうことができます。
762
最初の値のタイプ
演算子
2 番目の値のタイプ
結果のタイプ
日時
-
日時
間隔
日時
+
間隔
日時
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
算術演算子および ANSI の DateTime と間隔のデータ型
最初の値のタイプ
演算子
2 番目の値のタイプ
結果のタイプ
日時
-
間隔
日時
間隔
+
日時
日時
間隔
+
間隔
間隔
間隔
-
間隔
間隔
間隔
*
数値
間隔
間隔
/
数値
間隔
数値
*
間隔
間隔
DATE に対する数の加算と減算
Teradata SQL では、ANSI DATE 値に対して日数を加算または減算できるように ANSI
SQL:2011 規格が拡張されています。
Teradata SQL ではそのような数を INTERVAL DAY 値として扱います。
2 つの日時値の差の計算
Teradata Database は、ANSI SQL 規格に従って 2 つの DATE、TIME、または
TIMESTAMP 値間の差分を計算します。結果の単位より小さな単位は、間隔値を計
算するときに無視されます。
たとえば、2 つの DATE 値の月差を計算する場合、2 つのオペランドのそれぞれの
日の値は無視されます。同様に、2 つの TIMESTAMP 値の差分(時間単位)を計算す
る場合、オペランドの分や秒の値は無視されます。
例
例: DATE 値間の日数の差の計算
次の問合わせは、2 つの DATE 値の日差を計算します。
SELECT (DATE '2007-05-10' - DATE '2007-04-28') DAY;
結果は、以下のようになります。
(2007-05-10 - 2007-04-28) DAY
----------------------------12
次の問合わせは、2 つの DATE 値の月差を計算します。
SELECT (DATE '2007-05-10' - DATE '2007-04-28') MONTH;
SQL 関数、演算子、式および述部
763
第 15 章 日時および間隔の関数と式
集約関数と ANSI の日時および間隔データ タイプ
結果は、以下のようになります。
(2007-05-10 - 2007-04-28) MONTH
------------------------------1
2 つの日付の間には 12 日の差がありますが、1 か月にはなりません。しかし、
Teradata Database は計算時に日の値を無視して月の値だけを考慮するため、結果は
4 月と 5 月の差分を示す 1 か月の間隔になります。
例: DATE への間隔の加算
以下の例では、日時値に間隔値が加算されます。
CREATE TABLE Subscription
(id CHARACTER(13)
,subscribe_date DATE
,subscribe_interval INTERVAL MONTH(4));
INSERT Subscription (subscribe_date, subscribe_interval)
VALUES (CURRENT_DATE, INTERVAL ’24’ MONTH);
SELECT subscribe_date + subscribe_interval FROM Subscription;
結果は日時値になります。
関連トピック
詳細については、「DATE 値と整数の算術演算」を参照してください。
集約関数と ANSI の日時および間隔データ タイプ
ANSI SQL:2011 の日時タイプには、以下の集約関数が有効です。
関数
結果
AVG(arg)
引数のタイプ。
MAX(arg)
日時タイプの比較規則に基づく引数のタイプ。「MAX」。
MIN(arg)
「MIN」。
COUNT(arg)
モードが Teradata であれば INTEGER。
詳細の参照先
「AVG」。
「COUNT」。
モードが ANSI であれば DECIMAL(n,0)。ただ
し、
• DBSControl 内の MaxDecimal の値が 0、
15、18 のいずれかである場合、n は 15 で
す。
764
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
スカラー演算と日時関数
関数
結果
詳細の参照先
• DBSControl 内の MaxDecimal の値が 38 で
ある場合、n は 38 です。
間隔データ タイプ
間隔タイプには、以下の集約関数が有効です。
関数
結果
詳細の参照先
AVG(arg)
引数のタイプ。
「AVG」。
COUNT(arg)
モードが Teradata であれば INTEGER。
「COUNT」。
モードが ANSI であれば DECIMAL(n,0)。ただ
し、
• DBSControl 内の MaxDecimal の値が 0、
15、18 のいずれかである場合、n は 15 で
す。
• DBSControl 内の MaxDecimal の値が 38 で
ある場合、n は 38 です。
MAX(arg)
日時タイプの比較規則に基づく引数のタイプ。「MAX」。
MIN(arg)
「MIN」。
SUM(arg)
引数のタイプ。
「SUM」。
スカラー演算と日時関数
日時関数は、日時値または間隔値で動作し、結果として日時値を戻す関数です。
サポートされる日時関数は以下のとおりです。
•
•
•
•
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
EXTRACT
同期化の問題を避けるために、これらの関数での演算は DATE、TIME、または
TIMESTAMP について同一の定義を使用することが保証されており、以下の事柄が
常に当てはまります。
•
•
•
•
CURRENT_DATE = CURRENT_DATE
CURRENT_TIME = CURRENT_TIME
CURRENT_TIMESTAMP = CURRENT_TIMESTAMP
CURRENT_DATE と CURRENT_TIMESTAMP は常に同じ DATE を識別する
SQL 関数、演算子、式および述部
765
第 15 章 日時および間隔の関数と式
Teradata の日付および時刻の式
• CURRENT_TIME と CURRENT_TIMESTAMP は常に同じ TIME を識別する
これらの値は、要求が開始された時点の時間を反映し、要求の継続中に変化するこ
とはありません。
例: CURRENT_DATE DateTime 関数の使用
以下の例は CURRENT_DATE 日時関数を使用します。
SELECT INTERVAL '20' YEAR + CURRENT_DATE;
関連トピック
詳細は、以下を参照してください。
• CURRENT_DATE の詳細については、CURRENT_DATE を参照してください。
• CURRENT_TIME の詳細については、CURRENT_TIME を参照してください。
• CURRENT_TIMESTAMP の詳細については、CURRENT_TIMESTAMP を参照して
ください。
• EXTRACT の詳細については、EXTRACT を参照してください。
Teradata の日付および時刻の式
Teradata SQL では、DATE 値のためのデータ タイプが提供され、REAL タイプでエ
ンコードされた数として TIME 値が格納されます。これは、ANSI SQL:2011 規格の
Teradata 拡張部分であり、使用しないでください。
DATE 値および TIME 値は、どちらもエンコードされた値であり、単純な整数または
実際の数ではないので、これらの値の算術演算には制約があります。
ANSI DATE および TIME 値は、適切な日時タイプを使用して格納され、日時の割り
当てと式についての一連の独自の規則があります。詳細については、「ANSI の日時
および間隔データ型の割り当て規則」と「ANSI SQL:2011 の日時および間隔値での
スカラー演算」を参照してください。
DATE 値と整数の算術演算
以下の算術関数は、日付と整数を使用して実行することができます(INTEGER は日数
と解釈されます)。
• DATE + INTEGER
• INTEGER + DATE
• DATE - INTEGER
これらの式は、単純な加算または減算として処理されません。以下のように処理さ
れます。
1 エンコードされた日付値が、あるシステム定義の固定日からの日数を示す中間値
に変換されます。
766
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
Teradata DATE 値でのスカラー演算
2 次に整数値が加算または減算され、基本となる固定日からの日数としての別の
値が形成されます。
3 その結果が、グレゴリオ暦で有効な日付値に戻されます。
DATE 値と日付の算術演算
DATE - DATE の式は、単純な減算としては処理されません。以下のように処理され
ます。
1 エンコードされた日付値が、あるシステム定義の固定日からのそれぞれの日数
を示す中間値に変換されます。
2 この中間値の 2 番目の値が最初の値から減算され、2 つの日付の間の日数が求め
られます。
3 値自体が整数であっても、結果は、ANSI SQL:2011 書式の INTERVAL DAY で戻
されます。
日付値についてのその他の算術演算で結果は得られますが、その結果には意味があ
りません。
例: DATE/2 の整数値の結果
DATE/2 によって整数の結果が得られますが、その値には意味がありません。
時間値について意味のある単純な算術演算はありません。その理由は、時間値が次
のようにエンコードされた時間の実数だからです。
(HOUR*10000 + MINUTE*100 + SECOND)
ここで、SECOND には小数値を含めることができます。
Teradata DATE 値でのスカラー演算
加算と減算の演算は以下のように許可されます。ここで、整数値は日数を表わします。
引数 1
演算
引数 2
結果
DATE
+
INTEGER
DATE
DATE
-
INTEGER
DATE
INTEGER
+
DATE
DATE
DATE
-
DATE
INTEGER
たとえば、90 日を加算することは 3 か月を加算することと同じではありません。
それぞれの月の日数が異なるからです。
SQL 関数、演算子、式および述部
767
第 15 章 日時および間隔の関数と式
LAST_DAY
また、うるう年があるので、365 日の倍数を加算することは年を加算することと同
じではありません。
Teradata の DATE 式でのスカラー演算は、ANSI SQL:2011 のデータ型を使って実行
されます。そのため、date_expression - numeric_expression のタイプの式は、
numeric_expression の構成要素が INTERVAL DAY としてタイプ付けされたかのよう
に扱われます。
ANSI SQL:2011 の日付および間隔の値は、独自のスカラー演算の集合を持ち、ここ
で DATE として定義されたスカラー演算を除いて、混合されたデータ タイプの式を
解決するための暗黙的な変換をサポートしません。
ADD_MONTHS 関数
ADD_MONTHS 関数は、月または年の加算と減算をするためのものであり、関与す
るさまざまな日数を処理します。
EXTRACT 関数
EXTRACT 関数を使用して、日付から年、月、または日を入手します。結果は
INTEGER データ タイプを持ちます。
関連トピック
詳細は、以下を参照してください。
• 詳細については、「ADD_MONTHS」を参照してください。
• 詳細については、「EXTRACT」を参照してください。
LAST_DAY
目的
date_timestamp_value を含む月の最終の日付を返します。
構文
LAST
( period_expression )
( derived_period )
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
768
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
LAST_DAY
date_timestamp_value
日付またはタイムスタンプの引数。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
LAST_DAY は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
• DATE
• TIMESTAMP
• TIMESTAMP WITH TIME ZONE
TIMESTAMP 値は、UTC 時間でデータベースに格納されるためタイムゾーンが欠け
ています。そのため、この関数内ではタイム スタンプ値の解釈にセッションのタイ
ムゾーンを使用します。TIMESTAMP WITH TIME ZONE 値の場合、この関数内では
タイム スタンプ値の解釈にタイムゾーン構成要素を使用します。
結果のタイプ
戻りデータ タイプは DATE です。
例
例 1: 月の最終日の DATE の問合わせ
以下の問合わせを実行します。
SELECT LAST_DAY(DATE '2009-12-20');
これは、結果として 09/12/31 を返します。
例 2: 月の最終日の TIMESTAMP の問合わせ
以下の問合わせを実行します。
SELECT LAST_DAY(TIMESTAMP '2009-08-25 10:14:59');
これは、結果として 09/08/31 を返します。
SQL 関数、演算子、式および述部
769
第 15 章 日時および間隔の関数と式
NEXT_DAY
例 3: 月の最終日の TIMESTAMP WITH TIME ZONE の問合わせ
以下の問合わせを実行します
SELECT LAST_DAY(TIMESTAMP '2009-06-15 10:14:59-8:00');
以下の問合わせを実行します
SELECT LAST_DAY(TIMESTAMP '2009-06-15 10:14:59-8:00');
これは、結果として 09/06/30 を返します。
関連トピック
詳細については、「明示的なデータ型変換における CAST」を参照してください。
NEXT_DAY
目的
day_value で指定した日付より後の、最初の曜日(date_timestamp_value)の日付を返
します。
構文
NEXT_DAY ( date_timestamp_value, day_value )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_timestamp_value
日付またはタイムスタンプの引数。
day_value
文字の引数。
day_value には、任意の曜日または曜日の 3 文字の略語を使用できます。
有効な値は、次のとおりです。
•
•
•
•
•
770
'SUNDAY'または'SUN'
'MONDAY'または'MON'
'TUESDAY'または'TUE'
'WEDNESDAY'または'WED'
'THURSDAY'または'THU'
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
NEXT_DAY
• 'FRIDAY'または'FRI'
• 'SATURDAY'または'SAT'
曜日は大文字と小文字が区別されません。有効な略語の後に続く文字は無視されます。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
NEXT_DAY は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• date_timestamp_value = DATE または TIMESTAMP(0)
• day_value = VARCHAR
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング 、B035-1147>の「互換デー
タ型」を参照してください。
TIMESTAMP 値は、UTC 時間でデータベースに格納されるためタイムゾーンが欠け
ています。そのため、この関数内ではタイム スタンプ値の解釈にセッションのタイ
ムゾーンを使用します。TIMESTAMP WITH TIME ZONE 値の場合、この関数内では
タイム スタンプ値の解釈にタイムゾーン構成要素を使用します。
結果のタイプ
戻りデータ タイプは DATE です。
例
例 1: 指定した日以降の最初の火曜日の問合わせ
以下の問合わせを実行します。
SELECT NEXT_DAY(DATE '2009-12-20', 'TUESDAY');
SQL 関数、演算子、式および述部
771
第 15 章 日時および間隔の関数と式
MONTHS_BETWEEN
結果として 09/12/22 が返されます。これは、2009 年 12 月 20 日の日曜日の次に
あたる火曜日が 12/22 になるためです。
例 2: 指定した日以降の最初の金曜日の問合わせ
以下の問合わせを実行します。
SELECT NEXT_DAY(DATE '2009-12-20', 'FRIDAY');
結果として 09/12/25 が返されます。これは、2009 年 12 月 20 日の日曜日の次に
あたる金曜日が 12/25 になるためです。
例 3: 別に指定した日以降の最初の金曜日の問合わせ
以下の問合わせを実行します。
SELECT NEXT_DAY(DATE '2009-12-25', 'FRIDAY');
結果として 10/01/01 が返されます。これは、2009 年 12 月 25 日の金曜日の次に
あたる金曜日が 2010 年 1 月 1 日になるためです。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
MONTHS_BETWEEN
目的
date_timestamp_value1 と date_timestamp_value2 の間にある月の数を返します。
構文
MONTHS_BETWEEN
( date_timestamp_value1, date_timestamp_value2 )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_timestamp_value1
日付またはタイムスタンプの引数。
date_timestamp_value2
日付またはタイムスタンプの引数。
data_timestamp_value2 が NULL の場合は NULL が返されます。
772
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
MONTHS_BETWEEN
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
MONTHS_BETWEEN は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
DATE、TIMESTAMP、または TIMESTAMP WITH TIME ZONE
MONTHS_BETWEEN に渡す 2 つの引数は、上記の 3 つのデータ タイプのいずれで
もかまいませんが、この 2 つの引数を同じデータ タイプにする必要があります。例
えば、第 1 パラメータとして DATE、第 2 パラメータとして TIMESTAMP を渡すこ
とはできません。
TIMESTAMP 値は、UTC 時間でデータベースに格納されるためタイムゾーンが欠け
ています。そのため、この関数内ではタイム スタンプ値の解釈にセッションのタイ
ムゾーンを使用します。TIMESTAMP WITH TIME ZONE 値の場合、この関数内では
タイム スタンプ値の解釈にタイムゾーン構成要素を使用します。
date_timestamp_value2 が次の場合:
• date_timestamp_value1 以降では、結果は負になります。
• date_timestamp_value1 以前では、結果は正になります。
date_timestamp_value1 と date_timestamp_value2 が同じ日付の場合や、どちらも
が月の最終日の場合、結果は常に整数になります。それ以外の場合、
MONTHS_BETWEEN は、結果の小数部分を 1 か月を 31 日として計算し、
date_timestamp_value1 と date_timestamp_value2 の時間構成要素の差分を考えま
す。グレゴリオ暦がサポートされます。
タイムゾーンのないタイムスタンプは、ローカル タイムゾーンで比較されます。こ
のことは、2 つのタイムスタンプが同じ日にあるかどうか、または両方が月の最終
日であるかどうかを判断する場合にのみ重要になります。タイムゾーンのあるタイ
ムスタンプは、同じゾーンでの時刻になるように、比較の前に UTC に変換されます。
結果のタイプ
戻りデータ タイプは NUMBER です。
SQL 関数、演算子、式および述部
773
第 15 章 日時および間隔の関数と式
ADD_MONTHS
例
例: 2 つの日付の間の月数の問合わせ
以下の問合わせを実行します。
SELECT MONTHS_BETWEEN(DATE'1995-02-02', DATE'1995-01-01');
これは、結果として 1.03225806451612903225806451612903225806 を返しま
す。MONTHS_BETWEEN 関数は、結果の小数部分を 1 か月を 31 日として計算し、
date_timestamp_value1 と date_timestamp_value2 の時間構成要素の差分を考えま
す。
例: 1 つの日付の月数の問合わせ
以下の問合わせを実行します。
SELECT MONTHS_BETWEEN(DATE'2008-09-25', DATE'2008-09-25');
結果として 0.0 が返されます。これは、date_timestamp_value1 と
date_timestamp_value2 の両方が同じ日になるためです。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
ADD_MONTHS
目的
整数の月数を DATE または TIMESTAMP 式に加算し、結果を正規化します。
日付の構文
ADD_MONTHS
( date_expression, integer_expression )
タイムスタンプの構文
ADD_MONTHS
(timestamp_expression, integer_expression )
構文要素
date_expression
月を追加する、次のいずれかの integer_expression:
• 単一引用符で囲まれた DATE の値
774
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ADD_MONTHS
•
•
•
•
DATE 定数
現在のシステム日付値を指定する CURRENT_DATE キーワード
現在のシステム日付値を指定する DATE キーワード
UDT と文字または DATE タイプの間のキャストを行なう暗黙 CAST を持つ UDT
timestamp_expression
月を追加する、次のいずれかの integer_expression:
• TIMESTAMP 定数
• 現在のシステム TIMESTAMP 値を指定する CURRENT_TIMESTAMP キーワード
• UDT と文字または TIMESTAMP タイプの間のキャストを行なう暗黙 CAST を持
つ UDT
integer_expression
date_expression または timestamp_expression に追加される月の整数値。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
規則
ADD_MONTHS は以下の規則に従います。
• ADD_MONTHS のどちらかの引数が NULL の場合には、結果は NULL になります。
• 結果が‘0000-01-01’から‘9999-12-31’までの範囲にない場合は、エラーが報告さ
れます。
• ADD_MONTHS 関数の結果が有効な日付でない場合は、報告されるすべての日付
が有効になるように正規化されます。
UDT のサポート
UDT が与えられた
引数
UDT の暗黙 CAST を使って Teradata Database が暗黙のタイプ変換を
実行するために、UDT との間にキャストが必要な事前定義タイプ
date_expression
• 文字
timestamp_expressi
on
• DATE
integer_expression
数値
• Timestamp
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
ADD_MONTHS を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
SQL 関数、演算子、式および述部
775
第 15 章 日時および間隔の関数と式
ADD_MONTHS
月のスカラー算術の問題
ターゲット月の日数がソース日付の月よりも少ない場合の一貫した取り扱いは、月
の間隔に関するスカラー算術での重要な論題です。月の概念には固定的な定義がな
いからです。
日付に関するすべてのスカラー関数はグレゴリオ暦を使用します。グレゴリオ暦の
特殊性により、90 日(3 か月を表わす)を加算するとか、730 日(2 年を表わす)を加算
するといった算術演算によって一般的に期待通りの結果が得られるわけではありま
せん。詳細については、「グレゴリオ暦の規則」を参照してください。
ADD_MONTHS 関数が使用するアルゴリズムでは 、date_expression または
timestamp_expression に対して月数を加算または減算することができるので、一貫
して有効な結果を得ることができます。
Teradata SQL の ADD_MONTHS 関数または ANSI SQL:2011 の日時 間隔算術のどち
らを使うかを判断する際に、有効ではあるけれども望まない結果が戻されるか、そ
れとも結果が戻されずにエラー メッセージを受け取るかのどちらかの選択に迫られ
ます。
システム定義の関数に依存しない 3 番目の選択肢は、日付の算術に Teradata Database
定義のカレンダ ビューを使用することです。
ADD_MONTHS の正規化の動作
月の間隔の算術に対する標準的なアプローチは、適宜 MONTH および YEAR 値を増
分し、DAY のソース値を保存することです。この方法では、ターゲット月の日数が
ソース日付の DAY 値よりも小さい場合に問題になります。
例えば、'1999-01-31'というソース DATE 値に 1 MONTH を加算する場合、結果を
処理するためにどんなアプローチをとるべきでしょうか。標準的なアプローチを使
えば、結果は'1999-02-31'になりますが、2 月 31 日は有効な日付ではありません。
ADD_MONTHS の動作は、ANSI SQL:2011 準拠の演算である DATE ± INTERVAL 'n'
MONTH および TIMESTAMP ± INTERVAL 'n' MONTH の動作に相当しますが、1 つ
の重要な違いがあります。
これら 2 つのスカラー算術演算の相違点は、有効でない日付値が関数から戻される
場合のそれぞれの動作にあります。
• ANSI SQL:2011 の算術はエラーを戻します。
• ADD_MONTHS 算術は規定の調整を行ない、有効な日付を戻します。
正規化の定義
正規化プロセスについて、以下にさらに丁寧に説明します。
ソースの date_expression または timestamp_expression の DAY フィールドが、結果
のターゲット DAY フィールドよりも大きい場合、ADD_MONTHS は DD を、その月
776
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ADD_MONTHS
の最後の日付+n に設定して、レポートされる日付またはタイムスタンプを正規化し
ます。
分かりやすくするため、date_expression を'YYYY-MM-DD'と定義します。
与えられた date_expression に対して、ADD_MONTHS の構文を次のように表現で
きます。
ADD_MONTHS('YYYY-MM-DD' , n)
n が負の数にもなりうることに留意してください。また、次に示すように、
date_expression に対して'YYYY-MM-DD'を代用して、ADD_MONTHS を ANSI SQL:
2011 の日付および間隔の形に再定義することができます。
ADD_MONTHS('YYYY-MM-DD', n) = 'YYYY-MM-DD' ± INTERVAL 'n' MONTH
この等式は 1999-09-31 のような有効でない日付でない限り真です。有効でない日
付の場合は、ANSI 式は有効でない日付例外をトラップしてエラーを戻します。
一方、ADD_MONTHS は、例外を処理して有効な日付を戻しますが、それは必ずし
も、期待された日付ではないかもしれません。ADD_MONTHS が使うアルゴリズム
は、その正規化された結果を生成し、次のような擬似コードとして表わします。
WHEN
DD > last_day_of_the_month(MM+n)
THEN SET
DD = last_day_of_the_month(MM+n)
この特性は、任意の timestamp_expression の日付部分にも当てはまります。
正規化により、うるう年に対しても有効な結果が生成されます。
ADD_MONTHS の直感的でない結果
ADD_MONTHS が行なう正規化のために、関数の結果の多くは直感的なものではな
く、逆の計算の結果は必ずしも元通りにはなりません。例えば、「例」の結果を
「例」の結果と比較してください。
これは、この関数が常に有効な日付を生成するものの、必ずしも期待通りの日付を
生成するわけではないためです。月の間隔の算術の正確さは、相対的にとらえるべ
き問題です。どんな定義も任意定義であって汎用化することはできないので、「期
待通り」と言う語は、ADD_MONTHS の動作の説明としてより良い表現であるに過
ぎません。
次の SELECT 文は、有効であり期待通りの日付を戻します。
SELECT ADD_MONTHS ('1999-08-15' , 1);
この文は 1999-09-15 を戻します。
SELECT ADD_MONTHS ('1999-09-30' , -1);
SQL 関数、演算子、式および述部
777
第 15 章 日時および間隔の関数と式
ADD_MONTHS
この文は 1999-08-30 を戻します。
次の SELECT 文は有効な日付を戻しますが、その「正確さ」は、どのように「1 か
月」を定義するかにより異なります。
SELECT ADD_MONTHS ('1999-08-31' , 1);
この文は 1999-09-30 を戻します。なぜなら、9 月には 30 日までしかなく、正規化
されていない 1999-09-31 という回答は有効な日付ではないからです。
ADD_MONTHS の要約
ADD_MONTHS は、新しい date_expression または timestamp_expression を、YEAR
および MONTH フィールドとともに戻し、正しい日付を提供するように調整します。
しかし、DAY フィールドの調整は単に有効な日付を保証するためのものであり、直
感的に期待する日付ではないかもしれません。
この動作がご使用のアプリケーションで受け入れられない場合は、ANSI SQL:2011
の日時間隔算術を代わりに使用してください。詳細については、「ANSI の間隔式」
を参照してください。
ADD_MONTHS が結果の DAY 値を変更するのは、そうしなければ有効でない
date_expression または timestamp_expression が報告されることになる場合のみに
限られます。
例
例 1: 直感的に理解できる例
これらの例は、ADD_MONTHS 関数の単純で直感的な例です。すべての結果は有効
で、期待通りのものです。
例 1: DATE 式に対して複数年の月数を問合わせる
次の文は現在の日付に 13 年を加算します。
SELECT ADD_MONTHS (CURRENT_DATE, 12*13);
例 2: 現在の日付から 6 か月後の日付を問合わせる
次の文は 6 ヶ月前の日付を戻します。
SELECT ADD_MONTHS (CURRENT_DATE, -6);
例 3: 現在の日付から 4 か月後の日付を問合わせる
次の文は現在のタイムスタンプに 4 か月を加算します。
SELECT ADD_MONTHS (CURRENT_TIMESTAMP, 4);
778
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ADD_MONTHS
例 4: 現在の日付から 9 か月後の日付を問合わせる
次の文は 1999 年 1 月 1 日から 9 か月後のタイムスタンプを戻します。キーワード
TIMESTAMP を使用している定数形式に注意してください。
SELECT ADD_MONTHS (TIMESTAMP '1999-01-01 23:59:59', 9);
例 5: 現在の日付から 1 か月後の日付を問合わせる
次の文は 1999 年 1 月 30 日に 1 か月を加えます。
SELECT ADD_MONTHS ('1999-01-30', 1);
結果は 1999-02-28 になります。
例 2: 直感的には理解できない例
以下の例では、date_expression の DAY の値、または timestamp_expression の日付
要素が 29、30、または 31 の場合に、ADD_MONTHS 関数の結果が常に期待通りに
はならないことを例示しています。
単純にするために、すべての例で date_expression を使用しています。どのケース
でも、関数は設計どおりに動作しています。
例 1: 無効な日付を問合わせる
この例では、SELECT 文の結果は、1996 年 2 月の日付です。1996 年 2 月 31 日が
有効な日付だったとしたらそうなっていたはずですが、2 月 31 日は有効な日付で
はないので、ADD_MONTHS は答えを正規化します。
元の日付の DAY 値がターゲットの月の最後の DAY 値よりも大きかった場合には、
この結果は、ターゲットの月の最後の有効な DAY 値になります。
SELECT ADD_MONTHS ('1995-12-31', 2);
この例の結果は 1996-02-29 になります。
1996 年がうるう年だったことに注意する必要があります。間隔が 2 か月ではなく
14 か月である場合、結果は'1997-02-28'になります。
例 2: 現在の日付の前の月を問合わせる
この文は、「例」の ADD_MONTHS 関数の逆を実行します。
例の元の日付である'1999-01-30'に戻るはずと思われますが、そうはなりません。
SELECT ADD_MONTHS ('1999-02-28' , -1);
ADD_MONTHS は結果として 1999-01-28 を戻します。
関数は設計どおりに実行し、結果はエラーではありませんが、例から期待した結果
ではないでしょう。
例 3: 現在の日付から 1 か月後の日付で、28 日に終わる月を問合わせる
次の文は'1999-03-31'を戻すものと期待されますが、そうなりません。
SELECT ADD_MONTHS ('1999-02-28' , 1);
ADD_MONTHS は結果として 1999-03-28 を戻します。
SQL 関数、演算子、式および述部
779
第 15 章 日時および間隔の関数と式
OADD_MONTHS
例 4: 現在の日付から 1 か月後の日付で、30 日に終わる月を問合わせる
次の文は'1999-03-31'を戻すものと期待されますが、そうなりません。
SELECT ADD_MONTHS ('1999-04-30' , -1);
ADD_MONTHS は結果として 1999-03-30 を戻します。
例 5: 現在の日付から 1 か月後の日付で、30 日に終わる月を問合わせる
次の文から'1999-05-31'が返されるものと考えられますが、結果は異なります。
SELECT ADD_MONTHS ('1999-04-30' , 1);
ADD_MONTHS は結果として 1999-05-30 を戻します。
関連トピック
詳細は、以下を参照してください。
• この動作の例については、「例 2: 直感的には理解できない例」に示す一連の例を
参照してください。
• 詳細については、<データ ディクショナリ 、B035-1092>の「CALENDAR ビュー」
を参照してください。
• UDT の暗黙的な型の変換の詳細については、「暗黙的な型の変換」を参照してく
ださい。
• 詳細については、<ユーティリティ 、B035-1102>を参照してください。
OADD_MONTHS
目的
指定された date_timestamp_value を指定された num_months に追加し、結果の日
付を返します。
構文
OADD_MONTHS
( date_timestamp_value, num_months )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_timestamp_value
日付またはタイムスタンプの引数。
780
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
OADD_MONTHS
この構文要素が NULL の場合、NULL が返されます。
num_months
数値式。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
OADD_MONTHS は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• date_timestamp_value = DATE、TIMESTAMP、または TIMESTAMP WITH TIME
ZONE
• num_months = INTEGER
num_months 引数では、UDF に適用される暗黙のデータ型変換規則を使用して
INTEGER に変換できるデータ型の値も渡すことができます。date_timestamp_value
引数については、暗黙の型変換はサポートされていません。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング 、B035-1147>の「互換デー
タ型」を参照してください。
TIMESTAMP 値は、UTC 時間でデータベースに格納されるためタイムゾーンが欠け
ています。そのため、この関数内ではタイム スタンプ値の解釈にセッションのタイ
ムゾーンを使用します。TIMESTAMP WITH TIME ZONE 値の場合、この関数内では
タイム スタンプ値の解釈にタイムゾーン構成要素を使用します。
date_timestamp_value の日付構成要素がその月の最終日の場合や、結果の月が
date_timestamp_value の日付構成要素よりも少ない日数になる場合、
OADD_MONTHS は結果としての月の最終日を返します。それ以外の場合、
OADD_MONTHS は date_timestamp_value として同じ日付構成要素を持つ値を返し
ます。
OADD_MONTHS と ADD_MONTHS の相違点は、OADD_MONTHS で月の最終日に月
を追加すると、この関数が常に月の最終日を返すことです。次の問合わせは、
ADD_MONTHS と OADD_MONTHS の相違点を説明するものです。
• 問合わせ
SQL 関数、演算子、式および述部
781
第 15 章 日時および間隔の関数と式
OADD_MONTHS
SELECT ADD_MONTHS ('2008-02-29', 1);
は'08/03/29'を返します。
• 問合わせ
SELECT OADD_MONTHS ('2008-02-29', 1);
は'08/03/31'を返します。
結果のタイプ
OADD_MONTHS は戻りデータ タイプが DATE のスカラー関数です。
例
例: 指定した日に 1 か月追加する
以下の問合わせを実行します。
SELECT OADD_MONTHS (DATE '2008-02-15', 1);
これは、結果として 08/03/15 を返します。
例: 指定した日に 2 か月追加する
以下の問合わせを実行します。
SELECT OADD_MONTHS (DATE '2008-02-20', 2);
これは、結果として 08/04/20 を返します。
例 3: 月が 29 日に終わる場合、指定した日に 1 か月追加する
以下の問合わせを実行します。
SELECT OADD_MONTHS (DATE '2008-02-29', 1);
これは、結果として 08/03/31 を返します。
29 日は 2 月の最終日になるため、3 月 31 日が返されます。これは、31 日が 3 月の
最終日になるためです。
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
782
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
TRUNC(Date)
TRUNC(Date)
目的
fmt で指定した単位になるように日付の時間部分を切り捨てた date_value を返しま
す。
構文
TRUNC
( date_value
TD_SYSFNLIB.
)
, fmt
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_value
数値またはタイムスタンプの引数。
fmt
文字式。
この構文要素が NULL の場合、NULL が返されます。
fmt が省略されると、date_value は最近接の日付になるように切り捨てられます。
日曜日が週の最初の曜日と見なされます。ISO 年の場合、月曜日が最初の曜日と見
なされます。
この構文要素が無効な場合、エラーが返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
TRUNC(DATE)は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
• date_value = DATE、TIMESTAMP、または TIMESTAMP WITH TIME ZONE
• fmt = VARCHAR CHARACTER SET LATIN
SQL 関数、演算子、式および述部
783
第 15 章 日時および間隔の関数と式
TRUNC(Date)
fmt 引数では、UDF に適用される暗黙のデータ型変換規則を使用して VARCHAR に
変換できるデータ型の値も渡すことができます。date_value 引数については、暗黙
の型変換はサポートされていません。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
TRUNC の日付書式
784
構成要素
説明
CC
SCC
4 桁表現の年の最初の 2 桁が 1 だけ大きくな
る年
SYYY
YYYY
YEAR
SYEAR
YYY
YY
Y
年(7 月 1 日で切り上げ)
IYYY
IYY
IY
I
ISO 年
MONTH
MON
MM
RM
月(16 日目で切り上げ)
Q
四半期(その四半期の 2 番目の月の 16 日目で
切り上げ)
WW
年の最初の日と同じ曜日
IW
ISO 年の最初の日と同じ曜日
W
月の最初の日と同じ曜日
DDD
DD
J
日
DAY
DY
D
最初の曜日
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
ROUND(Date)
構成要素
説明
HH
HH12
HH24
時間
MI
分
結果のタイプ
TRUNC は戻りデータ タイプが DATE のスカラー関数です。
例
例: 週の最初の曜日の日付値を返す
以下の問合わせを実行します。
SELECT TRUNC(CAST('2003/09/17' AS DATE), 'D') (FORMAT 'yyyy-mm-dd');
結果 2003-09-14 を戻します。日付がその週の最初の曜日になるように切り捨てら
れます。
例: 月の最初の日の日付値を返す
以下の問合わせを実行します。
SELECT TRUNC(CAST('2003/09/17' AS DATE), 'RM') (FORMAT 'yyyy-mm-dd');
結果 2003-09-01 を戻します。日付が月の最初になるように切り捨てられます。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
ROUND(Date)
目的
fmt で指定した単位になるように日付の時間部分を丸めた date_value を返します。
SQL 関数、演算子、式および述部
785
第 15 章 日時および間隔の関数と式
ROUND(Date)
構文
ROUND
( date_value
TD_SYSFNLIB.
)
, fmt
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
date_value
数値またはタイムスタンプの引数。
fmt
文字式。
この構文要素が NULL の場合、NULL が返されます。
fmt が省略されると、 date_value は最近接の日付になるように丸められます。日曜
日が週の最初の曜日と見なされます。ISO 年の場合、月曜日が最初の曜日と見なさ
れます。
この構文要素が無効な場合、エラーが返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
ROUND(Date)は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
• date_value = DATE、TIMESTAMP、または TIMESTAMP WITH TIME ZONE
• fmt = VARCHAR CHARACTER SET LATIN
fmt 引数では、UDF に適用される暗黙のデータ型変換規則を使用して VARCHAR に
変換できるデータ型の値も渡すことができます。date_value 引数については、暗黙
の型変換はサポートされていません。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
786
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
EXTRACT
結果のタイプ
ROUND は戻りデータ タイプが DATE のスカラー関数です。
例
例: 日付を週最初の曜日に丸める
以下の問合わせを実行します。
SELECT ROUND(CAST('2003/09/17' AS DATE), 'D') (FORMAT 'yyyy-mm-dd');
結果 2003-09-14 を戻します。日付がその週の最初の曜日になるように丸められます。
例: 日付を翌月最初の日に丸める
以下の問合わせを実行します。
SELECT ROUND(CAST('2003/09/17' AS DATE), 'RM') (FORMAT 'yyyy-mm-dd');
結果 2003-10-01 を戻します。日付が 16 以上になるため、この日付は次の月の最
初に丸められます。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
• ROUND(日付)の日付フォーマットについては、「TRUNC(日付)」を参照してくだ
さい。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
EXTRACT
目的
日時または間隔値から指定のフル ANSI SQL:2011 フィールドを 1 つ抽出し、正確
な数値に変換します。
SQL 関数、演算子、式および述部
787
第 15 章 日時および間隔の関数と式
EXTRACT
構文
EXTRACT
(
YEAR
FROM
value )
MONTH
DAY
HOUR
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
構文要素
YEAR
YEAR の整数値は、value で示された日付から抽出されます。
MONTH
MONTH の整数値は、value で示された日付から抽出されます。
DAY
DAY の整数値は、value で示された日付から抽出されます。
HOUR
HOUR の整数値は、value で示された日付から抽出されます。
MINUTE
MINUTE の整数値は、value で示された日付から抽出されます。
TIMEZONE_HOUR
TIMEZONE_HOUR の整数値は、value で示された日付から抽出されます。
TIMEZONE_MINUTE
TIMEZONE_MINUTE の整数値は、value で示された日付から抽出されます。
SECOND
SECOND の整数値は、value で示された日付から抽出されます。返される値のデータ
型は、DECIMAL(8,2)です。
value
結果が DateTime、Interval、または UDT 値になる式。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
788
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
EXTRACT
ANSI SQL:2011 EXTRACT では、日時または間隔の値に含まれるすべてのフィール
ドを抽出できます。ANSI SQL:2011 EXTRACT 関数に加えて、Teradata SQL では浮
動小数点値から抽出した HOUR、MINUTE、または SECOND もサポートしています。
引数
value が次の場合:
結果
日付を表わす文字列式
'YYYY-MM-DD' 形式に合致する列。
時間を表わす文字列式
'HH:MI:SS.SSSSSS' 形式に合致する列。
浮動小数点タイプ
value は HOUR * 10000 + MINUTE * 100 + SECOND というア
ルゴリズムでエンコードされた時間値でなければなりません。
浮動小数点値から抽出できるのは、HOUR、MINUTE、および
SECOND だけです。
外部的に作成された時間値は、適切にエンコードされ、REAL
列に格納されます。そしてその時間値は、エンコーディング
によって精度を低下させずに REAL で表現可能な値が作成さ
れていれば、希望する精度で格納されます。
時間値を REAL として新しいアプリケーションに格納しない
でください。その代わりに、より厳密に定義された ANSI SQL:
2011 日時データ タイプを使用してください。
UDT
UDT と以下のいずれかの事前定義タイプの間でキャストを行
なう暗黙 CAST が UDT になければなりません。
• 数値
• 文字
• 日時
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用
し、AS ASSIGNMENT 節を指定します。CREATE CAST の詳細
は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
EXTRACT を含め、システム演算子および関数用の UDT の暗
黙の型変換は、ANSI SQL 規格の Teradata 拡張機能です。こ
の拡張を無効にするには、DBS 制御レコードの
DisableUDTImplCastForSysFuncOp フィールドを TRUE に設
定します。詳細は、<ユーティリティ 、B035-1102>を参照し
てください。
UDT の暗黙的な型の変換の詳細については、「暗黙的な型の
変換」を参照してください。
SQL 関数、演算子、式および述部
789
第 15 章 日時および間隔の関数と式
EXTRACT
value が次の場合:
結果
文字列式または浮動小数点 式は日時または間隔タイプに評価されなければなりません。
タイプまたは UDT ではない
場合
結果
EXTRACT は、ANSI SQL:2011 日時値の正確な数値を戻します。
引数のデータ タイプが TIME または TIMESTAMP の場合、EXTRACT は、適切なタ
イムゾーンに調整された値を返します。
引数にタイムゾーンが指定されない場合は、現在のセッションのタイムゾーンに基
づくタイムゾーン変位が使用されます。それ以外の場合は、引数の明示的なタイム
ゾーンが使用されます。AT 句を使用すると、タイムゾーンに引数を、明示的に指定
できます。詳細については、ANSI の日時式を参照してください。
SECOND を抽出する場合、value に含まれる秒の小数点以下桁数がゼロであると、結
果は INTEGER になります。value に含まれる秒の小数点以下桁数がゼロよりも大き
いと、結果は DECIMAL になり、その位取りはデータ記述の SECOND フィールドで
の指定に従います。
それ以外のものを抽出した場合、結果は精度が 32 ビットの INTEGER になります。
抽出の対象
結果
SECOND
value に含まれる秒の小数点以下桁数:
• ゼロである場合、結果は INTEGER になります。
• ゼロよりも大きい場合、結果は DECIMAL になり、その位取りはデー
タ記述の SECOND フィールドでの指定に従います。
その他
結果は、精度が 32 ビットの INTEGER。
value が NULL の場合、結果は NULL になります。
例
例 1: 現在の日付から年を返す
次の例は、現在の日付から年を整数として戻します。
SELECT EXTRACT (YEAR FROM CURRENT_DATE);
例 2: 購入日に 90 日を追加する
PurchaseDate が DATE フィールドであると想定すると、この例は、整数の
PurchaseDate に 90 日を加算することによって形成される 日付値の月を戻します。
SELECT EXTRACT (MONTH FROM PurchaseDate+90) FROM SalesTable;
790
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
例 3: 整数を返す
次の例は、整数の 12 を戻します。
SELECT EXTRACT (DAY FROM '1996-12-12');
例 4: 文字リテラルの結果が有効な日付にならない場合
この例では、文字定数が有効な日付に評価されないため、エラーが戻されます。
SELECT EXTRACT (DAY FROM '1996-02-30');
例 5: 文字列リテラルが ANSI SQL:2011 の日付形式に一致しない場合
以下の例では、文字列定数が ANSI SQL:2011 の日付形式に合致しないため、エラー
が戻されます。
SELECT EXTRACT (DAY FROM '96-02-15');
EXTRACT への引数が DATE タイプの値の場合、含まれる値は確実に有効な日付とな
り、EXTRACT はエラーを戻すことができません。
例 6: 非 ANSI DateTime の定義
次の例は、非 ANSI 日時定義に関連しています。引数が時間値として書式化された
文字定数の場合には、この引数は REAL に変換されて処理されます。この例では、
59 が戻されます。
SELECT EXTRACT (MINUTE FROM '23:59:17.3');
例 7: 現在の時刻から時間を返す
この例は、現在時刻から時間値を整数として戻します。
SELECT EXTRACT (HOUR FROM CURRENT_TIME);
現在時刻は、指示された精度でシステム値 TIME として検索されます。
例 8: 秒を DECIMAL として返す
次の例では、DECIMAL(8,2)の形で秒が戻されます。これは、CURRENT_TIME の秒
の小数点以下の桁数 2 に基づいています。
SELECT EXTRACT (SECOND FROM CURRENT_TIME (2));
GetTimeZoneDisplacement
目的
指定したタイムゾーン文字列の規則とタイムゾーン変位情報を返します。
構文
GetTimeZoneDisplacement
SQL 関数、演算子、式および述部
(time_zone_string)
791
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
構文要素
time_zone_string
VARBYTE データ型を使用して指定した、有効なタイムゾーン文字列。Teradata でサ
ポートされるタイムゾーン文字列のリストは、AT LOCAL および AT TIME ZONE タ
イムゾーン指定子を参照してください。
time_zone_string が有効でない、あるいはサポートされていない場合、
GetTimeZoneDisplacement は先頭バイトに値 1 を返して、タイムゾーン文字列が存
在しないことを示します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果
GetTimeZoneDisplacement は、指定したタイムゾーン文字列の規則とタイムゾーン
変位情報を格納する BYTE の列を返します。結果のデータ タイプは BYTE です。返
される情報は、次のとおりです。
バイト
値
先頭バイト
• タイムゾーン文字列が見つからない場合は、1。これは、入力引数で指
定されたタイムゾーン文字列が有効でないか、サポートされていないこ
とを意味します。
• タイムゾーン文字列が見つかった場合は、0。
第 2 バイト
• タイムゾーン文字列に、独自の夏時間と、協定世界時(UTC 時間)からの
標準タイムゾーン変位情報が含まれている場合は、1。
この場合、後続の約 480 バイトには、有効な標準タイムゾーン変位、
夏時間のタイムゾーン変位、および夏時間の開始時期と終了時期を記述
する規則一式が格納されています。各タイムゾーン文字列に格納される
規則の数は、最大で 6 つです。
• タイムゾーン文字列に、独自の夏時間と、UTC 時間からの標準タイム
ゾーン変位情報が含まれていない場合は、0。
この場合、後続の 4 バイトには、タイムゾーン変位の時間および分の情
報が格納されています。
使用上の注意
GetTimeZoneDisplacement は、システム ユーザー定義関数(UDF)です。Teradata
Database は、この UDF を内部的に呼び出して、SQL 文やデータ形式指定(SDF)ファ
イルで指定されたタイムゾーン文字列を解決します。この関数を直接呼び出しては
いけません。ただし、新しいタイムゾーン文字列を追加する場合や、既存のタイム
792
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
ゾーン文字列の規則を追加または変更する場合には、この UDF に変更を加えてもか
まいません。
タイムゾーン文字列の使用に関する制限
Teradata Database システム標準のタイムゾーン文字列を使用する場合 、1986 年以
前の年には、夏時間(DST)へのシフトなどのタイムゾーンの規則が適用されません。
Teradata Database 標準タイムゾーン文字列の有効な年は、1987 年から 9999 年ま
でです。
Teradata Database 標準のタイムゾーン文字列では要件を満たせないときには、新た
にカスタマイズしたタイムゾーン文字列を追加するか 、既存の文字列に変更を加え
てください。そのためには、GetTimeZoneDisplacement に変更を加えるか、新しい
規則を追加することになります。
注: DST に準拠したロケールのタイムゾーン文字列を使用したものの、タイムゾー
ン オフセット値が時間値に含まれない場合、Teradata Database はあいまいな時間
内の時間値を DST として解釈して処理するべきか、または標準時間として解釈して
処理するべきかを判別できません。このような場合、DisplacementOnOverlap の
DBS 制御設定値によって、Teradata Database がこれらの時間を DST タイムゾーン
オフセットと見なすか、標準タイムゾーン オフセットと見なすかが決定されます。
この問題が発生するのは、DST ロケールにタイムゾーン文字列を使用するとき、時
間値にタイムゾーン オフセット値が含まれていないとき、および
TimeDateWZControl の DBS 制御設定が 3 に設定されているとき(タイムゾーン オフ
セット情報のない日付と時刻値は、システム ローカル タイムを使用して格納され
ます)に限られます。
DisplacementOnOverlap TimeDateWZControl の詳細については、<ユーティリティ、
B035-1102>の DBS 制御に関する章を参照してください。
タイムゾーン文字列の追加または修正
Teradata Database には、一般的に使用できるタイムゾーンを表現する、タイムゾー
ン文字列一式が用意されています。サポートされているタイムゾーン文字列のリス
トについては、「AT LOCAL および AT TIME ZONE タイムゾーン指定子」を参照し
てください。GetTimeZoneDisplacement UDF は、UTC とローカル タイムゾーン間
の変換を実行するために、上記のタイムゾーン文字列と、それらに関連する規則を
格納して保守します。
用意されているタイムゾーン文字列では要件が満たされない場合には、SYSLIB デー
タベースに格納されている GetTimeZoneDisplacement UDF に変更を加えて、タイ
ムゾーン文字列を追加または変更してください。UDF のソース コードは、DBS パッ
ケージの一部として入手できます。このソース コードは、/tdbms/etc/dem/src に
格納されています。
新しいタイムゾーン文字列を定義する場合や、既存のタイムゾーン文字列を追加ま
たは変更する場合には、次の手順を実行します。
SQL 関数、演算子、式および述部
793
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
1 既存の GetTimeZoneDisplacement UDF のバックアップ コピーを作成します。
#
#
#
#
cd /home
mkdir workdir
cd workdir
cp /tdbms/etc/dem/src/udfgettimezonedisplacement.c .
2 既存のタイムゾーン文字列を修正するには、次の手順を実行します。
注: tdlocaledef_tzrules.txt に提供されている既存のタイムゾーン設定のルール変
更については、Teradata カスタマー サポート サービスにお問合わせください。
# cd /opt/teradata/tdat/tdbms/xx.xx.xx.xx/etc
# vi tdlocaledef_tzrules.txt
TimeZoneString {"America Eastern"; "-5"; "0"; "2";
"4"; "4"; "1"; "0"; "0"; "02:00:00";
"3"; "10"; "0"; "0"; "-1"; "02:00:00";
"1987"; "2006"; "-5"; "0"; "-4"; "0";
"4"; "3"; "8"; "0"; "0"; "02:00:00";
"4"; "11"; "1"; "0"; "0"; "02:00:00";
"2007"; "9999"; "-5"; "0"; "-4"; "0"}
a GetTimeZoneDisplacement UDF の TZ_DST 構造体の中から、タイムゾーン文
字列のエントリを見つけます。例:
{"America Eastern", 2,
{{{4, 4, 1, 0, 0, "02:00:00"},
{3, 10, 0, 0, -1, "02:00:00"},
{1987, 2006, -5, 0, -4, 0}},
{{4, 3, 8, 0, 0, "02:00:00"},
{4, 11, 1, 0, 0, "02:00:00"},
{2007, 9999, -5, 0, -4, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}}
},
794
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
-5, 0
},
注: tdlocaledef_tzrules.txt および udfgettimezonedisplacement.c のタイムゾー
ン文字列に基づくルールは、異なるフォーマットでリストされます。
tdlocaledef を実行してシステムにタイムゾーン文字列を設定するには 、
tdlocaledef_tzrules.txt のフォーマットが使用されます。
b このタイムゾーン文字列のエントリに関連付けられた規則と情報に変更を加
えるか、そのエントリに新しい規則を追加します。
3 新しいタイムゾーン文字列を追加するには、次の手順を実行します。
a 新しいタイムゾーン文字列とそれに関連する規則を追加するために、TZ_DST
構造体の中に新しいエントリを作成します。
注: tdlocaledef_tzrules.txt および udfgettimezonedisplacement.c のタイムゾー
ン文字列に基づくルールは、異なるフォーマットでリストされます。
tdlocaledef を実行してシステムにタイムゾーン文字列を設定するには 、
tdlocaledef_tzrules.txt のフォーマットが使用されます。
b 新しいタイムゾーン文字列のエントリを、TZ_DST 構造体内でのアルファベッ
ト順が保たれる位置に配置します。
c udfgettimezonedisplacement.c の MAX_DST_ENTRIES は、既存のタイムゾー
ン文字列に一致する必要があります。新しいタイムゾーン文字列を 1 つ追加
すると、1 つ増えます。
4 REPLACE FUNCTION 文を使用して、この UDF を再コンパイルします。詳細は、
<SQL データ定義言語 - 構文規則および例、B035-1144>の「CREATE
FUNCTION(外部形式)/REPLACE FUNCTION(外部形式)」を参照してください。
注: 必ず DBC としてログインし、他のユーザーにはログオンさせないでください。
例:
Database SYSLIB;
DROP FUNCTION GetTimeZoneDisplacement;
REPLACE FUNCTION GetTimeZoneDisplacement
(tzstringinfo VARBYTE(130))
RETURNS BYTE(340)
LANGUAGE C
NO SQL
PARAMETER STYLE SQL
EXTERNAL NAME 'CS!GetTimeZoneDisplacement!/home/workdir/
udfgettimezonedisplacement.c' ;
5 新しいタイムゾーン文字列をテストします。
.os date
.os date -u
SQL 関数、演算子、式および述部
795
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
SELECT CURRENT_TIMESTAMP AS SYSTEMTIME,
CURRENT_TIMESTAMP AT 'new_time_zone_string';
TZ_DST 構造体
TZ_DST 構造体は、TZwithDST 構成要素の配列です。これらの各構成要素では、タ
イムゾーン文字列とそれに関連する規則を記述します。TZwithDST 構造体の定義は、
次のとおりです。
typedef struct TZwithDST
{
CHARACTER_LATIN tzstring[TZSTRINGSIZE];
int
number_of_rules;
DSTRules
TZRules[TZRulesEntries];
SMALLINT
Standardtzdispl_hour;
SMALLINT
Standardtzdispl_minute;
} TZwithDST;
説明:
フィールド
説明
tzstring
タイムゾーン文字列の名前。たとえば、"America Pacific"。
タイムゾーン文字列の最大長は 130 バイトです。
number_of_rules
このタイムゾーン文字列に関連する規則の数。各タイムゾー
ン文字列には、最大 6 つの規則が許可されています。
TZRules
規則を記述する各 DSTRules 構成要素の配列です。これらの
規則は、タイムゾーン文字列のタイムゾーン変位を計算する
ために使用されます。
Standardtzdispl_hour
標準タイムゾーン変位の時間です。
Standardtzdispl_minute
標準タイムゾーン変位の分です。
TZRules 配列の各 DSTRules 構成要素では、タイムゾーン文字列の規則を記述しま
す。DSTRules 構造体の定義を示します。
typedef struct DSTRules
{
startendDSTInfo startDST;
startendDSTInfo endDST;
yearDisplInfo
validyrs;
} DSTRules;
説明:
796
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
フィールド
説明
startDST
夏時間(DST)を開始する日付と時間を指定します。
endDST
夏時間(DST)を終了する日付と時間を指定します。
validyrs
DST の開始日と終了日を適用する年を指定します。この年範囲に関連する
情報には、以下の項目があります。
• start_year - この DST 規則を開始する年。
• end_year - この DST 規則を終了する年。
• Standardtzdispl_hour - 標準タイムゾーン変位の時間。
• Standardtzdispl_minute - 標準タイムゾーン変位の分。
• DSTtzdispl_hour - 夏時間用のタイムゾーン変位の時間。
• DSTtzdispl_minute - 夏時間用のタイムゾーン変位の分。
startDST と endDST には、以下の項目を設定できます。該当しないフィールドに
は、0 を入力してください。
フィールド
rule_type
説明
DST の開始日と終了日の指定方法を示します。有効な値は次のとおりです。
• 0 - DST の開始または終了情報は指定されていない。標準タイムゾーン
変位が使用されます。
• 1 - DST は特定の固定日に開始または終了する。この日付は、month
および day_of_month フィールドで指定します。
• 2 - DST は、month、day_of_week および week_of_month フィールド
で示される、月の第 1 週、第 2 週または第 3 週に開始または終了する。
• 3 - DST は、month、day_of_week および week_of_month フィールド
で示される、月の最後の週日の 2 週前の週日、3 週前の週日、月の最
後の週日に開始または終了する。
• 4 - DST は、day_of_month フィールドで指定された日付の次の週日ま
たは直後の日に、開始または終了する。月と週日は month および
day_of_week フィールドで指定します。
たとえば、タイムゾーン文字列 が'America Pacific'の場合、開始日の
規則は 3 月 8 日より後の最初の日曜日になります。2010 年の場合な
らば、3 月 14 日になります。
month
DST を開始または終了する月。有効な値は 0~12 です。このフィールド
は、rule_type 1、2、3 および 4 で使用します。
たとえば、タイムゾーン文字列'America Pacific'の場合、開始日の規則は
3 月 8 日の後の最初の日曜日なので、startDST 構造体のこのフィールド
の値は、3 月を表現する 3 になります。
SQL 関数、演算子、式および述部
797
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
フィールド
説明
day_of_month
rule_type が 1 の場合、このフィールドには DST を開始または終了する月
の日付を指定します。例えば、DST が、ローカル タイムで 8 月 21 日の
午前 12:00 に終了する場合、endDST 構造体のこのフィールドには値 21
が格納されます。
rule_type が 4 の場合、このフィールドで指定した日付の次の週日または
直後の日に、DST を開始または終了します。たとえば、タイムゾーン文
字列'America Pacific'の場合、開始日の規則は 3 月 8 日の後の最初の日曜
日なので、startDST 構造体のこのフィールドには値 8 が格納されます。
rule_type が 0、2 または 3 の場合、このフィールドは使用されず、値は
0 になります。
day_of_week
有効な値は 0~7 です。それぞれで日曜日から土曜日を表わします。この
フィールドは、rule_type 2、3 および 4 で使用します。
たとえば、タイムゾーン文字列'America Pacific'の場合、開始日の規則は
3 月 8 日の後の最初の日曜日なので、startDST 構造体のこのフィールド
の値は、日曜日を表現する 0 になります。
week_of_month 有効な値は、1、2、3、4、5、-1 および-2 です。それぞれ、最初の週日、
2 番目の週日、3 番目の週日、4 番目の週日、5 番目の週日、最後の週
日、および最後から 2 つ前の週日を表現しています。このフィールドは、
rule_type 2 および 3 で使用します。
たとえば、タイムゾーン文字列'Europe Azores'の場合、開始日の規則は、
3 月の最終日曜日になるので、startDST 構造体のこのフィールドの値は、
月の最後の週を表現する-1 になります。
loctime
DST を開始または終了するローカル タイムです。
たとえば、"02:00:00"は、ローカル タイムの午前 2:00 に DST を開始ま
たは終了すること示します。
例: 新しいタイムゾーン文字列の追加
たとえば、1 つの規則と以下のタイムゾーン変位情報を含む、新しいタイムゾーン
文字列'Europe Azores'を追加すると仮定します。
•
•
•
•
•
•
3 月の最終日曜日、ローカル タイムの午前 12:00 に DTS を開始する。
10 月の最終日曜日、ローカル タイムの午前 1:00 に DTS を開始する。
標準タイムゾーンの UTC からのオフセットは、-1 時間。
夏時間の UTC からのオフセットは、0 時間。
この規則の開始年は、2009 年。
この規則の終了年は、2010 年。
この情報を基にすると、新しいタイムゾーン文字列'Europe Azores'のエントリは、
次のようになります。
798
SQL 関数、演算子、式および述部
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
{"Europe Azores", 1,
'Europe Azores'
{{{3, 3, 0, 0, -1, "00:00:00"},
startDST information
{3, 10, 0, 0, -1, "01:00:00"},
{2009, 2010, -1, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}},
{{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, "00:00:00"},
{0, 0, 0, 0, 0, 0}}
},
-1, 0
displacement
},
<= 1 rule defined for
<= Start of rule 1,
<= endDST information
<= validyrs information
<= Start of rule 2
<= Start of rule 3
<= Start of rule 4
<= Start of rule 5
<= Start of rule 6
<= Standard time zone
タイムゾーン文字列のエントリには、6 つ分の規則のスペースがありますが、この
例では、開始年の 2009 年と終了年の 2010 年用に 1 つの規則を使用しているだけ
です。
新しい'Europe Azores'タイムゾーン文字列は、構造体のアルファベット順が保たれ
るように、TZ_DST 構造体内の'Australia Western'と'Europe Central'タイムゾーン文
字列の間に配置する必要があります。
関連トピック
詳細情報
参照先
セッションのタイムゾーンの設定につ
いて
<SQL データ定義言語 - 構文規則および例、
B035-1144>の「SET TIME ZONE」、「CREATE
USER」、「MODIFY USER」。
システムのタイムゾーンの設定につ
いて
<ユーティリティ>の「System TimeZone Hour」お
よび「System TimeZone Minute」。
SQL 関数、演算子、式および述部
799
第 15 章 日時および間隔の関数と式
GetTimeZoneDisplacement
詳細情報
参照先
夏時間を考慮に入れたシステム時間の <ユーティリティ >の「SDF ファイル」および
自動調整
「Teradata Locale Definition ユーティリティ
(tdlocaledef)」。
800
SQL 関数、演算子、式および述部
第 16 章
エクスポート幅プロシージャ
概要
この章では、次の用途に使用するストアド プロシージャについて説明します。
• 新しいユーザー定義のエクスポート幅定義の作成
• 既存のユーザー定義のエクスポート幅定義の変更
• ユーザー定義のエクスポート幅定義の削除
エクスポート幅について
エクスポート幅を適切に設定していないと、Teradata Database がエクスポートする
文字数やバイト数が、それを受信するクライアント アプリケーションが期待する文
字数やバイト数を超過することや、期待する文字数やバイト数に満たないことがあ
ります。エクスポート幅は、システムが Teradata クライアントに返す結果セット行
の各文字フィールドに、どれだけ領域を予約するかを定義します。
DBS 制御フィールドのエクスポート幅テーブル ID を設定すると、クライアントに
結果セットを返す際にシステムが使用する 、デフォルトのエスポート幅を定義でき
ます。詳細は、<ユーティリティ 、B035-1102>の「DBS 制御(dbscontrol)」を参照
してください。
CREATE USER 文または MODIFY USER 文で EXPORTWIDTH オプションを使用し
て、システムレベルのエクスポート幅を上書きできます 。EXPORTWIDTH オプショ
ンは、次の値を受け入れます。
エクスポート定義名
説明
'Expected'
文字データ タイプとクライアント使用形式に対して妥当なデフォ
ルトの幅を提供します。
'Compatibility'
Latin または KANJI1 のデータを処理するために記述されるアプ
リケーションによる処理を行なうために、Unicode データを有効
にします。
'Maximum'
文字データ タイプとクライアント使用形式に対して最大のデフォ
ルト幅を提供します。
'user-defined name '
文字データ タイプとクライアント使用形式に対して、ユーザー
定義のデフォルトの幅を提供します。
SQL 関数、演算子、式および述部
801
第 16 章 エクスポート幅プロシージャ
エクスポート幅について
エクスポート定義名
説明
DEFAULT
DBS 制御フィールド「エクスポート幅テーブル ID」の設定を使
用します。
次の用途に ReplaceExportDefinition ストアド プロシージャを使用できます。
• 新しいユーザー定義のエクスポート定義名と、それに関連付けられたエクスポー
ト幅ルールの作成。
• 既存のユーザー定義のエクスポート定義名に関連付けられた、エクスポート幅
ルールの更新。
RemoveExportDefinition ストアド プロシージャを使用すると、ユーザー定義のエク
スポート定義名と、それに関連付けられたエクスポート幅ルールを削除できます。
関連情報
参照先
エクスポート幅と、ユーザー定義のエクス
ポート幅定義の作成
<国際文字セットのサポート、B035-1125>。
ユーザー レベルのエクスポート幅設定の指定 <SQL データ定義言語 - 構文規則および例、
B035-1144>の「CREATE USER」または
「MODIFY USER」。
エクスポート幅のシステム デフォルトの設定 <ユーティリティ、B035-1102>の「DBS 制御
(dbscontrol)」。
エクスポート幅について
エクスポート幅を適切に設定していないと、Teradata Database がエクスポートする
文字数やバイト数が、それを受信するクライアント アプリケーションが期待する文
字数やバイト数を超過することや、期待する文字数やバイト数に満たないことがあ
ります。エクスポート幅は、システムが Teradata クライアントに返す結果セット行
の各文字フィールドに、どれだけ領域を予約するかを定義します。
DBS 制御フィールドのエクスポート幅テーブル ID を設定すると、クライアントに結
果セットを返す際にシステムが使用する 、デフォルトのエスポート幅を定義できま
す。詳細は、<ユーティリティ 、B035-1102>の「DBS 制御(dbscontrol)」を参照して
ください。
CREATE USER 文または MODIFY USER 文で EXPORTWIDTH オプションを使用して、
システムレベルのエクスポート幅を上書きできます 。EXPORTWIDTH オプション
は、次の値を受け入れます。
802
エクスポート定義名
説明
'Expected'
文字データ タイプとクライアント使用形式に対して妥当なデフォ
ルトの幅を提供します。
SQL 関数、演算子、式および述部
第 16 章 エクスポート幅プロシージャ
ReplaceExportDefinition
エクスポート定義名
説明
'Compatibility'
Latin または KANJI1 のデータを処理するために記述されるアプ
リケーションによる処理を行なうために、Unicode データを有効
にします。
'Maximum'
文字データ タイプとクライアント使用形式に対して最大のデフォ
ルト幅を提供します。
'user-defined name'
文字データ タイプとクライアント使用形式に対して、ユーザー
定義のデフォルトの幅を提供します。
DEFAULT
DBS 制御フィールド「エクスポート幅テーブル ID」の設定を使
用します。
次の用途に ReplaceExportDefinition ストアド プロシージャを使用できます。
• 新しいユーザー定義のエクスポート定義名と、それに関連付けられたエクスポー
ト幅ルールの作成。
• 既存のユーザー定義のエクスポート定義名に関連付けられた、エクスポート幅
ルールの更新。
RemoveExportDefinition ストアド プロシージャを使用すると、ユーザー定義のエク
スポート定義名と、それに関連付けられたエクスポート幅ルールを削除できます。
関連情報
参照先
エクスポート幅と、ユーザー定義のエクス
ポート幅定義の作成
<国際文字セットのサポート、B035-1125>。
ユーザー レベルのエクスポート幅設定の指定 <SQL データ定義言語 - 構文規則および例、
B035-1144>の「CREATE USER」または
「MODIFY USER」。
エクスポート幅のシステム デフォルトの設定 <ユーティリティ、B035-1102>の「DBS 制御
(dbscontrol)」。
ReplaceExportDefinition
目的
ユーザー定義のエクスポート幅定義の作成または変更
構文
CALL
ReplaceExportDefinition
A
( 'export_definition_name ',
SYSLIB.
A
'export_width_rule_set ' , result_message )
;
SQL 関数、演算子、式および述部
803
第 16 章 エクスポート幅プロシージャ
ReplaceExportDefinition
構文要素
SYSLIB
関数が格納されているデータベースの名前。
export_definition_name
ユーザー定義のエクスポート定義名。
'Expected'、'Compatibility'、または'Maximum'を指定することはできません。
export_width_rule_set
40 個の 16 進数数字を含む、ユーザー定義の BYTE 文字列。export_definition_name.
に付随するエクスポート幅ルールの定義に使用します。
result_message
ストアド プロシージャの出力メッセージ。
許可
このストアド プロシージャまたは SYSLIB データベースに対する EXECUTE 権限が必
要です。
引数のタイプ
このプロシージャに渡された式は、次のデータ タイプを持っている必要があります。
• export_definition_name = VARCHAR(n) CHARACTER SET LATIN (n の最大値は 30)
• export_width_rule_set = BYTE(20)
• result_message = VARCHAR(310) CHARACTER SET UNICODE
Teradata Database の暗黙のデータ型変換規則を使用して、上記の型に変換できる
データ型の引数も渡すことができます。
使用上の注意
新しいユーザー定義のエクスポート幅定義を作成するには、次の引数を指定して
ReplaceExportDefinition ストアド プロシージャを呼び出します。
• export_definition_name は、新しいエクスポート幅定義の名前を指定するための
Latin 文字列です。
• export_width_rule_set は、40 個の 16 進数数字を含む BYTE 文字列です。これに
より、エクスポート幅ルールを、新しいエクスポート幅定義用にエンコードしま
す。エクスポート幅ルールの詳細については、「エクスポート幅ルール」を参照
してください。
• result_message は、このストアド プロシージャの出力メッセージを格納する出力
パラメータです。
804
SQL 関数、演算子、式および述部
第 16 章 エクスポート幅プロシージャ
ReplaceExportDefinition
ReplaceExportDefinition は、指定されたルールで新しいエクスポート幅定義を作成
し、DBC.ExportWidth テーブルを更新します。
既存のユーザー定義のエクスポート幅定義のエクスポート幅ルールを変更するには、
次の引数を指定して、ReplaceExportDefinition ストアド プロシージャを呼び出しま
す。
• export_definition_name は、変更する既存のユーザー定義のエクスポート幅定義
の名前を指定する、Latin 文字列です。
• export_width_rule_set は、40 個の 16 進数数字を含む BYTE 文字列です。これ
により、export_definition_name の新しいエクスポート幅ルールを定義します。
エクスポート幅ルールの詳細については、「エクスポート幅ルール」を参照して
ください。
• result_message は、このストアド プロシージャの出力メッセージを格納する出
力パラメータです。
ReplaceExportDefinition は、指定されたエクスポート幅定義を新しいルールで変更
して、DBC.ExportWidth テーブルを更新します。改定されたエクスポート幅定義
は、影響を受けるユーザーごとに次回のトランザクション時に有効になります。実
行中のトランザクションは、既存のエクスポート幅定義で継続されます。
注: 'Expected'、'Compatibility'、または'Maximum'を export_definition_name に対し
て指定することはできません。
エクスポート幅ルール
export_width_rule_set は、40 個の 16 進数数字が含まれる BYTE 文字列であり、
フォーマットは次のようになります。
•
•
•
•
最初の 10 個の数字では、LATIN 文字列のエクスポート幅を定義します。
2 番目の 10 個の数字では、UNICODE 文字列のエクスポート幅を定義します。
3 番目の 10 個の数字では、KANJISJIS 文字列のエクスポート幅を定義します。
4 番目の 10 個の数字では、GRAPHIC 文字列のエクスポート幅を定義します。
例えば、export_width_rule_set が
'1112211111222232222211121111112222322222'XB の場合は、次のように
なります。
• 最初の 10 個の数字(1112211111)は、LATIN 文字列のエクスポート幅を定義し
ます。
• 2 番目の 10 個の数字(2222322222)は、UNICODE 文字列のエクスポート幅を定
義します。
• 3 番目の 10 個の数字(1112111111)は、KANJISJIS 文字列のエクスポート幅を定
義します。
• 4 番目の 10 個の数字(2222322222)は、GRAPHIC 文字列のエクスポート幅を定
義します。
10 個の数字のセットの各位置では、次のようにセッション文字セットのエクスポー
ト幅変換乗数を指定します。
SQL 関数、演算子、式および述部
805
第 16 章 エクスポート幅プロシージャ
ReplaceExportDefinition
10 個の数字セットの中の 変換乗数
位置
1 番目
• 文字列'_0I'で終了する任意のセッション文字セット。
• セッション文字セット'KATAKANAEBCDIC'。
2 番目
文字列'_0U'で終了する任意のセッション文字セット。
3 番目
文字列'_0S'で終了する任意のセッション文字セット。
4 番目
セッション文字セット'UTF16'。
5 番目
セッション文字セット'UTF8'。
6 番目
STATEMACHINE EUC1211 によるサイト定義セッション文
字セット。
7 番目
STATEMACHINE EUC1223 によるサイト定義セッション文
字セット。
8 番目
STATEMACHINE S80 によるサイト定義セッション文字セッ
ト。
9 番目
STATEMACHINE S80A1E0 によるサイト定義セッション文
字セット。
10 番目
STATEMACHINE SOSI0E0F によるサイト定義セッション文
字セット。
各位置の値は 1、2、3 または 4 になります。ただし、各 10 個の文字セット(UTF16)
内の 4 番目の位置の値は、2 または 4 のどちらかにする必要があります。
例えば、export_width_rule_set が
'1112211111222232222211121111112222322222'XB の場合は、次のようにな
ります。
• LATIN サーバー文字セット(10 個の数字の最初のセットが 1112211111)からエ
クスポートするときに、UTF8 セッション文字セット(10 個の数字の最初のセット
内で 5 番目の位置)については、エクスポート幅が 2 になります。
• UNICODE サーバー文字セット(10 個の数字の 2 番目のセットが 2222322222)か
らエクスポートするときに、UTF8 セッション文字セット(10 個の数字の 2 番目
のセット内で 5 番目の位置)については、エクスポート幅が 3 になります。
• KANJISJIS サーバー文字セット(10 個の数字の 3 番目のセットが 1112111111)か
らエクスポートするときに、UTF16 セッション文字セット(10 個の数字の 3 番目
のセット内で 4 番目の位置)については、エクスポート幅が 2 になります。
例
この例では、MyExportWidth が存在しない場合、ReplaceExportDefinition は
MyExportWidth という名前の新しいエクスポート幅定義を、それに関連付けるエク
スポート幅ルール セットの
806
SQL 関数、演算子、式および述部
第 16 章 エクスポート幅プロシージャ
RemoveExportDefinition
'1422323221332232322321123111122322323221'XB で作成します。
MyExportWidth が既に存在する場合、ReplaceExportDefinition は現在のエクスポー
ト幅ルール セットの MyExportWidth を、新しいエクスポート幅ルール セットの
'1422323221332232322321123111122322323221'XB で置換します。
CALL SYSLIB.ReplaceExportDefinition
('MyExportWidth','1422323221332232322321123111122322323221'xb,msg);
RemoveExportDefinition
目的
ユーザー定義のエクスポート幅定義を削除します。
構文
RemoveExportDefinition
CALL
A
( 'export_definition_name ',
SYSLIB.
A
result_message )
;
構文要素
SYSLIB
関数が格納されているデータベースの名前。
export_definition_name
ユーザー定義のエクスポート定義名。
'Expected'、'Compatibility'、または'Maximum'を指定することはできません。
result_message
ストアド プロシージャの出力メッセージ。
許可
このストアド プロシージャまたは SYSLIB データベースに対する EXECUTE 権限が
必要です。
引数のタイプ
このプロシージャに渡された式は、次のデータ タイプを持っている必要があります。
SQL 関数、演算子、式および述部
807
第 16 章 エクスポート幅プロシージャ
RemoveExportDefinition
• export_definition_name = VARCHAR(n) CHARACTER SET LATIN (n の最大値は 30)
• result_message = VARCHAR(100) CHARACTER SET UNICODE
Teradata Database の暗黙のデータ型変換規則を使用して、上記の型に変換できる
データ型の引数も渡すことができます。
使用上の注意
既存のユーザー定義のエクスポート幅定義を削除するには、次の引数を指定して
RemoveExportDefinition ストアド プロシージャを呼び出します。
• export_definition_name は、削除する既存のエクスポート幅定義の名前を指定す
るための Latin 文字列です。
• result_message は、このストアド プロシージャの出力メッセージを格納する出力
パラメータです。
RemoveExportDefinition は、指定されたエクスポート幅定義を DBC.ExportWidth
テーブルから削除します。
注: 'Expected'、'Compatibility'、または'Maximum'を export_definition_name に対し
て指定することはできません。また、ユーザーに割り当てられているエクスポート
幅定義を、削除することはできません。
例
次の文は、MyExportWidth という名前のユーザー定義のエクスポート幅定義を削除
します。
CALL SYSLIB.RemoveExportDefinition('MyExportWidth',msg);
808
SQL 関数、演算子、式および述部
第 17 章
ハッシュ関連の関数
概要
ハッシュ関連の関数は、以下に関する情報を戻します。
•
•
•
•
•
•
特定のハッシュ バケット番号に対応する基本またはフォールバックの AMP
特定の行ハッシュ値に対応するハッシュ バケット番号
行の基本索引の行ハッシュ値
最高の AMP 番号
最高のハッシュ バケット番号
符号なしの整数に対するハッシュ関数の適用によって生成できる最大値
ハッシュ関連関数は、現行基本索引または副次索引の統計プロパティを識別する場
合や、その他の列の統計プロパティを評価して今後の基本索引または副次索引とし
ての適性を判別する場合に使用します。この統計は、ハッシュ シノニムを最小化し
て、データ分布の均一性を高めるのに役立ちます。
HASHAMP
目的
指定されたハッシュ バケット番号に対応する基本 AMP の ID 番号を返します。ハッ
シュ バケット番号を指定しないと、システム上の AMP の最大数よりも 1 つ少ない
番号が HASHAMP から戻されます。
構文
HASHAMP
( expression )
構文要素
expression
有効ハッシュ バケット番号と評価される式。
SQL 関数、演算子、式および述部
809
第 17 章 ハッシュ関連の関数
HASHAMP
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと値
expression 引数は、値の有効範囲がハッシュ バケット サイズのシステム設定によっ
て異なる場合は、INTEGER データ型と評価されなければなりません。
ハッシュ バケット サイズ
expression の値の範囲
16 ビット
0~65535
20 ビット
0~1048575
ハッシュ バケット サイズのシステム設定の指定方法については 、<ユーティリティ 、
B035-1102>の「DBS Control(DBS 制御)ユーティリティ」を参照してください。
expression が INTEGER に暗黙変換できない場合は、エラーが戻されます。
expression の結果が UDT になる場合に、UDT と以下のいずれかの事前定義タイプの
間でキャストする暗黙 CAST を UDT が持っていると、Teradata Database はその UDT
に対して暗黙タイプ変換を実行します。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
HASHAMP を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、ANSI
SQL 標準の Teradata 拡張機能です。
結果
expression
結果
有効なハッシュ バケッ HASHAMP は、ハッシュ バケットに対応する基本 AMP を判別して、
ト番号に評価される その AMP ID 番号を戻します。
結果は、ゼロ以上かつ構成内の AMP の最大数より小さい INTEGER
値になります。
引数リストに表示され HASHAMP は、システム内の AMP の最大数より 1 少ない INTEGER
ない
値を戻します。
NULL と評価される
810
HASHAMP は NULL を戻します。
SQL 関数、演算子、式および述部
第 17 章 ハッシュ関連の関数
HASHAMP
ハッシュ バケットと基本 AMP の関係を定義するハッシュ マップの詳細について
は、<サポート ユーティリティ 、B035-1180>の「Reconfiguration(再構成)ユーティ
リティ」を参照してください。
例
以下の例では、テーブル T に column_1、column_2、および INTEGER 列 B があり、
それらの列にゼロからシステム上の最大ハッシュ バケット数までの整数の番号が取
り込まれていると想定します。
CREATE TABLE T
(column_1 INTEGER
,column_2 INTEGER
,B INTEGER)
UNIQUE PRIMARY INDEX (column_1, column_2);
例: HASHAMP を引数なしで呼び出す
HASHAMP を引数なしで呼び出した場合には、システム上の AMP の最大数よりも
1 つ少ない番号が戻されます。
SELECT HASHAMP();
例: HASHAMP を NULL の引数とともに呼び出す
HASHAMP を NULL の引数とともに呼び出した場合には、NULL が戻されます。
SELECT HASHAMP(NULL);
例: ハッシュ バケットの分布の問合わせ
次の問合わせは、それぞれの基本 AMP におけるハッシュ バケットの分布を戻します。
SELECT B, HASHAMP (B)
FROM T
ORDER BY 1;
例: 各基本 AMP 上の行数の問合わせ
以下の問合わせは、テーブル T の基本索引が column_1 と column_2 となる各基本
AMP の行の数を戻します。
SELECT HASHAMP (HASHBUCKET (HASHROW (column_1,column_2))), COUNT (*)
FROM T
GROUP BY 1
ORDER BY 1;
SQL 関数、演算子、式および述部
811
第 17 章 ハッシュ関連の関数
HASHBAKAMP
関連トピック
詳細は、以下を参照してください。
• 詳細については、ユーティリティ 、B035-1102 を参照してください。
• 暗黙の型変換の詳細については、「データ型の変換」を参照してください。
• ハッシュ バケットとフォールバック AMP の関係を定義するハッシュ マップの詳
細については、<サポート ユーティリティ 、B035-1180>の「Reconfiguration(再
構成)ユーティリティ」を参照してください。
HASHBAKAMP
目的
指定されたハッシュ バケットに対応するフォールバック AMP の ID 番号を戻しま
す。ハッシュ バケットを指定しないと、システム上の AMP の最大数よりも 1 つ少
ない番号が HASHBAKAMP から戻されます。
構文
HASHBAKAMP
( expression )
構文要素
expression
有効ハッシュ バケット番号と評価される式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
引数のタイプと値
expression 引数は、値の有効範囲がハッシュ バケット サイズのシステム設定によっ
て異なる場合は、INTEGER データ型と評価されなければなりません。
ハッシュ バケット サイズ
expression の値の範囲
16 ビット
0~65535
20 ビット
0~1048575
ハッシュ バケット サイズのシステム設定の指定方法については 、<ユーティリティ 、
B035-1102>の「DBS Control(DBS 制御)ユーティリティ」を参照してください。
expression が INTEGER に暗黙変換できない場合は、エラーが戻されます。
812
SQL 関数、演算子、式および述部
第 17 章 ハッシュ関連の関数
HASHBAKAMP
expression の結果が UDT になる場合に、UDT と以下のいずれかの事前定義タイプ
の間でキャストする暗黙 CAST を UDT が持っていると、Teradata Database はその
UDT に対して暗黙タイプ変換を実行します。
• 数値
• 文字
• DATE
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
HASHBAKAMP を含め、システム演算子および関数用の UDT の暗黙の型変換は、
ANSI SQL 標準の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
結果
expression
結果
引数リストに表示されない
HASHBAKAMP は、システム内の AMP の最大数より 1
少ない INTEGER 値を戻します。
NULL と評価される
HASHBAKAMP は NULL を戻します。
有効なハッシュ バケット番号に評 HASHBAKAMP は、ハッシュ バケットに対応する
価される
フォールバック AMP を判別して、その AMP の ID 番
号を戻します。
結果は、ゼロ以上かつ構成内の AMP の最大数より小
さい INTEGER 値になります。
ハッシュ バケットとフォールバック AMP の関係を定義するハッシュ マップの詳細
については、<サポート ユーティリティ 、B035-1180>の「Reconfiguration(再構成)
ユーティリティ」を参照してください。
例
例
以下の例では、テーブル T に 1 つの INTEGER 列 B があり、その列には、ゼロから
システム上の最大ハッシュ バケット数までの整数の番号が取り込まれていると想定
します。
例
HASHBAKAMP を引数なしで呼び出した場合には、システム上の AMP の最大数よ
りも 1 つ少ない番号が戻されます。
SELECT HASHBAKAMP();
SQL 関数、演算子、式および述部
813
第 17 章 ハッシュ関連の関数
HASHBUCKET
例
HASHBAKAMP 関数を NULL の引数とともに呼び出した場合には、関数は NULL を
戻します。
SELECT HASHBAKAMP(NULL);
例
次の問合わせは、それぞれのフォールバック AMP 内におけるハッシュ バケットの
分布を戻します。
SELECT B, HASHBAKAMP (B)
FROM T
ORDER BY 1;
関連トピック
詳細については、<ユーティリティ 、B035-1102>を参照してください。
HASHBUCKET
目的
指定された行のハッシュ値に対応するハッシュ バケット番号を戻します。行ハッシュ
値を指定しないと、ハッシュ バケットの最大番号が HASHBUCKET から戻されます。
構文
HASHBUCKET
( expression )
構文要素
expression
有効な BYTE(4)行ハッシュ値と評価される任意選択の式。
expression の結果が UDT になる場合に、事前定義されたバイト型への暗黙 CAST を
UDT が持っていると、Teradata Database はその UDT に対して暗黙型変換を実行し
ます。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および
例、B035-1144>を参照してください。
HASHBUCKET を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI
SQL 標準の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコード
の DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。
814
SQL 関数、演算子、式および述部
第 17 章 ハッシュ関連の関数
HASHBUCKET
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果
HASHBUCKET は INTEGER データ タイプを戻します。
expression
結果
引数リストに表示され
ない
HASHBUCKET は、最高のハッシュ バケット番号である INTEGER
値を戻します。
NULL と評価される
HASHBUCKET は NULL を戻します。
有効な BYTE(4)行ハッ
シュ値と評価される
HASHBUCKET は、行ハッシュ値に対応するハッシュ バケット番
号を戻します。
ハッシュ バケット番号の値の範囲は、ハッシュ バケット サイズ
のシステム設定によって異なります 。
• ハッシュ バケット サイズが 16 ビットである場合、ハッシュ
バケット番号の値は 0~65535 になります。
• ハッシュ バケット サイズが 20 ビットである場合、ハッシュ
バケット番号の値は 0~1048575 になります。
HASHBUCKET を使用した BYTE タイプから INTEGER タイプへの変換
バイト データ タイプが CAST 構文または Teradata 変換構文を使用した変換のソー
ス タイプである場合は、ターゲット データ タイプもバイト タイプである必要があ
ります。
BYTE(1)または BYTE(2)データ タイプを INTEGER に変換するには、HASHBUCKET
関数を使用します。
次のテーブル定義を考えます。
CREATE TABLE ByteData(b1 BYTE(1), b2 BYTE(2));
ハッシュ バケット サイズのシステム設定に関係なく列 b1 を INTEGER に変換する
には、以下を使用します。
SELECT HASHBUCKET('00'XB || b1 (BYTE(4))) / ((HASHBUCKET()+1)/65536)
FROM ByteData;
ハッシュ バケット サイズのシステム設定に関係なく列 b2 を INTEGER に変換する
には、以下を使用します。
SELECT HASHBUCKET(b2 (BYTE(4))) / ((HASHBUCKET()+1)/65536)
FROM ByteData;
SQL 関数、演算子、式および述部
815
第 17 章 ハッシュ関連の関数
HASHBUCKET
例
以下の例では、テーブル T には、列 C1 および C2 と、さらに別の列もある可能性が
あると想定しています。
例
引数なしで HASHBUCKET を呼び出すと、最大のハッシュ バケットが戻されます。
SELECT HASHBUCKET();
例
HASHBUCKET 関数を NULL の引数とともに呼び出した場合には、関数は NULL を戻
します。
SELECT HASHBUCKET(NULL);
例
前の例を使用して、HASHROW 呼出しを HASHBUCKET 呼出しの入れ子にすること
ができます。
HASHBUCKET (HASHROW (NULL))の呼出しは、0 のハッシュ バケットを戻します。
SELECT HASHBUCKET(HASHROW(NULL));
例
以下の例は、C1 と C2 が T の基本索引となる各ハッシュ バケット内の行の数を戻し
ます。
SELECT HASHBUCKET (HASHROW (C1,C2)), COUNT (*)
FROM T
GROUP BY 1
ORDER BY 1;
例
以下の例の結果では、1 つ以上の行とそれに対応する基本 AMP をもつ各ハッシュ バ
ケットが一覧で示されます。
SELECT HASHAMP (HASHBUCKET (HASHROW (C1, C2))),
HASHBUCKET (HASHROW (C1,C2))
FROM T
GROUP BY 1,2
ORDER BY 1,2 ;
816
SQL 関数、演算子、式および述部
第 17 章 ハッシュ関連の関数
HASHROW
HASHROW
目的
式または一連の式の行ハッシュ値を 16 進数で戻します。 式が何も指定されていな
い場合は、HASHROW は最大のハッシュ コード値を戻します。
構文
HASHROW
(
,
)
expression
構文要素
expression
SELECT 文の SELECT 句の式リストに表示できるオプションの式またはカンマで区
切られた式リスト。通常は、(候補の)索引を構成する列名をカンマで区切ったリスト。
HASHROW は、結果が UDT データ タイプになる式をサポートしません。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果
結果の行ハッシュ値はタイプ BYTE(4)です。
引数リスト
HASHROW の動作
空
最大のハッシュ コード値を戻します。
NULL と評価される式
'00000000'XB を戻します。
すべての式が NULL と評価される場合の式のリスト
0、''、' '、または同様の値と評価される式
SELECT 文の選択リストに表示できる、NULL 以外の expression または expression のリス
有効な式
トを評価して、その結果に対してハッ
シュ関数を適用します。HASHROW は
いくつかの式が NULL と評価される場合、SELECT
その結果の行ハッシュ値を戻します。
文の選択リストに表示できる式のリスト
使用上の注意
HASHROW は、現行基本索引の統計特性を識別する場合、または他の列に対するこ
れらの特性を評価して、将来の基本索引としての適性を判別する場合に特に役立ち
SQL 関数、演算子、式および述部
817
第 17 章 ハッシュ関連の関数
HASHROW
ます。また、これらの統計を使用すれば、ハッシュ シノニムを最小にして 、データ
分布の均一性を高めるためにも役立ちます。
システムで使用可能なハッシュ コードは最大で 4,294,967,295 個あり、その範囲
は '00000000'XB~'FFFFFFFF'XB です。
HASHBUCKET 呼出しの中に HASHROW 呼出しを埋め込むことができます。
例
例
HASHROW を引数なしで呼び出した場合には、'FFFFFFFF'XB が戻されます。これ
は、システム内の最大ハッシュ コードです。
SELECT HASHROW();
例
以下の例では、date_field 列と time_field 列が eventlog テーブルの基本索引となる、
行ハッシュあたりの行の平均数を戻します。
SELECT COUNT(*) / COUNT(DISTINCT HASHROW (date_field,time_field))
FROM eventlog;
date_field 列と time_field 列が固有索引となる条件を満たしている場合、この例は、
ハッシュ シノニムが同じ行の平均数を戻します。
例
次の例は、数値フィールドの decimal 書式の変更によってシノニムをなくす効果を
評価します。
column_1 と column_2 が DECIMAL(2,2)として宣言されていることを前提としてい
ます。
次の 2 つの問合わせを実行依頼することによって、ハッシュの衝突時に列を
DECIMAL(8,6)および DECIMAL(8,4)に書式設定し直すことの効果を判別することが
できます。
SELECT COUNT (DISTINCT column_1(DECIMAL(8,6)) ||
column_2(DECIMAL(8,4))
FROM T;
SELECT COUNT (DISTINCT HASHROW (column_1(DECIMAL(8,6)),
column_2 (DECIMAL(8,4)))
FROM T;
2 番目の問合わせの結果が最初の問合わせの結果よりはるかに小さい場合、かなり
の数のハッシュ衝突があります。つまり、2 番目の結果が最初の値に近ければ近い
ほど、削減されるハッシュ シノニムは多くなることを示します。
818
SQL 関数、演算子、式および述部
第 17 章 ハッシュ関連の関数
HASHROW
関連トピック
詳細は、以下を参照してください。
• HASHBUCKET の詳細については、「HASHBUCKET」を参照してください。
SQL 関数、演算子、式および述部
819
第 17 章 ハッシュ関連の関数
HASHROW
820
SQL 関数、演算子、式および述部
第 18 章
ファイル システム情報マクロ
概要
これらの関数を使用して、さまざまな Ferret SHOW コマンドによって、Teradata
Database ファイル システムの、データ ブロック サイズ、データ ブロックごとの行
数に関する統計および、指定されているテーブルまたはテーブル グループのデー
タ ブロックの圧縮状態に関する情報を表示できるようになります。
情報は、Ferret ユーティリティの SHOWBLOCKS コマンドによって表示される情報
に類似しています。これらの関数からの情報は通常のデータベース テーブルで作成
されるため、情報の共有と処理をより簡単に行なうことができます。この情報を作
成し表示するためのアクセス権は、標準の SQL GRANT および REVOKE 権限文を使
用してより簡単に管理することもできます。
関連トピック
Ferret についての詳細は、<ユーティリティ 、B035-1102>を参照してください。
CreateFsysInfoTable
CreateFsysInfoTable_ANSI
目的
PopulateFsysInfoTable マクロによって生成されたファイル システム情報を保持す
るためのデータベース テーブルを作成します。
注: ANSI セッション モードを使用する場合は、マクロの_ANSI 形式を使用します。
PopulateFsysInfoTable または PopulateFsysInfoTable_ANSI マクロがデータベース
とテーブル名に文字列が入力されない状態で呼び出された場合、テーブルの作成は
不要です。出力が画面にリダイレクトされます。
SQL 関数、演算子、式および述部
821
第 18 章 ファイル システム情報マクロ
CreateFsysInfoTable
CreateFsysInfoTable_ANSI
構文
構文要素
target_database_name
テーブルが作成されるデータベース。
注: ターゲット データベースでテーブルを作成するための適切な権限を所有している
必要があります。
target_table_name
ファイル システム情報を保持するために作成されるテーブルの名前 。
注: ターゲット データベースでテーブルを作成するための適切な権限を所有している
必要があります。
storage_type
テーブルが永久テーブル、グローバル一時テーブル、または揮発テーブルかどうか
を指定します。
storage_type の有効な値は、次のとおりです。
• PERM
• GLOBALTEMP
• VOLATILE
fallback
データベースがテーブルのフォールバック コピーを維持するかどうかを指定します。
fallback の有効な値は、次のとおりです。
• Y (Yes: テーブルにフォールバックがある)
• N (No: テーブルにフォールバックがない)
command
この出力が同じように表示される Ferret SHOW コマンド。
利用可能なオプションには、SHOWBLOCKS または SHOWWHERE があります。
display_opt
テーブルに格納可能なファイル システム詳細のレベル。
display_opt の有効な値は、次のとおりです。
• S は、最小量のファイル システム情報詳細を提供します
• M は、中量のファイル システム情報を提供します
822
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
• L は、最大量のファイル システム情報を提供します
表示される特定の情報については、「PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI」を参照してください。
注: CreateFsysInfoTable に選択される表示オプションは、PopulateFsysInfoTable マ
クロの対応する実行に使用される表示オプションに一致している必要があります。
出力が画面にダイレクトされた場合(たとえば、データベースおよびテーブル名に空
の文字列を指定)、PopulateFsysInfoTable または PopulateFsysInfoTable_ANSI マク
ロの呼び出しを使用したテーブルの作成は不要です。あらゆる表示オプションの指
定が可能です。
許可
このマクロを実行するには、上記の権限だけでなく、CreateFsysInfoTable マクロ、
またはこのマクロを含むデータベースに対し EXECUTE 権限がなければなりません。
マクロ名と引数は大文字と小文字を区別します。
例
例: SHOWBLOCKS の短形式のファイル システム情報テーブルの作成
この文は、ディスク ブロック情報の最小表示を保持するための揮発の非フォール
バック テーブルを作成します。
exec dbc.createfsysinfotable
('visuser','datablockinfo','volatile','n','showblocks','s');
例: SHOWWHERE の短形式のファイル システム情報テーブルの作成
この文は、SHOWWHERE の短形式出力を保持するための永続的な非フォールバッ
ク ターゲット テーブル'showw_s'を作成します。
exec dbc.createfsysinfotable
('visuser','showw_s','perm','n','showwhere','s');
オプションを'M'または'L'に変更して、中形式または長形式の出力を表示します。
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
目的
CreateFsysInfoTable マクロによって作成されるテーブルにファイル システム デー
タを生成します。
注: ANSI セッション モードを使用する場合は、マクロの_ANSI 形式を使用します。
SQL 関数、演算子、式および述部
823
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
構文
構文要素
input_database_name
ファイル システム データ ブロック ヒストグラム情報が生成されるテーブルを含む
データベース。
注: 入力データベースのテーブルからデータを選択するための適切な権限を所有して
いる必要があります。
データベース DBC を指定すると、input_class 引数を使用して、情報が生成される
テーブルのクラスを選択することができます。
input_table_name
ファイル システム情報が生成されるテーブルの名前 。
注: 入力データベースのテーブルからデータを選択するための適切な権限を所有して
いる必要があります。
input_class
ファイル システム情報が生成されるテーブルのクラス 。
input_class は、input_database_name が DBC の場合にのみ指定できます。
input_class の有効な値は、次のとおりです。
• CLASSPERM
• CLASSJRNL
• CLASSREDRIVE
• CLASSGLOBALTEMP
• CLASSSPOOL
• CLASSWAL
• CLASSALL (上記の表のクラスをすべて表示)
注: input_class は、SHOWWHERE に対してのみサポートされます。input_class オプ
ションは、マクロを使用して SHOWBLOCKS 情報を生成する場合は、リソース使用
率が高いため使用できません。
command
この出力が同じように表示される Ferret SHOW コマンド。
利用可能なオプションには、SHOWBLOCKS または SHOWWHERE があります。
824
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
display_opt
生成され、ターゲット テーブルに入力されるファイル システム詳細のレベル。
display_opt に有効な値は、S、M および L です。
• S には指定されているテーブルの基本データ サブテーブルに関する以下の情報が
含まれます。
ブロック サイズのヒストグラム
サブテーブルごとの最小、平均、最大ブロック サイズ
ブロック圧縮情報(状態、予想圧縮率、予想される非圧縮)
• M には S と同じ情報が含まれていますが、指定されているテーブルのすべてのサ
ブテーブルの統計を表示します。
• L には指定されているテーブルのサブテーブルごとの各ブロック サイズ カテゴ
リに関する以下の情報が含まれています。
• ブロック数
• データ ブロック サイズごとの行数の最小数、平均数、最大数
• ブロック圧縮情報(状態、予想圧縮率、予想非圧縮率)
注: PopulateFsysInfoTable に選択されている表示オプションは、CreateFsysInfoTable
マクロの対応する実行に使用された表示オプションと一致している必要があります。
target_database_name
CreateFsysInfoTable マクロによってターゲット テーブルが作成されたデータベース。
この引数と target_table_name が空の文字列である場合、出力はコンピュータ画面
にダイレクトされます。
注: 作成する、またはターゲット データベースのテーブルに挿入するための適切な
権限を所有している必要があります。
データベースとテーブル名に空の文字列を指定してマクロを呼び出した場合 、
CreateFsysInfoTable CreateFsysInfoTable_ANSI の呼び出しは不要です。
target_table_name
ファイル システム情報を保持するための 、ターゲット データベース内で
CreateFsysInfoTable マクロによって作成されたテーブルの名前。
この引数と target_database_name が空の文字列である場合、出力はコンピュータ
画面にダイレクトされます。
注: ターゲット データベースの target_table_name に挿入するための適切な権限を
所有している必要があります。ターゲット データベースで target_table_name を作
成した場合、ターゲット テーブルに対し暗黙的な INSERT 権限を所有していること
になります。
データベースとテーブル名に空の文字列を指定してマクロを呼び出した場合 、
CreateFsysInfoTable CreateFsysInfoTable_ANSI の呼び出しは不要です。
SQL 関数、演算子、式および述部
825
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
許可
このマクロを実行するには、上記の権限だけでなく、PopulateFsysInfoTable マク
ロ、またはこのマクロを含むデータベースに対し EXECUTE 権限を所有している必
要があります。
マクロ名と引数は大文字と小文字を区別します。
例
例: SHOWBLOCK 出力のファイル システム情報テーブルの挿入 (オプション'S')
最初のステップとして、ファイル システム情報行を格納するためのターゲット テー
ブルを作成することができます。
手動、または CreateFsysInfoTable マクロを使用して、ターゲット テーブルを作成
します。
exec
createfsysinfotable('visuserdata','showbtrgttableshort','perm','y','sho
wblocks','s');
SHOWBLOCKS に関するファイル システム情報を格納するためのターゲット テーブ
ルを作成するときの S 表示オプションに対するターゲット テーブルの定義を以下に
示します。
show table visuserdata.showbtrgttable;
CREATE SET TABLE visuserdata.showbtrgttableshort,FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
TheDate DATE FORMAT 'YY/MM/DD',
TheTime TIME(6),
DataBaseName VARCHAR(128) CHARACTER SET UNICODE NOT
CASESPECIFIC
NOT NULL,
TableName VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC
NOT
NULL,
TableID BYTE(6),
TableIDTAI INTEGER,
CompressionMethod CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
CompressionState VARCHAR(2) CHARACTER SET LATIN NOT CASESPECIFIC,
EstCompRatio DECIMAL(5,2),
EstPctOfUncompDBs DECIMAL(5,2),
PctDBsIn1to8 BYTEINT,
PctDBsIn9to24 BYTEINT,
826
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
PctDBsIn25to64 BYTEINT,
PctDBsIn65to120 BYTEINT,
PctDBsIn121to168 BYTEINT,
PctDBsIn169to216 BYTEINT,
PctDBsIn217to256 BYTEINT,
PctDBsIn257to360 BYTEINT,
PctDBsIn361to456 BYTEINT,
PctDBsIn457to512 BYTEINT,
PctDBsIn513to760 BYTEINT,
PctDBsIn761to1024 BYTEINT,
PctDBsIn1025to1034 BYTEINT,
PctDBsIn1035to1632 BYTEINT,
PctDBsIn1633to2048 BYTEINT,
MinDBSize INTEGER,
AvgDBSize INTEGER,
MaxDBSize INTEGER,
TotalNumDBs BIGINT,
LrgCyls BIGINT,
SmlCyls BIGINT)
PRIMARY INDEX ( TheDate ,TheTime ,TableID ,CompressionState );
次の例に、S 表示オプションの PopulateFsysInfoTable マクロ実行からの BTEQ 出力
と、出力を強制的に画面に表示する target_database_name および
target_table_name の空の文字列を示します。
出力の列タイトル名は、ターゲット テーブルを使用して出力を格納せずに画面にリ
ダイレクトされるときに変わります。例えば、列名がターゲット テーブルで
"PctDBsIn1to8"とすると、出力が画面にリダイレクトされた場合、対応する列は"%
Of DBs In 1 to 8"となります。
PopulateFsysInfoTable マクロの後に戻される警告は、出力が画面に表示されるとき
に想定されている動作です。
注: BTEQ .foldline コマンドと.sidetitles コマンドは、戻されたデータ セットの列タ
イトルが横に表示され、これらの列の対応する値が列タイトルの横に表示されるよ
うにするために使用されています。
注: 次の PopulateFsysInfoTable()呼び出しの例では、出力/結果を画面にリダイレク
トします(データベースとテーブル名に空の文字列を指定)。特定のテーブルに出力/
結果を挿入する場合、テーブルが CreateFsysInfoTable()マクロで作成され、同じ/
display_opt が PopulateFsysInfoTable および CreateFsysInfoTable の両方のマクロ
の呼び出しに指定されていることを確認します。
exec
***
***
***
populatefsysinfotable('visuser','test3','showblocks','s','','');
Procedure has been executed.
Warning: 3212 The stored procedure returned one or more result sets.
Total elapsed time was 34 seconds.
SQL 関数、演算子、式および述部
827
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
*** ResultSet# 1 : 1 rows returned by "SYSLIB.POPULATEFSYSINFOTABLESP".
Date 13/12/22
Time 21:45:29
DB//Name visuser
Tbl//Name test3
TID
0000E90A0000
TID//TAI
1024
Comp//Method MANUAL
Comp//State U
Est Comp//Ratio(%)
Est Uncomp//DBs(%)
% Of DBs In//1 to 8//Sects
% Of DBs In//9 to 24//Sects
% Of DBs In//25 to 64//Sects
% Of DBs In//65 to 120//Sects 50
% Of DBs In//121 to 168//Sects
% Of DBs In//169 to 216//Sects
% Of DBs In//217 to 256//Sects 50
% Of DBs In//257 to 360//Sects
% Of DBs In//361 to 456//Sects
% Of DBs In//457 to 512//Sects
% Of DBs In//513 to 760//Sects
% Of DBs In//761 to 1024//Sects
% Of DBs In//1025 to 1304//Sects
% Of DBs In//1305 to 1632//Sects
% Of DBs In//1633 to 2048//Sects
Min DB Size
96
Avg DB Size
176
Max DB Size
254
Total DBs
8
Lrg Cyls
4
Sml Cyls
例: SHOWBLOCK 出力のファイル システム情報テーブルの挿入 (オプション'M')
最初のステップとして、ファイル システム情報行を格納するためのターゲット テー
ブルを作成することができます。
手動、または CreateFsysInfoTable マクロを使用して、ターゲット テーブルを作成
します。
exec
createfsysinfotable('visuserdata','showbtrgttablemedium','perm','y',
'showblocks','m');
828
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
SHOWBLOCKS に関するファイル システム情報を格納するためのターゲット テーブ
ルを作成するときの M 表示オプションに対するターゲット テーブルの定義を以下
に示します。
show table visuserdata.showbtrgttablemedium;
CREATE SET TABLE visuserdata.showbtrgttablemedium ,FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
TheDate DATE FORMAT 'YY/MM/DD',
TheTime TIME(6),
DataBaseName VARCHAR(128) CHARACTER SET UNICODE NOT
CASESPECIFIC
NOT NULL,
TableName VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC
NOT
NULL,
TableID BYTE(6),
TableIDTAI INTEGER,
CompressionMethod CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
CompressionState VARCHAR(2) CHARACTER SET LATIN NOT CASESPECIFIC,
EstCompRatio DECIMAL(5,2),
EstPctOfUncompDBs DECIMAL(5,2),
PctDBsIn1to8 BYTEINT,
PctDBsIn9to24 BYTEINT,
PctDBsIn25to64 BYTEINT,
PctDBsIn65to120 BYTEINT,
PctDBsIn121to168 BYTEINT,
PctDBsIn169to216 BYTEINT,
PctDBsIn217to256 BYTEINT,
PctDBsIn257to360 BYTEINT,
PctDBsIn361to456 BYTEINT,
PctDBsIn457to512 BYTEINT,
PctDBsIn513to760 BYTEINT,
PctDBsIn761to1024 BYTEINT,
PctDBsIn1025to1034 BYTEINT,
PctDBsIn1035to1632 BYTEINT,
PctDBsIn1633to2048 BYTEINT,
MinDBSize INTEGER,
AvgDBSize INTEGER,
MaxDBSize INTEGER,
TotalNumDBs BIGINT,
LrgCyls BIGINT,
SmlCyls BIGINT)
SQL 関数、演算子、式および述部
829
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
PRIMARY INDEX (TheDate, TheTime, TableID ,TableIDTAI ,CompressionState);
BTEQ -- Enter your SQL request or BTEQ command:
次の例に、M 表示オプションの PopulateFsysInfoTable マクロ実行からの BTEQ 出力
と、出力を強制的に画面に表示する target_database_name および target_table_name
の空の文字列を示します。
出力の列タイトル名は、ターゲット テーブルを使用して出力を格納せずに画面にリ
ダイレクトされるときに変わります。例えば、列名がターゲット テーブルで
"PctDBsIn1to8"とすると、出力が画面にリダイレクトされた場合、対応する列は"%
Of DBs In 1 to 8"となります。
PopulateFsysInfoTable マクロの後に戻される警告は、出力が画面に表示されるとき
に想定されている動作です。
注: BTEQ .foldline コマンドと.sidetitles コマンドは、戻されたデータ セットの列タ
イトルが横に表示され、これらの列の対応する値が列タイトルの横に表示されるよ
うにするために使用されています。この例では、2 つの出力行を示します。各行の
最初の列は DATE 列です。
注: 次の PopulateFsysInfoTable()呼び出しの例では、出力/結果を画面にリダイレク
トします(データベースとテーブル名に空の文字列を指定)。特定のテーブルに出力/
結果を挿入する場合、テーブルが CreateFsysInfoTable()マクロで作成され、同じ/
display_opt が PopulateFsysInfoTable および CreateFsysInfoTable の両方のマクロの
呼び出しに指定されていることを確認します。
exec
***
***
***
populatefsysinfotable('visuser','test3','showblocks','m','','');
Procedure has been executed.
Warning: 3212 The stored procedure returned one or more result sets.
Total elapsed time was 32 seconds.
*** ResultSet# 1 : 2 rows returned by "SYSLIB.POPULATEFSYSINFOTABLESP".
Date 13/12/22
Time 21:46:12
DB//Name visuser
Tbl//Name test3
TID
0000E90A0000
TID//TAI
0
Comp//Method MANUAL
Comp//State N
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
% Of DBs In//1 to 8//Sects 100
% Of DBs In//9 to 24//Sects
% Of DBs In//25 to 64//Sects
% Of DBs In//65 to 120//Sects
% Of DBs In//121 to 168//Sects
% Of DBs In//169 to 216//Sects
830
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
% Of DBs In//217 to 256//Sects
% Of DBs In//257 to 360//Sects
% Of DBs In//361 to 456//Sects
% Of DBs In// 457 to 512//Sects
% Of DBs In//513 to 760//Sects
% Of DBs In//761 to 1024//Sects
% Of DBs In//1025 to 1304//Sects
% Of DBs In//1305 to 1632//Sects
% Of DBs In//1633 to 2048//Sects
Min DB Size
2
Avg DB Size
2
Max DB Size
2
Total DBs
4
Lrg Cyls
4
Sml Cyls
Date 13/12/22
Time 21:46:12
DB//Name visuser
Tbl//Name test3
TID
0000E90A0000
TID//TAI
1024
Comp//Method MANUAL
Comp//State U
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
% Of DBs In//1 to 8//Sects
% Of DBs In//9 to 24//Sects
% Of DBs In//25 to 64//Sects
% Of DBs In//65 to 120//Sects 50
% Of DBs In//121 to 168//Sects
% Of DBs In//169 to 216//Sects
% OfDBs In//217 to 256//Sects 50
% Of DBs In//257 to 360//Sects
% Of DBs In//361 to 456//Sects
% Of DBs In// 457 to 512//Sects
% Of DBs In//513 to 760//Sects
% Of DBs In//761 to 1024//Sects
% Of DBs In//1025 to 1304//Sects
% Of DBs In//1305 to 1632//Sects
% Of DBs In//1633 to 2048//Sects
Min DB Size
96
Avg DB Size
176
Max DB Size
254
Total DBs
8
SQL 関数、演算子、式および述部
831
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
Lrg Cyls
Sml Cyls
4
例: SHOWBLOCK 出力のファイル システム情報テーブルの挿入 (オプション'L')
最初のステップとして、ファイル システム情報行を格納するためのターゲット テー
ブルを作成することができます。
手動、または CreateFsysInfoTable マクロを使用して、ターゲット テーブルを作成
します。
exec
createfsysinfotable('visuserdata','showbtrgttablelong','perm','y','show
blocks','l');
SHOWBLOCKS に関するファイル システム情報を格納するためのターゲット テーブ
ルを作成するときの L 表示オプションに対するターゲット テーブルの定義を以下に
示します。
show table visuserdata.showbtrgttablelong;
CREATE SET TABLE visuserdata.showbtrgttablelong ,FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
TheDate DATE FORMAT 'YY/MM/DD',
TheTime TIME(6),
DataBaseName VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC
NOTNULL,
TableName VARCHAR(128) CHARACTER SET UNICODE NOT CASESPECIFIC NOT
NULL,
TableID BYTE(6),
TableIDTAI INTEGER,
CompressionMethod CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
CompressionState VARCHAR(2) CHARACTER SET LATIN NOT CASESPECIFIC,
EstCompRatio DECIMAL(5,2),
EstPctOfUncompDBs DECIMAL(5,2),
DBSize INTEGER,
DBsPerSize BIGINT,
PctOfDBsInSubtable DECIMAL(5,2),
MinNumRowsPerDB INTEGER,
AvgNumRowsPerDB INTEGER,
MaxNumRowsPerDB INTEGER,
LrgCyls BIGINT,
SmlCyls BIGINT)
PRIMARY INDEX ( TheDate ,TheTime ,TableID ,TableIDTAI ,DBSize ,
832
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
PctOfDBsInSubtable );
BTEQ -- Enter your SQL request or BTEQ command:
次の例に、L 表示オプションの PopulateFsysInfoTable マクロ実行からの BTEQ 出力
と、出力を強制的に画面に表示する target_database_name および
target_table_name の空の文字列を示します。
出力の列タイトル名は、ターゲット テーブルを使用して出力を格納せずに画面にリ
ダイレクトされるときに変わります。例えば、列名がターゲット テーブルで
"PctDBsIn1to8"とすると、出力が画面にリダイレクトされた場合、対応する列は"%
Of DBs In 1 to 8"となります。
PopulateFsysInfoTable マクロの後に戻される警告は、出力が画面に表示されるとき
に想定されている動作です。
注: BTEQ .foldline コマンドと.sidetitles コマンドは、戻されたデータ セットの列タ
イトルが横に表示され、これらの列の対応する値が列タイトルの横に表示されるよ
うにするために使用されています。この例では、7 つの出力行を示します。各行の
最初の列は DATE 列です。
exec
***
***
***
populatefsysinfotable('visuser','test3','showblocks','l','','');
Procedure has been executed.
Warning: 3212 The stored procedure returned one or more result sets.
Total elapsed time was 27 seconds.
*** ResultSet# 1 : 7 rows returned by "SYSLIB.POPULATEFSYSINFOTABLESP".
Date 13/12/22
Time 21:46:49
DB//Name visuser
Tbl//Name test3
TID
0000E90A0000
TID//TAI
0
Comp//Method MANUAL
Comp//State N
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
2
DBs Per//Size
4
% Of DBs In//SubTable 100.00
Min Rows//Per DB
1
Avg Rows//Per DB
1
Max Rows//Per DB
1
Lrg Cyls
4
Sml Cyls
Date 13/12/22
Time 21:46:49
DB//Name visuser
SQL 関数、演算子、式および述部
833
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
Tbl//Name
TID
TID//TAI
Comp//Method
Comp//State
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
DBs Per//Size
% Of DBs In//SubTable
Min Rows//Per DB
Avg Rows//Per DB
Max Rows//Per DB
Lrg Cyls
Sml Cyls
Date
Time
DB//Name
Tbl//Name
TID
TID//TAI
Comp//Method
Comp//State
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
DBs Per//Size
% Of DBs In//SubTable
Min Rows//Per DB
Avg Rows//Per DB
Max Rows//Per DB
Lrg Cyls
Sml Cyls
Date
Time
DB//Name
Tbl//Name
TID
TID//TAI
Comp//Method
Comp//State
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
DBs Per//Size
834
test3
0000E90A0000
1024
MANUAL
0
4
13/12/22
21:46:49
visuser
test3
0000E90A0000
1024
MANUAL
U
96
1
12.50
2221
2221
2221
13/12/22
21:46:49
visuser
test3
0000E90A0000
1024
MANUAL
U
98
1
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
% Of DBs
Min
Avg
Max
In//SubTable
Rows//Per DB
Rows//Per DB
Rows//Per DB
Lrg Cyls
Sml Cyls
Date
Time
DB//Name
Tbl//Name
TID
TID//TAI
Comp//Method
Comp//State
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
DBs Per//Size
% Of DBs In//SubTable
Min Rows//Per DB
Avg Rows//Per DB
Max Rows//Per DB
Lrg Cyls
Sml Cyls
Date
Time
DB//Name
Tbl//Name
TID
TID//TAI
Comp//Method
Comp//State
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
DBs Per//Size
% Of DBs In//SubTable
Min Rows//Per DB
Avg Rows//Per DB
Max Rows//Per DB
Lrg Cyls
Sml Cyls
Date
Time
DB//Name
SQL 関数、演算子、式および述部
12.50
2263
2263
2263
13/12/22
21:46:49
visuser
test3
0000E90A0000
1024
MANUAL
U
99
1
12.50
2297
2297
2297
13/12/22
21:46:49
visuser
test3
0000E90A0000
1024
MANUAL
U
102
1
12.50
2359
2359
2359
13/12/22
21:46:49
visuser
835
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
Tbl//Name test3
TID
0000E90A0000
TID//TAI
1024
Comp//Method MANUAL
Comp//State U
Est Comp//Ratio(%)
Est Uncomp//DBS(%)
DBSize
254
DBs Per//Size
4
% Of DBs In//SubTable
50.00
Min Rows//Per DB
5907
Avg Rows//Per DB
5907
Max Rows//Per DB
5907
Lrg Cyls
Sml Cyls
例: SHOWWHERE 出力のファイル システム情報テーブルの挿入 (オプション'S')
データを短形式出力のターゲット テーブルに挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','s','dataload','showw_s');
sel * from dataload.showw_s;
TheDate 15/01/28
TheTime 01:00:57.780000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc -1
Drive -1
LrgCyls
10
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
10
CylsinSSD
0
TemperaturesMature Y
データを短形式の画面に挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','s','','');
*** Warning: 3212 The stored procedure returned one or more result sets.
*** Total elapsed time was 6 seconds
836
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
*** ResultSet# 1 : 1 rows returned by "SYSLIB.POPULATEFSYSINFOTABLESP".
Date
15/01/28
Time 09:01:46
DB Name dataload
Tbl Name t
TID
0000130B0000
TID_TAI
0
Vproc
-1
Drive
-1
Lrg Cyls
10
Sml Cyls
TableType PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
10
Cyls in SSD
Temperatures Mature Y
例: SHOWWHERE 出力のファイル システム情報テーブルの挿入 (オプション'M')
データを中形式出力のターゲット テーブルに挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','m','dataload','showw_m');
sel * from dataload.showw_m;
TheDate 15/01/28
TheTime 01:03:12.160000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc
0
Drive -1
LrgCyls
2
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
2
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:03:12.160000
SQL 関数、演算子、式および述部
837
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
DataBaseName
dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc
2
Drive -1
LrgCyls
3
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
3
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:03:12.160000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc
1
Drive -1
LrgCyls
2
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
2
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:03:12.160000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc
3
Drive -1
LrgCyls
3
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
838
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
WarmCyls
ColdCyls
CylsinSSD
TemperaturesMature
0
3
0
Y
データを中形式の画面に挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','m','','');
*** Warning: 3212 The stored procedure returned one or more result sets.
Date 15/01/28
Time 09:04:14
DB Name dataload
Tbl Name
t
TID
TID_TAI
Vproc
Drive
Lrg Cyls
Sml Cyls
TableType
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
Cyls in SSD
Temperatures Mature
0000130B0000
0
0
-1
2
PERM
2
Y
Date
15/01/28
Time
09:04:14
DB Name
dataload
Tbl Name
TID
t
0000130B0000
TID_TAI
0
Vproc
1
Drive
-1
Lrg Cyls
2
Sml Cyls
TableType
PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
2
Cyls in SSD
Temperatures Mature
Date
Time
DB Name
SQL 関数、演算子、式および述部
Y
15/01/28
09:04:14
dataload
839
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
Tbl Name
TID
TID_TAI
Vproc
Drive
Lrg Cyls
Sml Cyls
TableType
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
Cyls in SSD
Temperatures Mature
Date
Time
DB Name
Tbl Name
TID
t
0000130B0000
0
2
-1
3
PERM
3
Y
15/01/28
09:04:14
dataload
t
0000130B0000
TID_TAI
0
Vproc
3
Drive
-1
Lrg Cyls
3
Sml Cyls
TableType
PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
3
Cyls in SSD
Temperatures Mature
Y
例: SHOWWHERE 出力のファイル システム情報テーブルの挿入 (オプション'L')
データを長形式出力のターゲット テーブルに挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','l','dataload','showw_l');
sel * from dataload.showw_l;
TheDate
TheTime
DataBaseName
TableName
TableID
TableIDTAI
840
15/01/28
01:06:52.710000
dataload
t
0000130B0000
0
Vproc 2
Drive 2
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
LrgCyls
SmlCyls
TableType
3
0
PERM
Grade
GradePct .00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
3
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:06:52.710000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc 1
Drive 1
LrgCyls
2
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
2
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:06:52.710000
DataBaseName dataload
TableName t
TableID 0000130B0000
TableIDTAI
0
Vproc
0
Drive
0
LrgCyls
2
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
2
CylsinSSD
0
TemperaturesMature Y
TheDate 15/01/28
TheTime 01:06:52.710000
SQL 関数、演算子、式および述部
841
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
DataBaseName
TableName
TableID
TableIDTAI
dataload
t
0000130B0000
0
Vproc 3
Drive 3
LrgCyls
3
SmlCyls
0
TableType PERM
Grade
GradePct
.00
VHCyls
0
HotCyls
0
WarmCyls
0
ColdCyls
3
CylsinSSD
0
TemperaturesMature Y
データを長形式の画面に挿入する場合:
exec dbc.populatefsysinfotable('dataload','t','showwhere','l','','');
*** Warning: 3212 The stored procedure returned one or more result sets.
Date
15/01/28
Time 09:07:54
DB Name dataload
Tbl Name t
TID 0000130B0000
TID_TAI
0
Vproc
0
Drive
0
Lrg Cyls
2
Sml Cyls
TableType PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
2
Cyls in SSD
Temperatures Mature
Y
Date
15/01/28
Time
09:07:54
DB Name
dataload
Tbl Name
TID
t
0000130B0000
TID_TAI
842
0
Vproc
1
Drive
1
SQL 関数、演算子、式および述部
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
Lrg Cyls
2
Sml Cyls
TableType PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
2
Cyls in SSD
Temperatures Mature Y
Date 15/01/28
Time 09:07:54
DB Name dataload
Tbl Name t
TID 0000130B0000
TID_TAI
0
Vproc
2
Drive
2
Lrg Cyls
3
Sml Cyls
TableType
PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
3
Cyls in SSD
Temperatures Mature
Y
Date
15/01/28
Time
09:07:54
DB Name
dataload
Tbl Name
t
TID
0000130B0000
TID_TAI
0
Vproc
3
Drive
Lrg Cyls
3
3
Sml Cyls
TableType
PERM
Grade
Grade(%)
VH Cyls
Hot Cyls
Warm Cyls
Cold Cyls
3
Cyls in SSD
Temperatures Mature Y
SQL 関数、演算子、式および述部
843
第 18 章 ファイル システム情報マクロ
PopulateFsysInfoTable
PopulateFsysInfoTable_ANSI
844
SQL 関数、演算子、式および述部
第 19 章
LOB 関数
概要
この章では、BLOB (バイナリ ラージ オブジェクト)データ タイプおよび CLOB (キャ
ラクタ ラージ オブジェクト)データ タイプで使用する関数について説明します。
EMPTY_BLOB
目的
空(つまり内容が 0 バイト)の BLOB (バイナリ ラージ オブジェクト)を返します。
構文
EMPTY_BLOB (
)
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
EMPTY_BLOB は埋め込みサービス システム関数です 。
引数のタイプ
EMPTY_BLOB は、入力引数を受け取りません。
SQL 関数、演算子、式および述部
845
第 19 章 LOB 関数
EMPTY_CLOB
結果のタイプ
EMPTY_BLOB は、戻り値のデータ タイプが BLOB AS LOCATOR のスカラー関数です。
例
以下の問合わせを実行します。
UPDATE employee SET picture = EMPTY_BLOB();
picture 列を空の BLOB で更新します。
関連トピック
埋め込みサービス関数のアクティブ化と呼び出しの詳細については、「埋め込みサー
ビス システムの関数 」を参照してください。
EMPTY_CLOB
目的
空(つまり内容が 0 バイト)の CLOB (キャラクタ ラージ オブジェクト)を返します。
構文
EMPTY_CLOB (
)
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
EMPTY_CLOB は埋め込みサービス システム関数です 。
846
SQL 関数、演算子、式および述部
第 19 章 LOB 関数
EMPTY_CLOB
引数のタイプ
EMPTY_CLOB は、入力引数を受け取りません。
結果のタイプ
EMPTY_CLOB は、戻り値のデータ タイプが LATIN 文字セットの CLOB AS LOCATOR
のスカラー関数です。
例
以下の問合わせを実行します。
UPDATE student SET essay = EMPTY_CLOB();
essay 列を空の CLOB で更新します。
関連トピック
埋め込みサービス関数のアクティブ化と呼び出しの詳細については、「埋め込みサー
ビス システムの関数 」を参照してください。
SQL 関数、演算子、式および述部
847
第 19 章 LOB 関数
EMPTY_CLOB
848
SQL 関数、演算子、式および述部
第 20 章
論理述部
概要
この章では、SQL 論理述部について説明します。
論理述部は、比較演算子および条件式とも呼ばれます。ANSI SQL 規格では、論理述
部を検索条件と呼びます。
関連トピック
比較演算子の全般情報については、「比較演算子と関数の概要」を参照してください。
論理述部について
論理述部は、オペランドを、1 つ以上の別のオペランドに照らしてテストし、論理
(ブール値の TRUE、FALSE、または UNKNOWN)結果を評価します。
テストされたオペランドは、以下のうちの 1 つです。
•
•
•
•
•
•
列名
リテラル
算術式
派生 PERIOD などの期間式
DEFAULT 関数
システム変数に評価される 、CURRENT_DATE または USER などの組み込み関数
論理述部を使用する場所
論理述部は、主として WHERE、ON、HAVING のいずれかの句で使用し、 SELECT
文の中でテーブル式を評価するときに、行が条件にかなっているかどうかを示します。
論理述部は検索形式の CASE 式の中の WHEN 句検索条件で使用することができます。
実行するテストのタイプは、述部の機能です。
SQL 関数、演算子、式および述部
849
第 20 章 論理述部
論理述部について
論理プリミティブの集合としての条件式
条件式は、論理述部プリミティブの集合とみなすことができます。その評価の順序
は、論理演算子 AND、OR、NOT と、括弧の配置によって制御されます。
表面的には同じように見える条件式でも、個々のプリミティブをどのようにグルー
プ化するかによって、まったく違った結果を生成することがあります。したがって、
条件式のロジックを計画するときには、注意が必要です。
SQL がサポートしている論理述部プリミティブを以下の表にまとめます。Match 条
件と Unique 条件がサポートされていない点に留意してください。
論理述部プリミ
ティブ条件
SQL 論理述部
関数
比較
SQL 比較演算子の完全なリ 2 つのデータ値が等しいかどうかや、大き
ストについては、「サポー さの違いをテストします。
トされる比較演算子」を参
照してください。
範囲
BETWEEN/NOT BETWEEN
データ値が、列データ値の指定の範囲に
入っているかどうかをテストします。
類似
LIKE
指定の文字列と列データ値のパターン照合
をテストします。
入力
IN/NOT IN
データ値が、指定の列値セットのメンバー
であるかどうかをテストします。
IN は、= ANY と等価です。
NOT IN は、<> ALL と等価です。
すべて
ALL
データ値が、指定のセット内のすべての列
値との比較において TRUE であるかどうか
をテストします。
いずれか
ANY
SOME
データ値が、指定のセット内のいずれかの
列値との比較において TRUE であるかどう
かをテストします。
存在有無
EXISTS/NOT EXISTS
指定のテーブルに少なくとも 1 つの行が
あるかどうかをテストします。
期間述部
期間述部演算子の完全なリ
ストについては、「期間関
数および演算子」を参照し
てください。
操作対象:
• 2 つの期間式
• 2 つの派生 PERIOD
• 1 つの期間式と 1 つの派生 PERIOD
• 1 つの期間式と 1 つの日時式
TRUE、FALSE、または UNKNOWN に評
価されます。
850
SQL 関数、演算子、式および述部
第 20 章 論理述部
論理述部について
論理述部プリミ
ティブ条件
SQL 論理述部
関数
OVERLAPS
2 つの期間(派生 PERIOD など)が重なって
いるかどうかをテストします。
IS UNTIL_CHANGED/IS
NOT UNTIL_CHANGED
期間式(派生 PERIOD など)の終了境界が
UNTIL_CHANGED か(または、でないか)を
テストします。
述部に関与するデータ タイプに対する制限事項
以下の表の制限事項が、述部に関与する演算と、CLOB、BLOB、および UDT タイプ
に対して適用されます。
データ タ 制約事項
イプ
BLOB
述部は BLOB または CLOB データ型をサポートしていません。
CLOB
BLOB を BYTE および VARBYTE タイプに、CLOB を CHARACTER および
VARCHAR タイプに明示的にキャストし、結果を述部の中で使用することがで
きます。
UDT
LIKE および OVERLAPS 論理述部は、UDT をサポートしません。
EXISTS および NOT EXISTS の場合:述部オペランドとして複数の UDT が関与す
る場合、それらは、同一タイプでなければなりません。これは、Teradata
Database が述部オペランドとして関与する UDT に対して暗黙タイプ変換を行
なわないためです。
この制限事項に対する対処策としては、CREATE CAST を使用して、UDT どうし
の間でキャストを行なう CAST を定義してから、述部が関与する演算内で明示
的に CAST 関数を呼び出します。
CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、
B035-1144>を参照してください。
BETWEEN/NOT BETWEEN および IN/NOT の場合:
• 述部オペランドとして複数の UDT が関与する場合、それらは、同一タイプ
でなければなりません。これは、Teradata Database が述部オペランドとし
て関与する UDT に対して暗黙タイプ変換を行なわないためです。
この制限事項に対する対処策としては、CREATE CAST を使用して、UDT ど
うしの間でキャストを行なう CAST を定義してから、述部が関与する演算内
で明示的に CAST 関数を呼び出します。
• 述部オペランドとして関与する UDT では、順序付けが定義されていなけれ
ばなりません。
SQL 関数、演算子、式および述部
851
第 20 章 論理述部
論理演算子と検索条件
データ タ 制約事項
イプ
Teradata Database は、ソース タイプが LOB でない DISTINCT 型 UDT の順
序付け機能を生成します。STRUCTURED 型 UDT またはソース タイプが LOB
である DISTINCT 型 UDT の順序付け定義を作成するときや、システム生成
の順序付け機能を置き換えるときは、CREATE ORDERING を使用します。
CREATE CAST と CREATE ORDERING の詳細は、<SQL データ定義言語 - 構文規
則および例、B035-1144>を参照してください。
述部に関与する DEFAULT 関数の制限事項
DEFAULT 関数は、列のデフォルト値を返します。これには、 列名を指定する形式
と、列名を省略する形式があります。述部は、両方の形式の DEFAULT 関数をサポー
トしていますが、DEFAULT 関数が列名を省略した場合は、次の条件が TRUE になり
ます。
• 述部が比較演算子を使用している。
• 比較には、単一の列参照のみを含めることができる。
• DEFAUL 関数が式の一部ではない。
たとえば、次の文は DEFAULT 関数を使用して Dept_No 列の値と Dept_No 列のデ
フォルト値を比較しています。比較操作には、単一の列参照が含まれるため、列名
が省略されていても、Teradata Database は DEFAULT 関数の列の文脈を派生できま
す。
SELECT * FROM Employee WHERE Dept_No < DEFAULT;
DEFAULT 関数が NULL と評価されると、述部は不明になり、WHERE 条件は FALSE
になります。
論理演算子と検索条件
検索条件または条件式は、以下の 1 つ以上の論理述部と接続している 1 つ以上の条
件項目からなっています。
•
•
•
•
•
•
•
•
852
比較演算子
BETWEEN/NOT BETWEEN
LIKE
IN/NOT IN
ALL または ANY/SOME
EXISTS/NOT EXISTS
OVERLAPS
IS NULL/IS NOT NULL
SQL 関数、演算子、式および述部
第 20 章 論理述部
論理演算子と検索条件
論理演算子
検索条件の結果を判別するために述部の結果に適用する演算子。
論理演算子には、以下のものがあります。
• AND
• NOT
• OR
以下に例を示します。
expression_1
OR
expression_2
OR
expression_3
NOT は、式などを否定するために使用します。
expression_1
AND NOT
expression_2
検索条件を使用する場所
検索条件は、WHERE、ON、QUALIFY、RESET WHEN または HAVING 句など、さ
まざまな SQL 句で使用できます。
HAVING 句で使用する場合は、集合演算子と一緒に論理式を使用できます。
たとえば次の問合わせは、HAVING 句の検索条件を使用して、部門番号が 100、
300、500、600 のいずれかであり、35,000 ドル≦給与の平均≦55,000 ドルであ
る部門を Employee テーブルから選択します。
SELECT AVG(Salary)
FROM Employee
WHERE DeptNo IN (100,300,500,600)
GROUP BY DeptNo
HAVING AVG(Salary) BETWEEN 35000 AND 55000 ;
評価の順序の規則
条件式の評価順序には、次の規則が適用されます。
• 式が同じ演算子を複数個含んでいる場合、その評価の順序は左から右です。
• 式に論理演算子の組み合わせが含まれている場合、評価の順序は以下のようにな
ります。
NOT
AND
OR
• 括弧を使用して、希望する評価の順序にすることができます。
• 条件式内の論理式は、常に左から右へと評価されるとは限りません。
SQL 関数、演算子、式および述部
853
第 20 章 論理述部
論理演算子と検索条件
論理式が評価される順序に条件式の正確性が左右される場合は、その条件式は避
けなければなりません。
たとえば、次の 2 つの式を比較します。
F2/(NULLIF(F1,0)) > 500
F1 <> 0 AND F2/F1 > 500
最初の式では、ゼロによる除算になることはありません。
2 番目の式では、その評価の順序によりゼロによる除算もあるため、エラーとな
ることがあります。
評価の結果
条件式内の各論理式は、以下の 3 つの結果のいずれかに評価されます。
• TRUE
• FALSE
• UNKNOWN
AND 真偽テーブル
以下の表は、検索条件の評価で使用される AND 論理を示したものです。
x FALSE
x UNKNOWN
x TRUE
y FALSE
FALSE
FALSE
FALSE
y UNKNOWN
FALSE
UNKNOWN
UNKNOWN
y TRUE
FALSE
UNKNOWN
TRUE
OR 真偽テーブル
以下の表は、検索条件の評価で使用される OR 論理を示したものです。
x FALSE
x UNKNOWN
x TRUE
y FALSE
FALSE
UNKNOWN
TRUE
y UNKNOWN
UNKNOWN
UNKNOWN
TRUE
y TRUE
TRUE
true
TRUE
NOT 真偽テーブル
以下の表は、検索条件の評価で使用される NOT 論理を示したものです。
結果
854
SQL 関数、演算子、式および述部
第 20 章 論理述部
論理演算子と検索条件
x FALSE
TRUE
x UNKNOWN
UNKNOWN
x TRUE
FALSE
SUBQUERY に関する制限
Subquery での検索条件の述部で SELECT AND CONSUME 文を指定できません。
検索条件における論理演算子の例
以下の例は、検索条件における論理演算子の使用法を示したものです。
次の例は、検索条件を使用して、高校を卒業していて少なくとも 12 年の学歴があ
るか、2 年を超える職務経験がある者の名前を Profile というユーザー テーブルか
ら選択します。
SELECT Name
FROM Profile
WHERE YrsExp > 2
OR (EdLev >= 12 AND Grad = 'Y') ;
次の文は、管理者番号が 10007 または 10012 のすべての社員のリストを要求しま
す。管理者情報は Department (部門)テーブルに含まれ、従業員情報は Employee
テーブルに含まれています。この要求は、2 つのテーブルの共通の列である DeptNo
でテーブルを結合させることによって処理します。
参照における曖昧さを避けるために、DeptNo を完全に修飾しなければなりません。
さらに、OR のある IN 条件をまとめるために、追加の括弧が必要なことにも注意す
る必要があります。それがないと、結果は直積(デカルト積)となります。
SELECT EmpNo,Name,JobTitle,Employee.DeptNo,Loc
FROM Employee,Department
WHERE (Employee.DeptNo=Department.DeptNo)
AND ((Employee.DeptNo IN
(SELECT Department.DeptNo
FROM Department
WHERE MgrNo=10007))
OR (Employee.DeptNo IN
(SELECT Department.DeptNo
FROM Department
WHERE MgrNo=10012))) ;
Department テーブルが次の行を含んでいると想定します。
SQL 関数、演算子、式および述部
855
第 20 章 論理述部
ANY/ALL/SOME 数量詞
DeptNo
Department
Loc
MgrNo
100
Administration
NYC
10005
600
Manufacturing
CHI
10007
500
Engineering
ATL
10012
300
Exec Office
NYC
10018
700
Marketing
NYC
10021
結合文は、次の結果を返します。
EmpNo
Name
JobTitle
DeptNo
Loc
10012
Watson L
Vice Pres
500
ATL
10004
Smith T
Engineer
500
ATL
10014
Inglis C
Tech Writer
500
ATL
10009
Marston A
Secretary
500
ATL
10006
Kemper R
Assembler
600
CHI
10015
Omura H
Programmer
500
ATL
10007
Aguilar J
Manager
600
CHI
10010
Reed C
Technician
500
ATL
10013
Regan R
Purchaser
600
CHI
10016
Carter J
Engineer
500
ATL
10019
Newman P
Test Tech
600
CHI
ANY/ALL/SOME 数量詞
目的
比較演算または IN/NOT IN 述部での数量化を可能にします。
856
SQL 関数、演算子、式および述部
第 20 章 論理述部
ANY/ALL/SOME 数量詞
構文
,
expression
comparison_operator
IN
NOT
expression
comparison_operator
IN
NOT
OR
literal
ALL
ANY
SOME
(
ALL
ANY
SOME
( subquery )
)
Literals
syntax
Subquery
syntax
,
(
expression
)
comparison_operator
IN
NOT
ALL
ANY
SOME
( subquery )
構文要素
expression
値を指定する式。
comparison_operator
式または式のリストとリスト(リテラル構文)内のリテラルまたは副問合わせ(副問合
わせ構文)を比較して、TRUE、FALSE、または UNKNOWN の結果を生成する比較演
算子。
[NOT] IN
式、リテラル(リテラル構文)のリスト内の式のリスト、または副問合わせ(副問合わ
せ構文)が存在するかどうかをテストして、TRUE、FALSE、または UNKNOWN の結
果を生成する述部。
literal
定数値。
subquery
式または式のリストで指定された数と同じ数の式を選択する副問合わせ。
Subquery で SELECT AND CONSUME 文を指定することはできません。
ANSI への準拠
ANY、SOME、および ALL は、ANSI SQL:2011 準拠の数量詞です。
SQL 関数、演算子、式および述部
857
第 20 章 論理述部
ANY/ALL/SOME 数量詞
ANY/ALL/SOME 数量詞とリテラル構文
リテラルのリストが数量詞と比較演算または IN/NOT IN 述部と共に使用される場
合、結果は以下のように決定されます。
述部
指定
結果が真になる場合
比較演算
ALL
expression とリスト内のすべてのリテラルとの比
較の結果が真になる場合
ANY
expression とリスト内のいずれかのリテラルとの
比較の結果が真になる場合
SOME
IN
ALL
expression はリスト内のすべてのリテラルに等し
くなります。
ANY
expression はリスト内いずれのリテラルとも等し
くなります。
SOME
NOT IN
ALL
expression はリスト内のいずれのリテラルにも等
しくなりません。
ANY
expression はリスト内いずれのリテラルとも等し
くなりません。
SOME
比較演算では、暗黙の変換の規則は比較演算子の規則と同じです。
expression が NULL に評価されると、結果は不明とみなされます。
ANY/ALL/SOME 数量詞と SUBQUERY 構文
Subquery が数量詞と比較演算または IN/NOT IN 述部と共に使用される場合、結果
は以下のように決定されます。
指定する数量詞 述部
結果
条件
ALL
比較演算
TRUE
expression によって戻された値セットに含ま
れるすべての値と subquery との比較の結果が
真になる場合。
IN
TRUE
expression は、subquery によって戻される値
のセット内のすべての値に等しくなります。
NOT IN
TRUE
expression は、subquery によって戻される値
のセット内のどの値にも等しくなりません。
比較演算
TRUE
subquery が値を返さない場合。
ALL
IN
858
SQL 関数、演算子、式および述部
第 20 章 論理述部
ANY/ALL/SOME 数量詞
指定する数量詞 述部
結果
条件
比較演算
TRUE
expression によって戻された値セットに含ま
れる少なくとも 1 つの値と subquery との比
較が真になる場合。
IN
TRUE
expression は、subquery によって戻される値
のセット内の 1 つ以上の値に等しくなります。
NOT IN
TRUE
expression は、subquery によって返される値
のセット内の 1 つ以上の値に等しくなりませ
ん。
比較演算
FALSE
subquery が値を返さない場合。
NOT IN
ANY
SOME
IN
NOT IN
ANY/ALL/SOME と比較演算子の使用に相当するもの
次の表に、ANY/ALL/SOME 数量詞に相当するものを示します。ここで op は比較演
算子を表わします。
式
等価である式
x op ALL (:a, :b, :c)
(x op :a) AND (x op :b) AND (x op :c)
x op ANY (:a, :b, :c)
(x op :a) OR (x op :b) OR (x op :c)
x op SOME (:a, :b, :c)
以下に例を示します。
式
等価である式
x < ALL (:a, :b, :c)
(x < :a) AND (x < :b) AND (x < :c)
x > ANY (:a, :b, :c)
(x > :a) OR (x > :b) OR (x > :c)
x > SOME (:a, :b, :c)
ANY/ALL/SOME と IN/NOT IN の使用に相当するもの
次の表に、ANY/ALL/SOME 数量詞に相当するものを示します。ここで op は IN ま
たは NOT IN を表わします。
式
等価である式
NOT (x op ALL (:a, :b, :c))
x NOT op ANY (:a, :b, :c)
SQL 関数、演算子、式および述部
859
第 20 章 論理述部
ANY/ALL/SOME 数量詞
式
等価である式
x NOT op SOME (:a, :b, :c)
NOT (x op ANY (:a, :b, :c))
x NOT op ALL (:a, :b, :c)
NOT (x op SOME (:a, :b, :c))
op が NOT IN の場合は、NOT op は IN であり、NOT NOT IN ではありません。
以下に例を示します。
式
等価である式
NOT (x IN ANY (:a, :b, :c))
x NOT IN ALL (:a, :b, :c)
NOT (x IN ALL (:a, :b, :c))
x NOT IN ANY (:a, :b, :c)
NOT (x NOT IN ANY (:a, :b, :c))
x IN ALL (:a, :b, :c)
NOT (x NOT IN ALL (:a, :b, :c))
x IN ANY (:a, :b, :c)
例
例
以下の文は、比較演算子と ANY 数量詞を使って、部門 100、300、500 に所属して
いる社員の社員番号、名前、部門番号を選び出します。
式
等価である式
SELECT EmpNo, Name, DeptNo
FROM Employee
WHERE DeptNo = ANY (100,300,500) ;
SELECT EmpNo, Name, DeptNo
FROM Employee
WHERE (DeptNo = 100)
OR (DeptNo = 300)
OR (DeptNo = 500) ;
且つ
SELECT EmpNo, Name, DeptNo
FROM Employee
WHERE DeptNo IN (100,300,500) ;
例
ALL 数量詞を指定する比較操作で subquery を使用する例を次に示します。
SELECT EmpNo, Name, JobTitle, Salary, YrsExp
FROM Employee
WHERE (Salary, YrsExp) >= ALL
(SELECT Salary, YrsExp FROM Employee) ;
860
SQL 関数、演算子、式および述部
第 20 章 論理述部
BETWEEN/NOT BETWEEN
例
この例は、ANY/ALL/SOME の動作を示したものです。
テーブルの定義と内容は、次のものを想定します。
CREATE
INSERT
INSERT
INSERT
INSERT
INSERT
TABLE t (x INTEGER);
t (1);
t (2);
t (3);
t (4);
t (5);
問合わせ
結果
SELECT * FROM t WHERE x IN ANY (1,2)
1, 2
SELECT * FROM t WHERE x = SOME (1,2)
1, 2
SELECT * FROM t WHERE x NOT IN ALL (1,2)
3, 4, 5
SELECT * FROM t WHERE NOT (x IN ANY (1,2))
3, 4, 5
SELECT * FROM t WHERE NOT (x = SOME (1,2))
3, 4, 5
SELECT * FROM t WHERE x NOT IN SOME (1, 2)
1, 2, 3, 4, 5
SELECT * FROM t WHERE x NOT = ANY (1, 2)
1, 2, 3, 4, 5
SELECT * FROM t WHERE x IN ALL (1,2)
行なし
SELECT * FROM t WHERE NOT (x NOT IN SOME (1,2))
行なし
SELECT * FROM t WHERE x = ALL (1,2)
行なし
SELECT * FROM t WHERE NOT (x NOT = ANY (1,2))
行なし
BETWEEN/NOT BETWEEN
目的
式の値が、2 つの別の式値の間にあるかどうかをテストします。
構文
expr1
BETWEEN
expr2
AND
expr3
NOT
SQL 関数、演算子、式および述部
861
第 20 章 論理述部
EXISTS/NOT EXISTS
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
BETWEEN テストは、以下の条件が真の場合に、合格となります。
expression_2 <= expression_1 <= expression_3
BETWEEN テストが失敗すると、行は返されません。
BETWEEN テストは、2 つの別個の論理比較として処理されます。
expression_1 >= expression_2 AND expression_1 <= expression_3.
式
等価である式
x BETWEEN y AND z
((x >= y) AND (x <=z))
expression_1 は実際には 2 回評価されるため、RANDOM のような非確定的な関数
を使用した場合、予期しない結果が生じることがあることに注意してください。
例
次の例は、HAVING 句の検索条件を使用して、部門番号が 100、300、500、600
のいずれかであり、35,000 ドル≦給与の平均≦55,000 ドルである部門を Employee
テーブルから選択します。
SELECT AVG(Salary)
FROM Employee
WHERE DeptNo IN (100,300,500,600)
GROUP BY DeptNo
HAVING AVG(Salary) BETWEEN 35000 AND 55000 ;
EXISTS/NOT EXISTS
目的
指定のテーブル(普通は派生テーブル)をテストして、少なくとも 1 つの行があるかど
うかを調べます(つまり、そのテーブルが空でないかどうかをテストします)。
EXISTS は、WHERE 句内の検索条件の述部としてサポートされています。
構文
EXISTS
subquery
NOT
862
SQL 関数、演算子、式および述部
第 20 章 論理述部
EXISTS/NOT EXISTS
構文要素
subquery
式または式のリストで指定された数と同じ数の式を選択する副問合わせ。
Subquery で SELECT AND CONSUME 文を指定することはできません。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
使用上の注意
EXISTS 述部の機能は、subquery の結果をテストすることです。
Subquery の実行によって応答行が返された場合は、WHERE 条件が満たされている
とみなされます。
EXISTS 述部に NOT 修飾子を使用すると、テストの意味が逆になります。Subquery
の実行が実際に応答行を返していません。むしろ、要求された場合に応答が返され
たかどうかを示すブール値が返されます。
SUBQUERY に関する制限
Subquery で SELECT AND CONSUME 文を指定することはできません。
EXISTS/NOT EXISTS と IN/NOT IN の関係
EXISTS 述部は、subquery の指定の行があるかどうかをテストします。一般に、
EXISTS は、比較を IN と置き換えるため、NOT EXISTS は比較を NOT IN と置き換
えるために使用できますが、その逆は当てはまりません。EXISTS 述部や NOT EXISTS
述部、あるいはその両方を使用しないと解決できない問題もあります。例えば、
「For ALL」を参照してください。
例
t1 において、x1 列の値が t2 の x2 列の値と等しい行を選び出すには、以下のいず
れかの問合わせを使用します。
SELECT *
FROM t1
WHERE x1 IN
(SELECT x2
FROM t2);
SELECT *
SQL 関数、演算子、式および述部
863
第 20 章 論理述部
EXISTS/NOT EXISTS
FROM t1
WHERE EXISTS
(SELECT *
FROM t2
WHERE t1.x1=t2.x2);
t1 において、x1 列の値が t2 の x2 列のいずれの値とも等しくない行を選び出すに
は、以下のいずれかの問合わせを使用します。
SELECT *
FROM t1
WHERE x1 NOT IN
(SELECT x2
FROM t2);
SELECT *
FROM t1
WHERE NOT EXISTS
(SELECT *
FROM t2
WHERE t1.x1=t2.x2);
SELECT 'T1 is not empty'
WHERE EXISTS
(SELECT *
FROM t1);
SELECT 'T1 is empty'
WHERE NOT EXISTS
(SELECT *
FROM t1);
EXISTS 述部と NOT IN +NULL の比較
以下の条件が真の場合は、NOT IN の代わりに NOT EXISTS 述部を使用してください。
• NOT IN 条件のいずれかの列が null 可能として定義されている。
• 主問合わせから、NOT IN 条件のいずれかの列に null が入っているいずれかの行
が常に返される必要がある。
• Subquery の選択リストで返される null によって、主問合わせが行を返すのが妨
げられてはならない。
たとえば、以下の問合わせについてこれまでのすべての条件が真になる場合は、NOT
IN ではなく NOT EXISTS を使用してください。
SELECT dept, DeptName
FROM Department
864
SQL 関数、演算子、式および述部
第 20 章 論理述部
EXISTS/NOT EXISTS
WHERE Dept NOT IN
(SELECT Dept
FROM Course);
NOT EXISTS を使用したバージョンは次のようになります。
SELECT dept, DeptName
FROM Department
WHERE NOT EXISTS
(SELECT Dept
FROM Course
WHERE Course.Dept=Department.Dept);
つまり、Course.Dept と Department.Dept のいずれかが null 可能であり、
Department から Dept の null の行が返される必要があり、Course.Dept の null が、
Department から行が返されるのを妨げてはならないということです。
ALL の場合
ネストした 2 つの NOT EXISTS を使って、「列内のどの(論理∀)値にも、(論理∃)が
存在する…」という概念を具体化した SELECT 文を記述することができます。
例えば、図書館にすべての出版社の本が少なくとも 1 冊存在する場合に「TRUE」
値を選択する問合わせは、以下のように記述できます。
SELECT 'TRUE'
WHERE NOT EXISTS
(SELECT *
FROM publisher pb
WHERE NOT EXISTS
(SELECT *
FROM book bk
WHERE pb.PubNum=bk.PubNum);
NOT EXISTS 句とストアド プロシージャ
ストアド プロシージャの条件式がローカル変数、パラメータ、またはカーソルの別
名も参照する場合、その条件式に NOT EXISTS 句を指定することはできません。
NOT EXISTS と再帰的問合わせ
NOT EXISTS は、再帰的問合わせの再帰文では使用できません。ただし、再帰的問
合わせの中の非再帰シード文で NOT EXISTS 述部を指定することができます。
SQL 関数、演算子、式および述部
865
第 20 章 論理述部
EXISTS/NOT EXISTS
例
例: EXISTS と相関 SUBQUERY
いずれかの部門が提供するクラスの少なくとも 1 つに登録しているすべての生徒の
名前を選び出してみましょう。
SELECT SName, SNo
FROM student s
WHERE EXISTS
(SELECT *
FROM department d
WHERE EXISTS
(SELECT *
FROM course c, registration r, class cl
WHERE c.Dept=d.Dept
AND c.CNo=r.CNo
AND s.SNo=r.SNo
AND r.CNo=cl.CNo
AND r.Sec=cl.Sec));
生徒テーブルの内容は、以下のようになります。
Sname
SNo
Helen Chu
1
Alice Clark
2
Kathy Kim
3
Tom Brown
4
部門テーブルの内容は、以下のようになります。
Dept
DeptName
100
Computer Science
200
Physic
300
Math
400
Science
コース テーブルの内容は、以下のようになります。
866
CNo
Dept
10
100
11
100
SQL 関数、演算子、式および述部
第 20 章 論理述部
EXISTS/NOT EXISTS
CNo
Dept
12
200
13
200
14
300
クラス テーブルの内容は、以下のようになります。
CNo
Sec
10
1
11
1
12
1
13
1
14
1
登録テーブルの内容は、以下のようになります。
CNo
SNo
Sec
10
1
1
10
2
1
11
3
1
12
1
1
13
2
1
14
1
1
以下の行が返されます。
SName
----------Helen Chu1
Alice Clark
Kathy Kim
SNo
--*
2
3
例: NOT EXISTS と相関 SUBQUERY
コースを提供している各部門が提供するクラスの少なくとも 1 つに登録しているす
べての生徒の名前を選び出してみましょう。
SELECT SName, SNo
FROM student s
WHERE NOT EXISTS
(SELECT *
SQL 関数、演算子、式および述部
867
第 20 章 論理述部
IN/NOT IN
FROM department d
WHERE d.Dept IN
(SELECT Dept
FROM course) AND NOT EXISTS
(SELECT *
FROM course c, registration r, class cl
WHERE c.Dept=d.Dept
AND c.CNo=r.CNo
AND s.SNo=r.SNo
AND r.CNo=cl.CNo
AND r.Sec=cl.Sec)));
「例: EXISTS と相関 SUBQUERY」のテーブルの内容にあるように、以下の行が返され
ます。
SName
----Helen Chu
SNo
--1
関連トピック
詳細は、以下を参照してください。
• 相関 subquery についての詳細な説明は、< SQL データ操作言語、B035-1146>の
「相関 SUBQUERY」を参照してください。
IN/NOT IN
目的
比較可能な集合の中に式または式のリストの値が存在するかどうかを次のいずれか
の方法でテストします。
• 式の値を、明示したリテラルのリスト内の値と比較します。
• 式のリスト内の値を、subquery 内の対応する式の集合内の値と比較します。
構文
expression_1
IN
expression_2
,
NOT
OR
(
literal
signed_literal_1
)
TO
signed_literal_2
datetime_literal
868
SQL 関数、演算子、式および述部
第 20 章 論理述部
IN/NOT IN
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
リテラルのリストでの TO の使用は、ANSI 標準の Teradata 拡張機能です。
expression IN および NOT IN expression またはリテラル
構文要素
expression_1
expression_2 内で、またはリテラル、signed_literal TO signed_literal、または
datetime_literal のいずれかで指定されたリテラルの明示リスト内で存在がテストさ
れる式の値。
IN
含まれているものをテストするのか、含まれていないものをテストするのかを指定
します。
代用可能
• IN ANY
• IN SOME
• = ANY
• = SOME
IN(ただしリテラルのリストが指定されていてそこに signed_literal_1 TO
signed_literal_2 が含まれる場合を除く)
代用可能
• <> ALL
• NOT IN ALL
expression_2
expression_1 の存在がテストされる値。
literal
• リテラル
• マクロ パラメータ
• TIME や DATE などの組み込み値
signed_literal_1 TO signed_literal_2
リテラルの範囲。
datetime_literal
ANSI DateTime リテラル。
SQL 関数、演算子、式および述部
869
第 20 章 論理述部
IN/NOT IN
結果
IN がリテラルのリストともに使用された場合、expression_1 の値が次のときに結果
が真になります。
• リスト内のいずれかのリテラルに等しい。
• signed_literal_1 と signed_literal_2 の間(これらの値を含む)にある
(signed_literal_1 が signed_literal_2 より小さいか等しい場合)。
• signed_literal_2 と signed_literal_1 の間(これらの値を含む)にある
(signed_literal_2 が signed_literal_1 より小さい場合)
expression_1 の値が NULL の場合、結果は不明となります。
expression_1 の値が非 NULL の場合は、結果が真意なるためのいずれの条件も満た
されないので、結果は偽になります。
この形式を使用すると、式がリテラル リスト内のいずれかと等しい場合、IN 検索条
件が満たされます。式がリテラルのリスト内のどの値とも等しくない場合は、NOT
IN 条件が満たされます。
条件が真になる形式
条件
expression_1 IN expression_2
expression_1 = expression_2
expression_1 NOT IN expression_2
expression_1 <> expression_2
expression_1 IN (const_1, const_2)
(expression_1 = const_1) OR (expression_1 =
const_2)
expression_1 NOT IN (const_1,
const_2)
(expression_1 <> const_1) AND (expression_1 <>
const_2)
expression_1 IN (signed_const_1 TO (signed_const_1 <= expression_1) AND
signed_const_2)
(expression_1 <= signed_const_2)
signed_const_1 <= signed_const_2
expression_1 IN (signed_const_1 TO (signed_const_2 <= expression_1) AND
signed_const_2)
(expression_1 <= signed_const_1)
signed_const_2 < signed_const_1
expression_1 NOT IN
(expression_1 < signed_const_1) OR (expression_1 >
(signed_const_1 TO signed_const_2) signed_const_2)
signed_const_1 <= signed_const_2
expression_1 NOT IN
(expression_1 < signed_const_2) OR (expression_1 >
(signed_const_1 TO signed_const_2) signed_const_1)
signed_const_2 < signed_const_1
以下に例を示します。
870
SQL 関数、演算子、式および述部
第 20 章 論理述部
IN/NOT IN
文
等価である文
SELECT DeptNo
FROM Department
WHERE DeptNo IN (500, 600);
SELECT DeptNo
FROM Department
WHERE (DeptNo = 500)
OR (DeptNo = 600);
UPDATE Employee
SET Salary=Salary + 200
WHERE DeptNo NOT IN (100, 700);
UPDATE Employee
SET Salary=Salary + 200
WHERE (DeptNo ^= 100)
AND (DeptNo ^= 700);
使用上の注意
IN が単一語の演算子と共に使用される場合、その演算子は、リテラル、または式と
することができます。複数語の演算子が使用される場合には、その演算子はリテラ
ルから構成されなければなりません。式を使用することはできません。
expression_1 データ型とリテラル値は互換性がなければなりません。暗黙の変換の
規則は、比較演算子のそれと同じです。
IN/NOT IN と EXISTS/NOT EXISTS の関係
一般に、EXISTS は、比較を IN と置き換えるため、NOT EXISTS は比較を NOT IN
と置き換えるために使用できますが、その逆は当てはまりません。問題によっては、
EXISTS 述部または NOT EXISTS 述部を使って解決しなければならないものもありま
す。EXISTS および NOT EXISTS については、「EXISTS / NOT EXISTS」を参照して
ください。
IN/NOT IN、NOT、および ANY/ALL/SOME の使用に相当するもの
次の表に、ANY/ALL/SOME 数量詞に相当するものを示します。ここで op は IN ま
たは NOT IN を表わします。
使用法
等価である式
NOT (x op ALL (:a, :b, :c))
x NOT op ANY (:a, :b, :c)
x NOT op SOME (:a, :b, :c)
NOT (x op ANY (:a, :b, :c))
x NOT op ALL (:a, :b, :c)
NOT (x op SOME (:a, :b, :c))
NOT (x op (:a, :b, :c))
x NOT op (:a, :b, :c)
相当するものとして示しているものの中で、op が NOT IN の場合は、NOT op は IN
であり、NOT NOT IN ではありません。
以下に例を示します。
SQL 関数、演算子、式および述部
871
第 20 章 論理述部
IN/NOT IN
式
等価である式
NOT (x IN ANY (:a, :b, :c))
x NOT IN ALL (:a, :b, :c)
NOT (x IN ALL (:a, :b, :c))
x NOT IN ANY (:a, :b, :c)
NOT (x NOT IN ANY (:a, :b, :c))
x IN ALL (:a, :b, :c)
NOT (x NOT IN ALL (:a, :b, :c))
x IN ANY (:a, :b, :c)
NOT (x IN (:a, :b, :c))
x NOT IN (:a, :b, :c)
NOT (x NOT IN (:a, :b, :c))
x IN (:a, :b, :c)
構文 2: expression IN および NOT IN subquery
この IN および NOT IN の構文は、次のいずれかの形式です。
expression
IN
(
)
subquery
NOT
,
(
expression
IN
)
(
subquery
)
NOT
構文要素
expression
subquery 内で存在がテストされる式の値。
subquery
示された検索基準を満たす値を返す SELECT 文。
subquery は、次のようにする必要があります。
• 括弧で囲まなければなりません。
• セミコロンで終了してはなりません。
• 式のリストで定義された数と同じ数の式を選択しなければなりません。
• SELECT AND CONSUME 文を指定できません。
IN での Null の動作
Subquery に IN が使用されている場合には、文の結果に null の列値は含まれません。
NOT IN での Null の動作
次の表は、各種の形式の問合わせにおける NOT IN での null の動作をまとめたもの
です。
872
SQL 関数、演算子、式および述部
第 20 章 論理述部
IN/NOT IN
問合わせの形式
条件
SELECT ... FROM T1
WHERE x NOT IN
(SELECT y FROM T2);
y の値の 1 つが null の 問合わせ全体を通じて T1
場合
の行は返されません。
SELECT ...FROM T1
WHERE expression_list_1 NOT IN
(SELECT expression_list_2
FROM T2);
Subquery によって行 x に null を含む T1 の行
が返される場合、およ は返されません。
び x に null が含まれ
る場合
expression_list_2 の最 どの行も T1 から返され
初のフィールドが null ません。
の場合
expression_list_2 の最 行が返されます。
初のフィールド以外の
フィールドに null があ
る場合
Subquery が行を返す
場合、および
expression_list_1 の最
初のフィールドに null
がある場合
SELECT ... FROM T1
WHERE expression_list_1 NOT IN
(SELECT expression_list_2
FROM T2
WHERE search_condition);
結果
expression_list_1 の最初
のフィールドに null を含
む T1 の行は、返されま
せん。
expression_list_1 の最初
search_condition が行 のフィールドに NULL が
を返さない場合
あるものも含めて、T1 の
すべての行が返されます。
T2 に対する
NOT IN 句とストアド プロシージャ
ストアド プロシージャの条件式がローカル変数、パラメータ、またはカーソルの別
名も参照する場合、その条件式に NOT IN 句を指定することはできません。
NOT IN と再帰的問合わせ
NOT IN は、再帰的問合わせの再帰文では使用できません。ただし、再帰的問合わ
せの中の非再帰シード文で NOT IN 述部を指定することができます。
問合わせに大きな NOT IN 句を使用すると失敗することがある
IN または NOT IN 句に多数の引数を含む問合わせは、失敗することがあります。
たとえば、IN 句に 16000 の引数を使った次の問合わせを実行して、失敗したとし
ます。
SQL 関数、演算子、式および述部
873
第 20 章 論理述部
IN/NOT IN
SELECT MAX(emp_num)
FROM employee
WHERE emp_num IN(1,2,7,8,...,121347);
この問題が起きたときの回避策は、IN 句の中の引数を含めた一時テーブルまたは揮
発性テーブルを使用して問合わせを書き直すことです。
以下の文を使用すると同じ選択を行なうことができますが、失敗は起こりません。
CREATE VOLATILE TABLE temp_IN_values (
in_value INTEGER) ON COMMIT PRESERVE ROWS;
INSERT INTO temp_IN_values
SELECT emp_num
FROM table_with_emp_num_values;
新しい問合わせは、次のようになります。
SELECT MAX(emp_num)
FROM employee AS e JOIN temp_IN_values AS en
ON (e.emp_num = en.in_value);
例
例: Atlanta の従業員の検索
次の文は、Atlanta で働くすべての社員の名前を検索します。
SELECT Name
FROM Employee
WHERE DeptNo IN
(SELECT DeptNo
FROM Department
WHERE Loc = 'ATL');
例: DeptNo に 2 つの列がある場合の検索
似た例ですが、DeptNo が 2 つの列に分けられていると想定すると、次の文を使用す
ることができます。
SELECT Name
FROM Employee
WHERE (DeptNoA, DeptNoB) IN
(SELECT DeptNoA, DeptNoB
FROM Department
WHERE Loc = 'LAX') ;
874
SQL 関数、演算子、式および述部
第 20 章 論理述部
IS NULL/IS NOT NULL
例: IN/NOT IN およびリテラルのリストの使用
この例は、リテラル リストを使用した IN/NOT IN の動作を示しています。
テーブルの定義と内容は、次のものを想定します。
CREATE
INSERT
INSERT
INSERT
INSERT
INSERT
TABLE t (x INTEGER);
t (1);
t (2);
t (3);
t (4);
t (5);
問合わせ
結果
SELECT * FROM t WHERE x IN (1,2)
1, 2
SELECT * FROM t WHERE x IN ANY (1,2)
1, 2
SELECT * FROM t WHERE NOT (x NOT IN (1,2))
1, 2
SELECT * FROM t WHERE x NOT IN (1,2)
3, 4, 5
SELECT * FROM t WHERE x NOT IN ALL (1,2)
3, 4, 5
SELECT * FROM t WHERE NOT (x IN (1, 2))
3, 4, 5
SELECT * FROM t WHERE NOT (x IN ANY (1,2))
3, 4, 5
SELECT * FROM t WHERE x IN (3 TO 5)
3, 4, 5
SELECT * FROM t WHERE x NOT IN SOME (1, 2)
1, 2, 3, 4, 5
SELECT * FROM t WHERE x IN (1, 2 TO 4, 5)
1, 2, 3, 4, 5
SELECT * FROM t WHERE x IN ALL (1,2)
行なし
SELECT * FROM t WHERE NOT (x NOT IN SOME (1,2))
行なし
SELECT * FROM t WHERE x NOT IN (1 TO 5)
行なし
IS NULL/IS NOT NULL
目的
式の中に NULL 値を探したり、除外したりします。
構文
expression
IS
NULL
NOT
SQL 関数、演算子、式および述部
875
第 20 章 論理述部
IS NULL/IS NOT NULL
構文要素
expression
null のテスト対象の値を指定する式。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
例
例
部門を割り当てられていないすべての社員の名前を検索するには、次の文を入力し
ます。
SELECT Name
FROM Employee
WHERE DeptNo IS NULL;
この問合わせの結果は、DeptNo フィールドが null であるすべての社員の名前です。
例
その反対に、部門が割り当てられているすべての社員の名前を検索するには、次の
文を入力します。
SELECT Name
FROM Employee
WHERE DeptNo IS NOT NULL;
この問合わせは、DeptNo フィールドの値が非 NULL の従業員全員の名前を返します。
例: 同じ文中での NULL および NOT-NULL の検索
同じ文中で NULL 値と非 NULL 値を検索するには、NULL の検索条件を別に示さな
ければなりません。
例えば、肩書が Manager または Vice Pres 以外のすべての社員の名前と、JobTitle
列が null のすべての社員の名前を選択するには、次の文を入力します。
SELECT Name, JobTitle
FROM Employee
WHERE (JobTitle NOT IN ('Manager' OR 'Vice Pres'))
OR (JobTitle IS NULL) ;
876
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
例: Null を含む可能性のあるテーブルの検索
null 値を含んでいるかもしれないテーブルの検索時には、特に注意しなければなり
ません。たとえば、EdLev 列が null 値を含んでいる場合、次の文を入力すると、結
果には学歴が 16 年よりも少ない社員の名前だけが含まれます。
SELECT Name, EdLev
FROM Employee
WHERE (EdLev < 16) ;
文の結果に null を含めるには、文を次のように構成します。
SELECT Name, EdLev
FROM Employee
WHERE (EdLev < 16)
OR (EdLev IS NULL) ;
LIKE
目的
ある文字列のパターンを別の文字列または文字列式の中で検索します。
構文
expression
LIKE
pattern_expression
NOT
expression
ESCAPE
LIKE
NOT
escape_character
( subquery )
ALL
ESCAPE
escape_character
ANY
SOME
,
(
expression
LIKE
)
( subquery )
NOT
ESCAPE
ALL
escape_character
ANY
SOME
,
(
expression
,
)
LIKE
NOT
(
ALL
pattern_expression
)
ESCAPE
escape_character
ANY
SOME
SQL 関数、演算子、式および述部
877
第 20 章 論理述部
LIKE
構文要素
expression
副文字列の pattern_expression が検索される文字列または文字列式の引数。
pattern_expression
expression が検索される文字式。
ANY
ALL
SOME
1 つ以上の式の中の 1 つ以上のパターンを、または副問合わせによって戻される 1
つ以上の値を検索することを可能にする数量詞。
subquery
式または式のリストで指定された数と同じ数の式を選択する副問合わせ。
Subquery で SELECT AND CONSUME 文を指定することはできません。
ESCAPE escape_character
単一のエスケープ文字(1 バイトまたはマルチバイト)を指定するキーワード/変数の
組み合わせ。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
NUSI を使用した性能の最適化
コスト効率が良ければ、最適化ルーチンは基本テーブルへのアクセスを伴う(もしく
は伴わない)NUSI の走査によって LIKE 式を評価します。NUSI 使用のコストは、LIKE
式の選択性、NUSI サブテーブルのサイズ、また NUSI がカバー索引か部分的なカバー
索引かによって異なります。部分的なカバー索引の場合、RowID スプールを整列す
るコストも含まれます。NUSI と問合わせカバーの詳細は、<データベース設計、
B035-1094>を参照してください。
最適化ルーチンは、次の条件を満たす場合に、NUSI の使用と全行スキャンの使用に
ついて、優れたコスト比較を実行できるようになります。
• expression 文字列の評価の対象となる基本テーブルの基本索引と NUSI 列の両方
について、統計が収集されている。
• expression 文字列が、基本テーブルの統計ヒストグラムの最低 1 つの間隔におい
て、最頻値か最大値のどちらかである。
次の場合には、LIKE 式の処理に VARCHAR フィールドを持つ NUSI は使用できませ
ん。
878
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
• NUSI に VARCHAR フィールドが含まれ、その VARCHAR フィールドが NOT LIKE
演算で使用される。
• NUSI に VARCHAR フィールドが含まれ、その VARCHAR フィールドが文字列関
数で使用される。例えば、d1 が VARCHAR タイプの NUSI 列の場合、次の例は許
容されていません。
d1||‘ab’ LIKE ‘b ab’
また、VARCHAR フィールドを持つ NUSI は、制約のない集約問合わせに対する部
分的なカバー索引として使用することはできません。
Null 式
比較におけるいずれかの式が null であると、比較の結果は不明です。
LIKE 操作が NULL 値を含む可能性のあるフィールドの検索時に真の結果を得るため
に、その文には、IS [NOT] NULL 演算子を含めなければなりません。
大文字小文字の区別
pattern_expression にも expression にも CASESPECIFIC が指定されていない場合、
pattern_expression および expression 内の英小文字は、比較操作が行なわれる前に
英大文字に変換されます。ESCAPE が指定されていてエスケープ文字が英小文字の
場合も、そのエスケープ文字は比較操作が行なわれる前に英大文字に変換されます。
expression か pattern_expression のどちらかに CASESPECIFIC が指定されている場
合、2 つの文字は、同じ文字でしかも同じ英大文字または英小文字が揃っている場
合にのみ、一致したとみなされます。
ワイルドカード文字
%と_文字を pattern_expression 内で任意に組み合わせて使用することができます。
文字
説明
% (パーセント記号)
0 以上の任意の文字からなる任意の列を表わす。
パーセントはあらゆる文字列で置換え可能です。
_ (下線)
1 つの任意の文字だけを表わす。
下線文字が現われる箇所は、あらゆる単一文字で置換え可能です。
下線文字およびパーセント文字をパターン内で使用することはできません。これら
の文字をパターンで使用するためには、pattern_expression に加えて単一のエスケー
プ文字を指定します。詳細については、「LIKE の ESCAPE 機能」を参照してくださ
い。
次の表では、さまざまなサーバー文字セットについて文字列を照合するときにメタ
文字の%と_ (およびその全角表記)がどのように機能するかを説明します。ANSI で
SQL 関数、演算子、式および述部
879
第 20 章 論理述部
LIKE
は、1 バイトのスペース下線とパーセント記号のメタ文字のみが定義されることに
注意する必要があります。
Teradata SQL では、LIKE 述部で使用可能なメタ文字セットが拡張され、全角の下線
と全角のパーセント記号が含まれるようになりました。
サーバー文字
セット
使用するメタ文字
KANJI1
一致する文字
ANSI モード
Teradata モード
スペース下線
1 つの 1 バイト文字
またはマルチバイト
文字。
1 つの 1 バイト文字。
全角のスペース下線
1 つの 1 バイト文字
またはマルチバイト
文字。
1 つの 1 バイト文字ま
たはマルチバイト文字。
パーセント記号
1 バイト文字またはマ 1 バイト文字またはマ
ルチバイト文字の文 ルチバイト文字の文
字列
字列
全角のパーセント記号
1 バイト文字またはマ 1 バイト文字またはマ
ルチバイト文字の文 ルチバイト文字の文
字列
字列
UNICODE
LATIN
KANJISJIS
全角のスペース下線
なし
全角のパーセント記号
これらの文字は、ANSI SQL 規格に適合させる
ために、メタ文字として処理されません。
GRAPHIC
全角のスペース下線
1 つの単一 GRAPHIC 文字。
全角のパーセント記号
GRAPHIC 文字の文字列
LIKE の ESCAPE 機能
定義済みの ESCAPE 文字をパターン内で使用する場合には、その ESCAPE 文字の直
後に下線、パーセント符号、または他のエスケープ文字を続けなければなりません。
ESCAPE 文字を指定した場合には、パターンを左側から右側に走査するときに以下の
規則が適用されます。
• ESCAPE 文字のインスタンスが現われるまでは、パターン内の文字は、表示され
ているとおりに解釈されます。
• ESCAPE 文字の直後にもう 1 つ ESCAPE 文字が現われた場合には、その 2 つの文
字列は、その ESCAPE 文字の単一のインスタンスのように扱われ、通常の文字と
みなされます。
• ESCAPE 文字の直後に下線のメタ文字が現われた場合には、その文字列は、文字
としての 1 つの下線として扱われます(ワイルドカード文字ではなく)。
880
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
• ESCAPE 文字の直後にパーセントのメタ文字が現われた場合には、その文字列
は、文字としての 1 つのパーセントとして扱われます(ワイルドカード文字では
なく)。
• ESCAPE 文字の直後に下線のメタ文字、パーセントのメタ文字、またはその
ESCAPE 文字自体の別のインスタンスが現われなかった場合には、走査は停止さ
れ、エラーが報告されます。
例
次の例で、ESCAPE の使用法を示します。
「Result is 95% effective」などの文字列でパターン「95%」を検索して、検査する
フィールドが Result である場合には、次の文を使用します。
WHERE Result LIKE '%95Z%%' ESCAPE 'Z'
この句は、値「95%」を検出します。
埋め込み文字
埋め込み文字および文字列内での埋め込み文字の扱い方について、以下の注釈が適
用されます。
• 埋め込み文字は、文字式とパターンの両方で意味があります。
• パターンを照合する場合、フィールドまたは式の先頭や末尾の埋め込み文字がパ
ターンと正確に一致しなければなりません。
例えば、‘A%BC’は‘AxxBC’に一致しますが、‘AxxBCΔ’に一致しません。また、‘A
%BCΔ’は‘AxxBCΔ’に一致しますが、‘AxxBC’にも‘AxxBCΔΔ’ (Δ は埋め込み文字
を示します)にも一致しません。
• すべての状況で行を検索するには、TRIM 関数の使用を考慮してください。この
関数は、パターン照合が行なわれる前に、元の文字列から先頭や末尾の埋め込み
文字を取り除きます。
末尾の埋め込み文字を取り除く例を挙げます。
TRIM (TRAILING FROM expression) LIKE pattern-string
先頭と末尾の埋め込み文字を取り除くには、次の文を使用します。
TRIM (BOTH FROM expression) LIKE pattern-string
• pattern_expression が強制的に固定長に設定されている場合、末尾の埋め込み文
字を付加することができます。このような場合、フィールドには照合のために末
尾の埋め込み文字が同じ数だけなければなりません。
たとえば、次の文は 5 文字より短いパターンの文字列の末尾に埋め込み文字を付
加します。
CREATE MACRO (pattern (CHAR(5)) AS
field LIKE :pattern…
SQL 関数、演算子、式および述部
881
第 20 章 論理述部
LIKE
• どのように定義されている行でも取り出すためには、TRIM 関数をパターンの文
字列に適用するか(TRIM(TRAILING FROM :パターン))、またはマクロ パラメータ
を VARCHAR と定義します。
この 2 つの方法が常に同じ結果を返すとは限りません。TRIM は埋め込み文字を
取り除き、一方、VARCHAR では、入力されたとおりの正確なデータ パターンを
保持します。
例
例
次の例は、LIKE 述部を使用して、肩書に文字列「Pres」が含まれている社員のリス
トを選択します。
SELECT Name, DeptNo, JobTitle
FROM Employee
WHERE JobTitle LIKE '%Pres%' ;
この%文字列%の形式は、各文字列の出現を検査することを Teradata Database に要
求します。検索文字列が長く、テーブルに多くの行がある場合は、行の限定のため
に長い時間がかかることがあります。
返される結果は、次のとおりです。
Name
DeptNo
JobTitle
Watson L
500
Vice President
Phan A
300
Vice President
Russel S
300
President
例
次の例は、名字が P の字で始まるすべての社員のリストを選択します。
SELECT Name
FROM Employee
WHERE Name LIKE 'P%';
返される結果は、次のとおりです。
Name
---------Phan A
Peterson J
例
この例では、% と _ の文字を使用して、名字の 2 番目の文字が A である社員のリス
トを選択します。返される文字列の長さは、2 文字以上になります。
882
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
SELECT Name
FROM Employee
WHERE Name LIKE '_a%';
これは、次の結果を返します。
Name
---------Marston A
Watson L
Carter J
_a%を_a_に置き換えると、2 番目の文字が a の 3 文字の文字列の検索になります。
Employee テーブルにはこの記述に合う名前がないため、この問合わせは行を返し
ません。
パターン内の先行および末尾の埋め込み文字は両方とも、照合の規則には意味があ
ることに注意する必要があります。
例
LIKE ’ΔΔZ%’は、2 つの埋め込み文字で始まり、後ろに Z が続くフィールドだけを
探します。
ANY/ALL/SOME 数量詞
SQL は、数量詞の ANY (または SOME)および ALL を認識します。次の一般的な例で
示すように、数量詞によって、1 つ以上の式を 1 つ以上の値と比較できます。
,
expression
LIKE
quantifier
pattern_string
(
)
指定する数量詞
検索条件が満たされるときに expression LIKE
pattern_string …が真となる範囲
ALL
リスト内のすべての文字列
ANY
リスト内のいずれかの文字列
ALL 数量詞は、論理文 FOR ∀です。
ANY 数量詞は、論理文 FOR ∃です。
次の表は、このことを示しています。
式
等価である式
x LIKE ALL ('A%','%B','%C%')
x LIKE 'A%'
AND x LIKE '%B'
AND x LIKE '%C%'
SQL 関数、演算子、式および述部
883
第 20 章 論理述部
LIKE
式
等価である式
x LIKE ANY ('A%','%B','%C%')
x LIKE 'A%'
OR x LIKE '%B'
OR x LIKE '%C%'
次の文は、肩書の中で文字列「Pres」が使われているか、または「Man」で始まる
行を社員テーブルから選択します。
SELECT *
FROM Employee
WHERE JobTitle LIKE ANY ('%Pres%', 'Man%');
この文の結果は、次のとおりです。
EmpNo
Name
DeptNo
JobTitle
Salary
10021
Smith T
700
Manager
45, 000.00
10008
Phan A
300
Vice Pres
55, 000.00
10007
Aguilar J
600
Manager
45, 000.00
10018
Russell S
300
President
65, 000.00
10012
Watson L
500
Vice Pres
56, 000.00
次の形式に対し、ALL または ANY/SOME 限定子が指定された場合には、subquery
は、0 行、1 行、または数行を返します。
expr
LIKE
quantifier
( subquery )
NOT
ただし、次の表に示すように、数量詞が使用されない場合は、副問合わせは何の値
も返さないか、単一の値を返すかのどちらかです。
式
真になる場合の expression の一致対象
expression LIKE (subquery)
Subquery によって返された単一の値。
expression LIKE ANY (subquery)
Subquery によって返された値セットのうち、少な
くとも 1 つの値。Subquery が何の値も戻さない場
合は偽。
expression LIKE ALL (subquery)
Subquery によって返された値セットのそれぞれの
値、subquery が何の値も戻さない場合は偽。
例
次の文は ANY 数量詞を使用して、Project テーブルから各行を検索します。この表
は、プロジェクト コードに Accounts Payable または Accounts Receivable のどちら
かを含みます。
884
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
SELECT * FROM Project
WHERE Proj_Id LIKE ANY
(SELECT Proj_Id
FROM Charges
WHERE Proj_Id LIKE ANY ('A%')) ;
subquery
次の形式を使用した場合、subquery は 0 から数個の値を返すことができます。
expr
LIKE
quantifier
( subquery )
NOT
次の例は、別のテーブルから選択したパターンを使用して突合わせを行なう方法を
示しています。
基本テーブルは、2 つあります。
テーブル
定義されている内容
Project
• 固有のプロジェクト ID
• プロジェクトの説明
Department_Proj
プロジェクト ID のパターンと Department との関連
Department_Proj には、2 つの列があります。つまり、Proj_pattern と Department
です。このテーブルの行は、次のとおりです。
Proj_pattern
Department
AP%
Finance
AR%
Finance
Nut%
R&D
Screw%
R&D
次の問合わせは、LIKE を使用して Department_Proj テーブルから選択したパターン
を突き合わせ、Department_Proj テーブルに定義されているように、Finance 部署
に関連するプロジェクト パターンと一致する Proj_Id を持っている Project テーブ
ル内のすべての行を選択します。
SELECT *
FROM Project
WHERE Proj_Id LIKE ANY
(SELECT Proj_Pattern
FROM Department_Proj
WHERE Department = 'Finance');
次の形式を使用した場合、subquery は、式のリスト内の数と同じ数の式を選択しな
ければなりません。
SQL 関数、演算子、式および述部
885
第 20 章 論理述部
LIKE
,
(
expr
LIKE
)
quantifier
( subquery )
NOT
以下に例を示します。
(x,y) LIKE ALL (SELECT a,b FROM c)
これは、次と等しくなります。
(x LIKE c.a) AND (y LIKE c.b)
ESCAPE 文字の動作
escape_character が(総称)string_2 で使用されている場合には、この直後に適切な
サーバー文字セットのメタ文字か、別の escape_character を続けなければなりません。
string_1 内の文字が string_1 内の escape_character の後の文字とまったく同じであ
る場合、結果として生じる 2 文字列は string_2 内の 1 文字に一致します。
つまり、escape_character は、照合のために無視され、escape_character の後の文
字がそれ自体の単一のオカレンスとして照合されます。
string_1 と string_2 が共通のサーバー文字セットを共用しない場合には、引数が一
致していないときに自動的に UNICODE にコード変換されるため、有効なメタ文字
は、下線とパーセント記号です。これらの動作は、「文字から文字への暗黙の変換」
で説明されているルールに従います。
例
さまざまな例
関数
結果
_KanjiSJIS ‘92
abc’ LIKE _Unicode ‘%abc’
TRUE
_KanjiSJIS ‘92
abc’ LIKE _Unicode ‘%abc’
FALSE
%(全角のパーセント記号)は、
KanjiSJIS または UNICODE のメタ
文字ではありません。
‘c%’ LIKE ‘c%%’ ESCAPE ‘%’
TRUE
‘c%’ LIKE ‘c%%’ ESCAPE ‘%’
FALSE
%(全角のパーセント記号)は、%
(パーセント記号)に一致しません。
886
SQL 関数、演算子、式および述部
第 20 章 論理述部
LIKE
KanjiEBCDIC の例
次の例は、関数(expression LIKE pattern_expression)を使用したときの KanjiEBCDIC
文字列に対する LIKE の動作を示します。
expression
pattern_expression
サーバー文字セット
結果
MN<AB>
%<B>
KANJI1
TRUE
MN<AB>P
<%B>%
KANJI1
TRUE
MN<AB>P
%P
KANJI1
TRUE
MN<AB>P
%<__C>%
KANJI1
FALSE
__は、全角の下線を表わします。
KanjiEUC の例
次の例は、関数(expression LIKE pattern_expression)を使用したときの KanjiEUC 文
字列に対する LIKE の動作を示します。
expression
pattern_expression
サーバー文字セット
結果
ss3A ss2B ss3C ss2D % ss2B%
UNICODE
TRUE
M ss2B N ss2D
GRAPHIC
TRUE
ss3A ss2B ss3C ss2D __%
KANJISJIS
TRUE
ss3A ss2B ss3C ss2D _ %
KANJISJIS
TRUE
M __%
__は、全角の下線を表わします。
_は、スペース下線を表わします。
KanjiShift-JIS の例
次の例は、関数(expression LIKE pattern_expression)を使用したときの KanjiShiftJIS 文字列に対する LIKE の動作を示します。
expression pattern_expressio
n
サーバー文字 ANSI モードの結果
セット
Teradata モードの
結果
ABCD
__B%
GRAPHIC
TRUE
TRUE
mnABCI
%B%
UNICODE
TRUE
TRUE
mnABCI
%I
UNICODE
TRUE
TRUE
mnABCI
mn_%I
KANJI1
TRUE
pattern_expression
の中にある下線は、
ANSI モードの 1 バイ
SQL 関数、演算子、式および述部
887
第 20 章 論理述部
OVERLAPS
expression pattern_expressio
n
mnABCI
mn__%I
サーバー文字 ANSI モードの結果
セット
KANJI1
Teradata モードの
結果
ト文字またはマルチ
バイト文字に一致し
ます。
pattern_expression
の中にある下線は、
Teradata モードの
1 バイト文字に一致
します。
TRUE
TRUE
__は、全角の下線を表わします。
_は、スペース下線を表わします。
OVERLAPS
OVERLAPS は、OVERLAPS を参照してください。
888
SQL 関数、演算子、式および述部
第 21 章
Null 処理のための関数
概要
この章では、null 入力値を処理する関数について説明します。
NVL
目的
NULL を結果値として数値または文字列値で置き換えます。
構文
NVL
( expr1, expr2 )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
expr1
数値または文字式。
• expr1 が NULL の場合は、expr2 が返されます。
• expr1 が NULL でない場合は、expr1 が返されます。
expr2
数値または文字式。
呼出し
NVL は埋め込みサービス システム関数です。埋め込みサービス関数の有効化と呼び
出しについて、詳細は「埋め込みサービス システム関数 」を参照してください。
SQL 関数、演算子、式および述部
889
第 21 章 Null 処理のための関数
NVL
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、NUMBER、CHAR、VARCHAR
すべての入力引数は同じデータ タイプか、あるいはタイプに互換性がなければなり
ません。
結果のタイプ
NVL は、渡された引数に関連付けられたデータ タイプによって戻り値のデータ タイ
プが異なるスカラー関数です。
• 入力引数が数値タイプの場合、関数は最も優先順位が高い引数を決定し、その
データ タイプに他の引数を変換して、そのデータ タイプを返します。優先順位
の順序の詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の
「互換データ型」を参照してください。
そのデータ タイプが DECIMAL/NUMERIC であり、入力引数の精度とスケールが
異なる場合、戻りタイプの精度とスケールは最大精度になるように設定されま
す。たとえば、入力引数が DECIMAL(6,3)、DECIMAL(7,4)、および DECIMAL(8,7)
の場合、精度の低下を避けるために、戻りタイプは小数点の左が 3 桁、右が 7 桁
必要になります。
最大精度を維持できない場合、データは DBS 制御レコードの
RoundHalfWayMagUp フィールドに基づいて丸められます。たとえば、入力引数
が DECIMAL(32, 8)と DECIMAL(30, 28)の場合、戻りタイプは DECIMAL(38,14)
になります。これにより、小数点の左が 24 桁(DECIMAL(32,8)引数に必要)、小数
点の右が 14 桁使用できます。
データ タイプが固定小数点数の NUMBER で精度が 38 以下の場合、戻りタイプ
の精度とスケールは、DECIMAL/NUMERIC と同じメソッドを使用して計算されま
す。ただし、精度が 38 より大きい場合は、精度の低下を避けるために戻りタイ
プを NUMBER(*)に変更します。データ タイプが浮動小数点の NUMBER の場合、
戻りタイプは NUMBER(*)になります。
• 2 つの引数が文字データ タイプの場合、関数は第 2 引数を第 1 引数のデータ タ
イプに変換し、そのタイプを VARCHAR として返します。
• 入力文字のタイプがすべて LATIN の場合、結果は LATIN になります。一部の入
力が LATIN でない場合、関数はすべての入力を Unicode に変換します。返される
文字セットは Unicode になります。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
890
SQL 関数、演算子、式および述部
第 21 章 Null 処理のための関数
NVL2
例
以下の問合わせを実行します。
SELECT department_name,
NVL(last_name,'NO EMPLOYEE') "LAST NAME"
FROM employee E
FULL OUTER JOIN Department D
ON department_number=d.department_number;
WHERE department_number IN(402,600);
次の結果が得られます。
Department_name
LAST NAME
--------- -------------------Software Support
Crane
New Department
NO EMPLOYEE
この例では、NVL 関数は結果を employee テーブルからの last_name 列値として返
します。last_name 値が NULL の場合、関数は結果を NO EMPLOYEE として返しま
す。
関連トピック
詳細は、以下を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
NVL2
目的
expr1 が NULL かどうかに基づいて、2 つの値のいずれか 1 つを返します。
構文
NVL2
( expr1, expr2, expr3 )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
SQL 関数、演算子、式および述部
891
第 21 章 Null 処理のための関数
NVL2
expr1
数値または文字式。
• expr1 が NULL でない場合は、expr2 が返されます。
• expr1 が NULL の場合は、expr3 が返されます。
expr2
数値または文字式。
expr3
数値または文字式。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
NVL2 は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
BYTEINT、SMALLINT、INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT/REAL/
DOUBLE PRECISION、NUMBER、CHAR、VARCHAR
expr2 と expr3 は同じデータ型か、あるいは型に互換性がなければなりません。
結果のタイプ
NVL2 は、関数に渡された引数に関連付けられたデータ タイプによって戻り値のデー
タ タイプが異なるスカラー関数です。
• expr2 および expr3 が数値タイプの場合、関数は最も優先順位が高い引数を決定
し、そのデータ型に他の引数を変換して、そのデータ型を返します。優先順位の
順序の詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互
換データ型」を参照してください。
そのデータ タイプが DECIMAL/NUMERIC であり、2 つの引数の精度とスケール
が異なる場合、戻りタイプの精度とスケールは最大精度になるように設定されま
す。たとえば、入力引数が DECIMAL(6,3)、DECIMAL(7,4)、および DECIMAL(8,7)
の場合、精度の低下を避けるために、戻りタイプは小数点の左が 3 桁、右が 7 桁
必要になります。この場合、返されるデータ タイプは DECIMAL(10,7)に設定さ
れます。
892
SQL 関数、演算子、式および述部
第 21 章 Null 処理のための関数
NVL2
最大精度を維持できない場合、データは DBS 制御レコードの
RoundHalfWayMagUp フィールドに基づいて丸められます。たとえば、2 つの引
数が DECIMAL(32, 8)と DECIMAL(30, 28)の場合、戻りタイプは
DECIMAL(38,14)になります。これにより、小数点の左が 24 桁(DECIMAL(32,8)
引数に必要)、小数点の右が 14 桁使用できます。
データ タイプが固定小数点数の NUMBER で精度が 38 以下の場合、戻りタイプ
の精度とスケールは、DECIMAL/NUMERIC と同じメソッドを使用して計算され
ます。ただし、精度が 38 より大きい場合は、精度の低下を避けるために戻りタ
イプを NUMBER(*)に変更します。データ タイプが浮動小数点の NUMBER の場
合、戻りタイプは NUMBER(*)になります。
• expr2 と expr3 が文字型の場合、関数は第 2 引数を第 1 引数のデータ型に変換
し、その型を VARCHAR として返します。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
例
例
以下の問合わせを実行します。
SELECT NVL2('England', 'France', 'Spain');
第 1 引数が NULL でないため、第 2 引数'France'を返します。
例
以下の問合わせを実行します。
SELECT NVL2(NULL, 'France', 'Spain');
第 1 引数が NULL でないため、第 3 引数'Spain'を返します。
関連トピック
詳細は、以下を参照してください。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
• 詳細については、<SQL 外部ルーチン プログラミング、B035-1147>の「互換デー
タ型」を参照してください。
SQL 関数、演算子、式および述部
893
第 21 章 Null 処理のための関数
NVL2
894
SQL 関数、演算子、式および述部
第 22 章
順序付き分析関数/ウィンドウ集約関数
概要
この章では、次の内容について説明します。
• 順序付き分析関数
• ウィンドウ集約関数
順序付き分析関数
順序付き分析関数は、結果行の順序指定セットが必要であるか、または直前の行の
値に基づいて計算が行なわれる、分析処理およびデータ マイニングでの一般的な演
算を多数サポートします。順序付き分析関数では、オンライン分析処理(OLAP)スタ
イルの意思決定支援要求を含む問合わせの処理を効率よく行なえます。
たとえば、7 日間の連続合計を計算する場合、次のことを行なう必要があります。
• まず、日付ごとに行を並べる必要があります。
• さらに、連続合計の値を計算する必要があります。
• そのためには、直前の行からの合計値に現在行の値を加算してから、
• 8 日前の行の値を減算しなければなりません。
利点
順序付き分析関数は Teradata Database 問合わせ実行エンジンを拡張したものであ
り、順序指定セットの概念と、複数行の値を使って新しい値を計算する機能を追加
しています。
順序付き分析関数の結果は、その他の SQL 式と同じように処理されます。結果列と
して示すこともできれば、SELECT 内のさらに複雑な計算式の一部として組み込む
こともできます。
それぞれの順序付き分析関数では、SELECT 文によって取り出した行を並べ替える
ための並替え順序を示した列(複数も可)を指定できます。関数の並替え順序や他の
入力パラメータは、その他の SQL 関数の引数と同じように指定します。その種のパ
ラメータとしては、任意の標準 SQL 式を使用できます。
SQL 関数、演算子、式および述部
895
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数
SQL レベルでの順序付き分析計算
高レベルの OLAP 計算エンジンを使わずに、SQL レベルで順序付き分析計算を実行
することには、はっきりとした利点が 4 つあります。
• プログラミング作業が少ないこと。
• 外部並替えルーチンが不要であること。
• 大きなデータ セットを外部ツールにエクスポートする必要がないこと。順序付き
分析関数を使えば、問合わせの中で条件を指定することにより、ウェアハウス自
体の内部で分析用のデータを特定できます。
• 外部ツールが大きなデータ セットに対して実行する低速の単一スレッド演算に比
べて、分析パフォーマンスが格段に向上すること。
Teradata Warehouse Miner
順序付き分析関数の利点は、SQL 問合わせを直接コーディングする必要がないこと
です。Teradata Database も多数のサード パーティの問合わせ管理分析ツールも、
Teradata SQL 順序付き分析関数を完全に利用できます。たとえば、データベース エ
ンジンの内部でデータ マイニング処理を実行するツールである Teradata Warehouse
Miner は、データ抽出を行なわずに、こうした機能を活用して、データベース自体
の中で関数を実行します。
Teradata Warehouse Miner では、Teradata SQL 固有の関数に基づく、事前定義の
SQL データ マイニング関数が約 40 個用意されています。たとえば、Teradata
Warehouse Miner の FREQ 関数は、Teradata SQL 固有の関数である CSUM と RANK
と QUALIFY を使って頻度を判別します。
例
以下の例は、Marital Status (結婚状況)に対する Gender (性別)の頻度を計算する SQL
問合わせが、どのように Teradata Warehouse Miner を使用するかを示したものです。
SELECT gender, marital_status, xcnt,xpct
,CSUM(xcnt, xcnt DESC, gender, marital_status) AS xcum_cnt
,CSUM(xpct, xcnt DESC, gender, marital_status) AS xcum_pct
,RANK(xcnt DESC, gender ASC, marital_status ASC) AS xrank
FROM
(SELECT gender, marital_status, COUNT(*) AS xcnt
,100.000 * xcnt / xall (FORMAT 'ZZ9.99') AS xpct
FROM customer_table A,
(SELECT COUNT(*) AS xall
FROM customer_table) B
GROUP BY gender, marital_status, xall
HAVING xpct >= 1) T1
QUALIFY xrank <= 8
ORDER BY xcnt DESC, gender, marital_status
896
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
この問合わせの結果は、以下の表のようになります。
gender
marital_status
xcnt
F
Married (既婚)
M
xpct
xcum_cnt
xcum_pct
xrank
391009 36.71
3
3910093
36.71
1
Married (既婚)
241951 22.71
1
6329604
59.42
2
F
Divorced (離婚)
161213 15.13
0
7941734
74.55
3
M
Divorced (離婚)
141262 3.26
4
9354358
87.81
4
F
Single (未婚)
491224 4.61
9845582
92.42
5
F
Widowed (死別)
319881 3.01
10165463
95.43
6
M
Single (未婚)
319794 3.00
10485257
98.43
7
M
Widowed (死別)
197131 1.57
10652388
100.00
8
順序付き分析関数の特性
関数値
行内の列の関数値は、その行(およびグループ内の他のすべての行のサブセット)を
対象として、新しい値を生成します。
この演算を記述した汎用関数は、以下のとおりです。
new_column_value = FUNCTION(column_value,rows_defined_by_window)
QUALIFY 句の使用
行数を減らすには、新しい列値に条件を適用します。QUALIFY 句は集約関数の
HAVING 句に類似しています。QUALIFY 句は、関数値に基づいて行数を減らし、対
象となっている各行について 1 つの新しい値を戻します。たとえば、
SELECT StoreID, SUM(profit) OVER (PARTITION BY StoreID)
FROM facts
QUALIFY SUM(profit) OVER (PARTITION BY StoreID) > 2;
順序付き分析関数と集約関数の両方を指定した SQL 問合わせには、以下の例のよう
に、QUALIFY 句と HAVING 句を両方とも組み込むことができます。
SQL 関数、演算子、式および述部
897
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
SELECT StoreID, SUM(sale),
SUM(profit) OVER (PARTITION BY StoreID)
FROM facts
GROUP BY StoreID, sale, profit
HAVING SUM(sale) > 15
QUALIFY SUM(profit) OVER (PARTITION BY StoreID) > 2;
DISTINCT 句の制限
ウィンドウ集約関数では DISTINCT 句は使用できません。
対象となる問合わせオブジェクト
順序付き分析関数は、以下のデータベース問合わせオブジェクトを対象としています。
•
•
•
•
ビュー
マクロ
派生テーブル
INSERT ...SELECT
順序付き分析関数を使用できない場合
次の場合、順序付き分析関数を使用することはできません。
• SUBQUERY
• WHERE 句
• SELECT AND CONSUME 文
標準的な SQL 関数の使用
同一の問合わせ内で標準的な SQL 関数も併用して、文をさらに練り上げることもで
きます。
たとえば、以下のような方法で順序付き分析関数を使用できます。
分析関数を使用する操作
目的
INSERT … SELECT
新しい列に値を入れること。
派生テーブル
複雑な問合わせにかかわる新しいテーブルを作
成すること。
それぞれ異なる並替え式を持った順序付き分析関数は、同じスプール ファイルを使
用しながら 1 つずつ評価されます。同じ並替え式を持ったそれぞれ異なる関数は、
同時に評価されます。
898
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
サポートされないデータ タイプ
順序付き分析関数は 次のデータ タイプには動作しません。
• CLOB または BLOB データ タイプ
• UDT データ タイプ
式内で CLOB、BLOB、または UDT データ型を使用できるのは、結果がサポートさ
れるデータ型である場合です。たとえば、
SELECT
RANK() OVER
(PARTITION BY(CASE WHEN b IS NULL THEN 1 ELSE 0 END) ORDER BY id)
FROM btab;
ただし、次の例は、BLOB による並べ替えができないため、エラーになります。
SELECT
RANK() OVER
(PARTITION BY b ORDER BY id)
FROM btab;
順序付き分析関数および Period データ タイプ
Period データ タイプと評価される式は、QUANTILE、RANK (Teradata 固有の関数)、
および RANK (ANSI SQL ウィンドウ関数)といった順序付き分析関数内の任意の式に
指定できます。
順序付き分析関数と再帰的問合わせ
順序付き分析関数は、再帰的問合わせの再帰文では使用できません。ただし、再帰
的問合わせの中の非再帰シード文で順序付き分析関数を指定することができます。
順序付き分析関数とハッシュ索引または結合索引
単一のテーブル問合わせが、単一のテーブル圧縮ハッシュ索引または結合索引用と
しても定義されている列に対して順序付き分析関数を指定した場合、最適化ルーチ
ンは問合わせを処理するときにそのハッシュ索引または結合索引を選択しません 。
順序付き分析関数と行レベル セキュリティ テーブル
行レベル セキュリティで保護されたテーブルを参照する順序付き分析関数(MAVG、
CSUM、RANK など)が要求に含まれている場合、その操作は要求を発行したユーザー
がアクセスできる行にのみ基づいたものになります。この関数をテーブルに含まれ
るすべての行に適用するには、ユーザーには次のいずれかが必要になります。
• テーブルのすべての行にアクセスするために必要なセキュリティ クレデンシャル。
SQL 関数、演算子、式および述部
899
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
• テーブルのセキュリティ制約に対して必要な OVERRIDE 権限。
整列順序の計算と結果の順序
ウィンドウ指定で指定する整列順序によって関数の適用対象の行に対する整列順序
が定義されますが、それによって結果の順序が定義されるわけではありません。
たとえば、現行月から後の月の平均売上げを計算するには、次のように行を月別に
順序付けします。
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER (PARTITION BY StoreID ORDER BY SMonth
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
FROM sales_tbl;
StoreID
------1001
1001
1001
1001
1001
1001
SMonth
-----6
5
4
3
2
1
ProdID
-----C
C
C
C
C
C
Sales
--------30000.00
30000.00
25000.00
40000.00
25000.00
35000.00
Remaining Avg(Sales)
-------------------?
30000.00
30000.00
28333.33
31250.00
30000.00
計算でのデフォルトの並替え順序は ASC です。しかし結果は、その逆の順序で戻さ
れます。
結果を順序付けするには、SELECT 文で ORDER BY 句を使用します。たとえば、
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER (PARTITION BY StoreID ORDER BY SMonth
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
FROM sales_tbl
ORDER BY SMonth;
StoreID
------1001
1001
1001
1001
1001
1001
900
SMonth
-----1
2
3
4
5
6
ProdID
-----C
C
C
C
C
C
Sales
--------35000.00
25000.00
40000.00
25000.00
30000.00
30000.00
Remaining Avg(Sales)
-------------------30000.00
31250.00
28333.33
30000.00
30000.00
?
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
ウィンドウ指定のパーティション化列のデータおよびリソースの影響
ウィンドウ指定の PARTITION BY 句で指定される列で、順序付き分析関数が実行す
るパーティションが決定します。 たとえば、次の問合わせでは PARTITION BY 句で
StoreID 列を指定して、各店舗のグループ売上合計を計算します。
SELECT StoreID, SMonth, ProdID, Sales,
SUM(Sales) OVER (PARTITION BY StoreID)
FROM sales_tbl;
実行時に、Teradata Database は 1 つのパーティションに分類される行のすべてを
同じ AMP に移動します。多くの行が同じパーティションに分類される場合、AMP
ではスプール領域が不足する可能性があります。 たとえば、先行する問合わせの
sales_tbl テーブルに何百万または何十億もの行があり、StoreID 列に小数の明確な
値がある場合は、膨大な数の行が同じパーティションに分類されることになり、ス
プール不足エラーの原因となります。
この問題を回避するには、PARTITION BY 句の列のデータを検査します。 必要に応
じて、PARTITION BY 句で追加の列を含めるように問合わせを書き換え、Teradata
Database が AMP でより均等に分配を行なうことができるように、小さいパーティ
ションを作成します。 たとえば、先行する問合わせは、月ごとに各店舗のグループ
売上合計を計算するように書き換えることができます。
SELECT StoreID, SMonth, ProdID, Sales,
SUM(Sales) OVER (PARTITION BY StoreID, SMonth)
FROM sales_tbl;
順序付き分析関数の使用
例: RANK および AVG の使用
順序付き分析関数である RANK と AVG を使った以下の SELECT 文の結果について考
えてみます。
SELECT item, smonth, sales,
RANK() OVER (PARTITION BY item ORDER BY sales DESC),
AVG(sales) OVER (PARTITION BY item
ORDER BY smonth
ROWS 3 PRECEDING)
FROM sales_tbl
ORDER BY item, smonth;
結果テーブルは、たとえば以下のようなものになります。
Item
SMonth
Sales
Rank(Sales)
Moving Avg(Sales)
A
1996-01
110
13
110
SQL 関数、演算子、式および述部
901
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
Item
SMonth
Sales
Rank(Sales)
Moving Avg(Sales)
A
1996-02
130
10
120
A
1996-03
170
6
137
A
1996-04
210
3
155
A
1996-05
270
1
195
A
1996-06
250
2
225
A
1996-07
190
4
230
A
1996-08
180
5
222
A
1996-09
160
7
195
A
1996-10
140
9
168
A
1996-11
150
8
158
A
1996-12
120
11
142
A
1997-01
120
11
132
B
1996-02
30
5
30
...
...
...
...
...
例: QUALIFY と RANK の使用
問合わせに QUALIFY 句を追加すると、該当しないテーブルから行数を減らすことが
できます。
たとえば、高い売上げを記録した月が例年どおりなのか、そうでないのかを調べる
場合は、前の問合わせに QUALIFY 句を追加します。
SELECT item, smonth, sales,
RANK() OVER (PARTITION BY item ORDER BY sales DESC),
AVG(sales) OVER (PARTITION BY item ORDER BY smonth ROWS 3 PRECEDING)
FROM sales_tbl
ORDER BY item, smonth
QUALIFY RANK() OVER(PARTITION BY item ORDER BY sales DESC) <=5;
このように限定節を追加すると、たとえば以下のような結果テーブルが生成されます。
902
Item
SMonth
Sales
Rank(Sales)
Moving Avg(Sales)
A
1996-04
210
3
155
A
1996-05
270
1
195
A
1996-06
250
2
225
A
1996-07
190
4
230
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
順序付き分析関数の特性
Item
SMonth
Sales
Rank(Sales)
Moving Avg(Sales)
A
1996-08
180
5
222
B
1996-02
30
1
30
...
...
...
...
...
この結果は、現在の販売期間が始まる前の売上げがかなり低かったということを物
語っています。
例: QUALIFY と RANK の使用
sales_tbl という名前の以下の売上テーブルを取り上げます。
Store
ProdID
Sales
1003
C
20000.00
1003
D
50000.00
1003
A
30000.00
1002
C
35000.00
1002
D
25000.00
1002
A
40000.00
1001
C
60000.00
1001
D
35000.00
1001
A
100000.00
1001
B
10000.00
ここで、この表に対して以下のシンプルな SELECT 文を実行し、順位によって応答
行を限定します。
SELECT store, prodID, sales,
RANK() OVER (PARTITION BY store ORDER BY sales DESC)
FROM sales_tbl
QUALIFY RANK() OVER (PARTITION BY store ORDER BY sales DESC) <=3;
結果は、以下のような典型的な出力テーブルになります。
Store
ProdID
Sales
Rank(Sales)
1001
A
100000.00
1
1001
C
60000.00
2
1001
D
35000.00
3
SQL 関数、演算子、式および述部
903
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
Store
ProdID
Sales
Rank(Sales)
1002
A
40000.00
1
1002
C
35000.00
2
1002
D
25000.00
3
1003
D
50000.00
1
1003
A
30000.00
2
1003
C
20000.00
3
このように、QUALIFY 句の条件(売上げの順位が店舗内の 3 位より下)に適合しない
行を除き、テーブル内のすべての行には RANK の計算値が戻されています。
関連トピック
詳細は、以下を参照してください。
• 行レベル セキュリティの詳細は、<セキュリティ管理ガイド 、B035-1100>を参
照してください。
• QUALIFY 句の詳細は、< SQL データ操作言語、B035-1146>を参照してください。
ウィンドウ関数
ANSI SQL:2011 ウィンドウ関数を使用して、順序付けされたリレーショナル データ
ベース テーブルの中のデータのサブセット(ウィンドウ)を動的に定義することがで
きます。ウィンドウは OVER()句で指定され、括弧内には次の句を含めることができ
ます。
•
•
•
•
PARTITION BY
ORDER BY
RESET WHEN
ROWS
PARTITION BY 句
PARTITION BY に列参照リストを指定すると、指定された列参照リスト(順序付き分
析関数の実行対象)に基づいて行がグループ化されます。このようなグループ化は静
的になります。条件に基づいたグループやパーティションを定義する場合は、RESET
WHEN 句を使用します。詳細については、「RESET WHEN 句」を参照してください。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送られ
る単一のパーティションで構成された結果セット全体が、順序付き分析関数の実行
対象になります。
sales_tbl という名前の以下の表を取り上げます。
904
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
StoreID
SMonth
ProdID
Sales
1001
1
C
35000.00
1001
2
C
25000.00
1001
3
C
40000.00
1001
4
C
25000.00
1001
5
C
30000.00
1001
6
C
30000.00
1002
1
C
40000.00
1002
2
C
35000.00
1002
3
C
110000.00
1002
4
C
60000.00
1002
5
C
35000.00
1002
6
C
100000.00
PARTITION BY を含まない次の SELECT 文は、この表のすべての店舗の平均売上げ
を計算します。
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER ()
FROM sales_tbl;
StoreID
------1001
1001
1001
1001
1001
1001
1002
1002
1002
1002
1002
1002
SMonth
-----1
2
3
4
5
6
1
2
3
4
5
6
ProdID
-----C
C
C
C
C
C
C
C
C
C
C
C
Sales
--------35000.00
25000.00
40000.00
25000.00
30000.00
30000.00
40000.00
35000.00
110000.00
60000.00
35000.00
100000.00
Group Avg(Sales)
---------------47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
47083.33
店舗ごとの平均売上げを計算するには、sales_tbl のデータを次のように StoreID ご
とに区分します。
SQL 関数、演算子、式および述部
905
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER (PARTITION BY StoreID)
FROM sales_tbl;
StoreID
------1001
1001
1001
1001
1001
1001
1002
1002
1002
1002
1002
1002
SMonth
-----3
5
6
4
2
1
3
5
6
4
2
1
ProdID
-----C
C
C
C
C
C
C
C
C
C
C
C
Sales
--------40000.00
30000.00
30000.00
25000.00
25000.00
35000.00
110000.00
35000.00
100000.00
60000.00
35000.00
40000.00
Group Avg(Sales)
---------------30833.33
30833.33
30833.33
30833.33
30833.33
30833.33
63333.33
63333.33
63333.33
63333.33
63333.33
63333.33
ORDER BY 句
ORDER BY で、区分内に行を順序付けする方法を指定し、関数が適用される行の並
替え順序を決定します。
sales_tbl テーブルの店舗の月別売上げを直前の月の売上げに追加するには、次のよ
うに、売上げの累積合計を計算し、各区分内の行を Smonth 別に順序付けします。
SELECT StoreID, SMonth, ProdID, Sales,
SUM(Sales) OVER (PARTITION BY StoreID ORDER BY SMonth
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM sales_tbl;
StoreID
------1001
1001
1001
1001
1001
1001
1002
1002
1002
1002
906
SMonth
-----1
2
3
4
5
6
1
2
3
4
ProdID
-----C
C
C
C
C
C
C
C
C
C
Sales
--------35000.00
25000.00
40000.00
25000.00
30000.00
30000.00
40000.00
35000.00
110000.00
60000.00
Cumulative Sum(Sales)
--------------------35000.00
60000.00
100000.00
125000.00
155000.00
185000.00
40000.00
75000.00
185000.00
245000.00
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
1002
1002
5
6
C
C
35000.00
100000.00
280000.00
380000.00
RESET WHEN 句
RESET WHEN は、ANSI SQL 規格に対する Teradata 拡張機能です。
RESET WHEN では、指定された条件の評価に応じて、順序付き分析関数の実行対象
になるグループまたはパーティションが決まります。条件が TRUE と評価されると、
指定されたウィンドウ パーティション内に新しい動的パーティションが作成されま
す。列参照リストに基づいてパーティションを定義する場合は、PARTITION BY 句
を使用します。詳細については、「PARTITION BY 句」を参照してください。
RESET WHEN 句または PARTITION BY 句を指定しない場合は、FROM 句から送ら
れる単一のパーティションで構成された結果セット全体が、順序付き分析関数の実
行対象になります。
同じ SELECT リスト内に、異なる RESET WHEN 句を指定することができます。
注: RESET WHEN 句を指定するウィンドウ指定には、ORDER BY 句も指定する必要
があります。
RESET WHEN 条件のルール
RESET WHEN 句の条件は、QUALIFY 句の条件と適用範囲は同じですが、ネストさ
れた順序付き分析関数は条件によるパーティション化を指定できないという追加の
制約があります。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、その
ウィンドウ パーティション内にサブ パーティションを作成します。
RESET WHEN 条件に適用されるルールは、次のとおりです。
RESET WHEN 条件に含めることができる項目:
•
•
•
•
RESET WHEN 句を含まない順序付き分析関数
スカラー SUBQUERY
集約演算子
DEFAULT 関数
ただし、明示的な列指定のない DEFAULT は、述部でスタンドアロンの条件とし
て指定された場合にのみ有効です。詳細については、「RESET WHEN 条件の一
部として DEFAULT 関数を使用する場合のルール」を参照してください。
RESET WHEN 条件に含めることのできない項目:
•
•
•
•
RESET WHEN 句を含む順序付き分析関数
SELECT 文
LOB 列
UDT 値を返す UDF が含まれている UDT 式
SQL 関数、演算子、式および述部
907
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
ただし、UDT を含む式が事前定義データ型を持つ結果を戻す場合に限り、その式
を RESET WHEN 条件に含めることができます。
RESET WHEN 条件の一部として DEFAULT 関数を使用する場合のルール
RESET WHEN 条件の一部として DEFAULT 関数を使用する場合、以下のルールが適
用されます。
• DEFAULT 関数は、述部において列名の引数で指定できます。DEFAULT 関数は、
その引数として指定された列のデフォルト値と評価されます。評価後、DEFAULT
関数は述部でリテラルのように扱われます。
• 式内で比較演算子の各側に条件として 1 つの列指定と 1 つの DEFAULT 関数があ
る場合に限り、述部で列名の引数を使用せずに DEFAULT 関数を指定できます。
• DEFAULT 関数が null の値を取った場合、既存の比較ルールに従って、IS [NOT]
NULL 以外の比較演算子とともに使用された DEFAULT 関数のある条件は不明な
値になります。
IS [NOT]NULL 以外の条件で DEFAULT 関数が含まれた条件が NULL と比較される
と不明な値を取ります。
DEFAULT 関数と一緒に使用する条件
比較
IS NULL
デフォルトが NULL の場合は TRUE
そうでない場合は FALSE
IS NOT NULL
デフォルトが NULL の場合は FALSE
そうでない場合は TRUE
例
例1
次の例は、各地域の売上げ上昇の全期間の累積売上げを検索します。
SUM(sales) OVER (
PARTITION BY region
ORDER BY day_of_calendar
RESET WHEN sales < /* preceding row */ SUM(sales) OVER (
PARTITION BY region
ORDER BY day_of_calendar
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
ROWS UNBOUNDED PRECEDING
)
例
次の例では、残高増加の連続性を検索します。そのため、現在の残高が直前(前月
末)の残高以下になるたびにリセットを実行する必要があります。
908
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
SELECT account_key, month, balance,
ROW_NUMBER() over
(PARTITION BY account_key
ORDER BY month
RESET WHEN balance /* current row balance */ <=
SUM(balance) over (PARTITION BY account_key ORDER BY month
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) /* prev row */
) - 1 /* to get the count started at 0 */ as balance_increase
FROM accounts;
上記の SELECT 文の結果は、たとえば以下のような表になります。
account_key
----------1
1
1
1
1
1
1
1
1
1
1
1
month
----1
2
3
4
5
6
7
8
9
10
11
12
balance
------60
99
94
90
80
88
90
92
10
60
80
10
balance_increase
---------------0
1
0
0
0
1
2
3
0
1
2
0
例
次の例では、ネストされた集約を伴うウィンドウ関数を示します。問合わせは、次
のように処理されます。
1 集約関数の SUM(balance)を使用して、特定の口座に対して、特定の四半期内の
残高すべての合計を計算します。
2 特定の四半期内の(特定の口座に対する)残高が、直前の四半期の残高を上回って
いるかどうかを確認します。
3 残高が増加していれば、累積カウント値に記録します。RESET WHEN 条件の評
価が偽の間は、連続する四半期を通して残高が増加し続けているので、引き続
き累積カウントを増加させます。
4 累積カウント値を計算するために、順序付き分析関数 ROW_NUMBER()を使用し
ます。残高が直前の四半期の残高以下になる四半期に到達すると、RESET WHEN
条件の評価が真になるので、新しいパーティションを開始します。
ROW_NUMBER()はカウントを 1 から再開します。直前の値にアクセスするため
に、ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING を指定しています。
5 最後に、カウント値が確実に 0 から始まるようにするために、1 を引いています。
SQL 関数、演算子、式および述部
909
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
balance_increase 列では、残高が増加し続けていた四半期の連続数を示します。こ
の例では、残高が増加した四半期は 1 期(1->2)だけでした。
SELECT account_key, quarter, sum(balance),
ROW_NUMBER() over
(PARTITION BY account_key
ORDER BY quarter
RESET WHEN sum(balance) /* current row balance */ <=
SUM(sum(balance)) over (PARTITION BY account_key ORDER BY quarter
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)/* prev row */
) - 1 /* to get the count started at 0 */ as balance_increase
FROM accounts
GROUP BY account_key, quarter;
上記の SELECT 文の結果は、たとえば以下のような表になります。
account_key
----------1
1
1
1
quarter
------1
2
3
4
balance
------253
258
192
150
balance_increase
---------------0
1
0
0
例
次の例では、RESET WHEN 句内の条件に、ネストされた subquery として SELECT
が含まれています。これは、許容されず、エラーになります。
SELECT SUM(a1) OVER
(ORDER BY 1
RESET WHEN 1 in (SELECT 1))
FROM t1;
$
*** Failure 3706 Syntax error: SELECT clause not supported in
RESET...WHEN clause.
ROWS 句
ROWS で、区分内の各行を求める集約関数の計算対象の行を定義します。
ROWS が指定される場合、区分内の各行を求める集約関数の計算には、ROWS 句の
中の行のサブセットのみが含まれます。
ROWS 句がない場合は、区分内のすべての行が計算に含まれます。
sales_tbl テーブルの店舗ごとの 3 か月の移動平均売上げを計算するには、次のよう
に StoreID 別に区分し、SMonth によって順序付けして、現在行から 2 つ前の行まで
を対象に計算を実行します。
910
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ関数
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER (PARTITION BY StoreID
ORDER BY SMonth
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM sales_tbl;
StoreID
------1001
1001
1001
1001
1001
1001
1002
1002
1002
1002
1002
1002
SMonth
-----1
2
3
4
5
6
1
2
3
4
5
6
ProdID
-----C
C
C
C
C
C
C
C
C
C
C
C
Sales
--------35000.00
25000.00
40000.00
25000.00
30000.00
30000.00
40000.00
35000.00
110000.00
60000.00
35000.00
100000.00
Moving Avg(Sales)
----------------35000.00
30000.00
33333.33
30000.00
31666.67
28333.33
40000.00
37500.00
61666.67
68333.33
68333.33
65000.00
ウィンドウの複数指定
複数のウィンドウ関数を使用する SQL 文では、各ウィンドウ関数のウィンドウ指定
をそれぞれ固有のものにすることができます。
たとえば、次のような例があります。
SELECT StoreID, SMonth, ProdID, Sales,
AVG(Sales) OVER (PARTITION BY StoreID
ORDER BY SMonth
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),
RANK() OVER (PARTITION BY StoreID ORDER BY Sales DESC)
FROM sales_tbl;
関連トピック
詳細は、以下を参照してください。
• DEFAULT 関数について、詳細は DEFAULT を参照してください。
• ウィンドウ指定は、ユーザー定義の集約関数にも適用できます。詳細について
は、SQL UDF を参照してください。
SQL 関数、演算子、式および述部
911
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ集約関数
• OVER()句とそれに関連する句の構文については、ウィンドウ集約関数を参照して
ください。
ウィンドウ集約関数
ウィンドウ指定が適用される集約関数は、ウィンドウ集約関数と呼ばれます。ウィ
ンドウ指定がない場合、集約関数は、限定されたすべての対象行についての値を 1
つ戻します。ウィンドウ集約関数は、問合わせに含まれる限定行ごとに新しい値を
1 つ戻します。
例えば、集約 AVG を含む次の SELECT 文では、値(売上げの平均)が 1 つだけ戻され
ます。
SELECT AVG(sale)
FROM monthly_sales;
Average(sale)
------------1368
AVG ウィンドウ関数では、各限定行が保持されます。
たとえば次の SELECT 文は、以下に示す結果を戻します。
SELECT territory, smonth, sales,
AVG(sales) OVER (PARTITION BY territory
ORDER BY smonth ROWS 2 PRECEDING)
FROM sales_history;
territory
--------East
East
East
East
East
West
West
West
West
West
912
smonth
------199810
199811
199812
199901
199902
199810
199811
199812
199901
199902
sales
----10
4
10
7
10
8
12
7
11
6
Moving Avg(sales)
----------------10
7
8
7
9
8
10
9
10
8
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ウィンドウ指定
目的
集約関数の累計、グループ、移動、または残存計算
構文
AVG
CORR
COUNT
A
(value_expression )
(value_expression_1, value_expression_2 )
value_expression
(
)
*
COVAR_POP
(value_expression_1, value_expression_2 )
COVAR_SAMP
(value_expression_1, value_expression_2 )
MAX
(value_expression )
MIN
(value_expression )
REGR_AVGX
(dependent_variable_expression_independentvariable_expression )
REGR_AVGY
(dependent_variable_expression_independentvariable_expression )
REGR_COUNT
(dependent_variable_expression_independentvariable_expression )
REGR_INTERCEPT
REGR_R2
(dependent_variable_expression_independentvariable_expression )
(dependent_variable_expression_independentvariable_expression )
REGR_SLOPE
(dependent_variable_expression_independentvariable_expression )
REGR_SXX
(dependent_variable_expression_independentvariable_expression )
REGR_SXY
(dependent_variable_expression_independentvariable_expression )
REGR_SYY
(dependent_variable_expression_independentvariable_expression )
STDDEV_POP
STDDEV_SAMP
SUM
VAR_POP
VAR_SAMP
A
SQL 関数、演算子、式および述部
(value_expression )
(value_expression )
(value_expression )
(value_expression )
(value_expression )
window
913
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
window
OVER
A
(
,
column_reference
PARTITION BY
A
B
,
ORDER BY
value_expression
ASC
DESC
NULLS FIRST
NULLS LAST
RESET WHEN condition
)
B
ROWS
UNBOUNDED PRECEDING
value
PRECEDING
CURRENT ROW
ROWS BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
value
PRECEDING
CURRENT ROW
value
value
PRECEDING AND
FOLLOWING
UNBOUNDED FOLLOWING
value
PRECEDING
CURRENT ROW
value
CURRENT ROW AND
FOLLOWING
UNBOUNDED FOLLOWING
CURRENT ROW
value
value
FOLLOWING AND
FOLLOWING
UNBOUNDED FOLLOWING
value
FOLLOWING
構文要素
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法。
914
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
値は、PARTITION BY 句および RESET WHEN 句に基づいてグループ化され、ORDER
BY 句に基づいて整列され、パーティション内の集約グループに基づいて処理の対象
とされます。
PARTITION BY
column_reference の中に、または列参照のカンマ区切りのリストで、関数の実行対
象のグループを指定(複数も可)。
PARTITION BY は任意指定です。PARTITION BY 句または RESET WHEN 句を指定し
ない場合は、FROM 句から送られる結果セット全体が、単一のグループまたはパー
ティションとなります。
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
ORDER BY
value_expression の中の、グループまたはパーティション内の値の整列順序。
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
順序付き分析関数の実行対象になるグループまたはパーティション。指定された条
件の評価に応じて変化します。条件が TRUE と評価されると、指定されたウィンド
ウ パーティション内に新しい動的パーティションが作成されます。
RESET WHEN は任意指定です。RESET WHEN 句または PARTITION BY 句を指定し
ない場合は、FROM 句から送られる結果セット全体が単一のパーティションになり
ます。
RESET WHEN を指定する場合は、ORDER BY 句も指定する必要があります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、その
ウィンドウ パーティション内にサブ パーティションを作成します。
SQL 関数、演算子、式および述部
915
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ROWS
区分内の集約グループの開始ポイント。集約グループの終了ポイントは現在行にな
ります。
行 R の集約グループは、区分内の行の順序付けでの R に対して定義される行の集合
です。
ROWS または ROWS BETWEEN 句がない場合のデフォルトの集約グループは、ROWS
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING です。
FIRST_VALUE/LAST_VALUE に対し ROWS 句がない場合のデフォルトは異なります。
「FIRST_VALUE/LAST_VALUE」を参照してください。
ROWS BETWEEN
集約グループの開始と終了。これにより、パーティション内の行の順序付けで現在
行に関連した行の集合を定義します。
グループ開始として指定される行は、グループ終了として指定される行より前にな
ければなりません。
ROWS または ROWS BETWEEN 句がない場合のデフォルトの集約グループは、ROWS
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING です。
UNBOUNDED PRECEDING
現在行より前にあるパーティション全体。
UNBOUNDED FOLLOWING
現在行より後にあるパーティション全体。
CURRENT ROW
現在行の集約グループの開始または終了。
value PRECEDING
現在行より前にある行の数。
value の値は、常に正の整数リテラルです。
value PRECEDING がグループの開始またはグループの終了になる場合、集約グルー
プ内の行の最大数は 4096 です。
value FOLLOWING
現在行より後にある行の数。
value の値は、常に正の整数リテラルです。
value FOLLOWING がグループの開始またはグループの終了になる場合、集約グルー
プ内の行の最大数は 4096 です。
916
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
ORDER BY 句が存在し、ROWS または ROWS BETWEEN 句がない状況では、ANSI
SQL:2011 ウィンドウ集約関数は ROWS UNBOUNDED PRECEDING をデフォルトの
集約グループとして使用しますが、Teradata SQL ウィンドウ集約関数は ROWS
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING を使用しま
す。
計算のタイプ
関数の計算対象の 使用する集約グループ
タイプ
累積
• ROWS UNBOUNDED PRECEDING
• ROWS BETWEEN UNBOUNDED PRECEDING AND value PRECEDING
• ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
• ROWS BETWEEN UNBOUNDED PRECEDING AND value FOLLOWING
グループ
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
移動
• ROWS value PRECEDING
• ROWS CURRENT ROW
• ROWS BETWEEN value PRECEDING AND value PRECEDING
• ROWS BETWEEN value PRECEDING AND CURRENT ROW
• ROWS BETWEEN value PRECEDING AND value FOLLOWING
• ROWS BETWEEN CURRENT ROW AND CURRENT ROW
• ROWS BETWEEN CURRENT ROW AND value FOLLOWING
• ROWS BETWEEN value FOLLOWING AND value FOLLOWING
残存
• ROWS BETWEEN value PRECEDING AND UNBOUNDED FOLLOWING
• ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
• ROWS BETWEEN value FOLLOWING AND UNBOUNDED FOLLOWING
ウィンドウ集約関数への引数
ウィンドウ集約関数は、リテラル、リテラル式、列名(sales など)、または列式(sales
+ profit など)を引数として取ることができます。
ウィンドウ集約では、通常の集約を PARTITION BY 句と ORDER BY 句の入力パラ
メータとして受け取ることもできます。RESET WHEN 句では、RESET WHEN 条件
句の一部として集約を受け取ることができます。
COUNT は、以下の SQL 問合わせのように、「*」を入力引数として取ることができ
ます。
SQL 関数、演算子、式および述部
917
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
SELECT city, kind, sales, profit,
COUNT(*) OVER (PARTITION BY city, kind
ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING)
FROM activity_month;
結果のタイプと書式
ウィンドウ集約関数の結果のデータ タイプと書式は以下のとおりです。
関数
結果のタイプ
書式
AVG(x)
FLOAT
FLOAT のデフォル
ト書式
FLOAT
オペランド x と同
じ書式
FLOAT
FLOAT のデフォル
ト書式
オペランド x と同じデータ タイプ
オペランド x の
データ タイプのデ
フォルトの書式
x が文字型の場合
AVG(x)
x が数値、DATE、または
INTERVAL 型の場合
CORR(x,y)
COVAR_POP(x,y)
COVAR_SAMP(x,y)
REGR_AVGX( y,x)
REGR_AVGY( y,x)
REGR_INTERCEPT(x,y)
REGR_R2(x,y)
REGR_SLOPE(x,y)
REGR_SXX(x,y)
REGR_SXY(x,y)
REGR_SYY(x,y)
STDDEV_POP(x,)
STDDEV_SAMP(x,)
VAR_POP(x,)
VAR_SAMP(x)
x が文字型の場合
CORR(x,y)
COVAR_POP(x,y)
COVAR_SAMP(x,y)
REGR_AVGX(y,x)
REGR_AVGY( y,x)
REGR_INTERCEPT(x,y)
REGR_R2(x,y)
REGR_SLOPE(x,y)
REGR_SXX(x,y)
918
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
関数
結果のタイプ
書式
REGR_SXY(x,y)
REGR_SYY(x,y)
STDDEV_POP(x)
STDDEV_SAMP(x)
VAR_POP(x)
VAR_SAMP(x)
x が以下のいずれかの型の
場合
• 数値
• DATE
• 間隔
REGR_AVGX(y,x)
REGR_AVGY(y, x)
UDT の暗黙キャス
ト先のデータ タイ
プのデフォルト書
式。
x は UDT
COUNT(x)
COUNT(*)
REGR_COUNT(x ,y)
DBSControl 内の MaxDecimal の値
• 0 または 15。結果の型は DECIMAL(15,0)、フォーマットは(15)9。
トランザクション モード • 18。結果の型は DECIMAL(18,0)、フォーマットは-(18)9。
• 38。結果の型は DECIMAL(38,0)、フォーマットは-(38)9。
が ANSI の場合
テーブルでは、INTEGER の範囲を超えることがあるので、ANSI
トランザクション モードでは、DECIMAL が使用されます。
COUNT(x)
COUNT(*)
REGR_COUNT(x,y)
INTEGER
MAX(x), MIN(x)
オペランド x と同じデータ タイプ
オペランド x と同
じ書式
SUM(x)
オペランド x と同じ。
FLOAT のデフォル
ト書式
Teradata トランザクション モードでは、退
行問題を避けるために、INTEGER が使用さ
トランザクション モード れます。
が Teradata の場合
注: COUNT ウィンドウ集約関数の最終結果
はキャストできます。ただし、COUNT 集約
関数のようにウィンドウ関数の計算の一部
としてキャストが使用されることはありま
せん。そのため、計算中に発生するおそれ
のある数値のオーバーフロー エラーを回避
するためにキャストを使用することはでき
ません。
SQL 関数、演算子、式および述部
INTEGER のデフォ
ルト書式
919
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
関数
結果のタイプ
書式
x が文字型の場合
SUM(x)
x が DECIMAL(n,m)型の
場合
DECIMAL(p,m)。このとき、p は次の規則に DECIMAL のデフォ
従って決定されます。
ルト書式
DBSControl 内の MaxDecimal が 0 または
15 である場合
• n ≤ 15 の場合、p = 15。
• 15 < n ≤ 18, p = 18.
• n > 18 の場合、p = 38。
DBSCControl 内の MaxDecimal が 18 であ
る場合
• n ≤ 18 の場合、p = 18。
• n > 18 の場合、p = 38。
DBSControl の MaxDecimal が 38 で n が任
意の値である場合、p = 38。
SUM(x)
オペランド x と同じ。
オペランドのデー
タ タイプのデフォ
ルトの書式
x が DECIMAL 以外の数
値型の場合
結果のタイトル
表示結果または印刷結果の見出しに表示されるデフォルト タイトルは、実行される
計算のタイプによって異なります。
計算のタイプ
結果のタイトル
累計
Cumulative Function_name (argument_list)
たとえば、次の計算を考えてみましょう。
SELECT AVG(sales) OVER (PARTITION BY region
ORDER BY smonth ROWS UNBOUNDED PRECEDING)
FROM sales_history;
結果の見出しに表示されるタイトルは以下のようになります。
Cumulative Avg(sales)
グループ
Group Function_name (argument_list)
たとえば、次の計算を考えてみましょう。
SELECT AVG(sales) OVER (PARTITION BY region
ORDER BY smonth ROWS BETWEEN UNBOUNDED
920
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
計算のタイプ
結果のタイトル
PRECEDING AND UNBOUNDED FOLLOWING)
FROM sales_history;
結果の見出しに表示されるタイトルは以下のようになります。
Group Avg(sales)
移動
Moving Function_name (argument_list)
たとえば、次の計算を考えてみましょう。
SELECT AVG(sales) OVER (PARTITION BY region
ORDER BY smonth ROWS 2 PRECEDING)
FROM sales_history;
結果の見出しに表示されるタイトルは以下のようになります。
Moving Avg(sales)
残存
Remaining Function_name (argument_list)
たとえば、次の計算を考えてみましょう。
SELECT AVG(sales) OVER (PARTITION BY region
ORDER BY smonth ROWS BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING)
FROM sales_history;
結果の見出しに表示されるタイトルは以下のようになります。
Remaining Avg(sales)
データが欠けている場合の問題
分析するデータに、欠けているデータ ポイントがないことを確認してください。欠
けているポイントがあるデータに関して移動関数を計算すると、予期しない不正確
な結果が生成されます。なぜなら、n 個の論理データ ポイントではなく、n 個の物
理データ行が計算の対象になるからです。
ウィンドウ関数内での集約のネスト
ウィンドウ関数(選択リスト、HAVING、QUALIFY、ORDER BY 句など)内に集約をネ
ストできますが、HAVING には RANK() OVER (ORDER BY SUM(x))のようなネストさ
れた構文を含めることができないため、HAVING 句に含めることができるのは集約
関数の参照のみです。
Teradata 固有の関数を使用して集約関数を指定することはできません。
SQL 関数、演算子、式および述部
921
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
例
次の問合わせは、選択リストに含まれる RANK 順序付き分析関数内に SUM 集約関数
をネストします。
SELECT state, city, SUM(sale),
RANK() OVER (PARTITION BY state ORDER BY SUM(sale))
FROM T1
WHERE T1.cityID = T2.cityID
GROUP BY state, city
HAVING MAX(sale) > 10;
代替手段: 派生テーブルの使用
集約を同じ SELECT リストにまとめて指定するのに使用できるのはウィンドウ関数
のみですが、派生テーブルまたはビューを使用して、ウィンドウ関数と Teradata 固
有の関数を集約と組み合わせることができます。派生テーブルまたはビューを使用
すると、計算の意味体系を明確にすることにもなります。
例
以下の例は、店舗内の特定の製品の売上げ順位と、各店舗のトップ 3 の製品が店舗
売上げ全体に占める割合を示したものです。
SELECT RT.storeid, RT.prodid, RT.sales,
RT.rank_sales, RT.sales * 100.0/ST.sum_store_sales
FROM (SELECT storeid, prodid, sales, RANK(sales) AS rank_sales
FROM sales_tbl
GROUP BY storeID
QUALIFY RANK(sales) <=3) AS RT,
(SELECT storeID, SUM(sales) AS sum_store_sales
FROM sales_tbl
GROUP BY storeID) AS ST
WHERE RT.storeID = ST.storeID
ORDER BY RT.storeID, RT.sales;
結果のテーブルは、たとえば以下のようになります。
922
storeID
prodID
sales
1001
D
35000.00 3
17.949
1001
C
60000.00 2
30.769
1001
A
100000.0 1
0
51.282
1002
D
25000.00 3
25.000
1002
C
35000.00 2
35.000
1002
A
40000.00 1
40.000
rank_sales
sales*100.0/sum_store_sales
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
storeID
prodID
sales
rank_sales
sales*100.0/sum_store_sales
1003
C
20000.00 3
20.000
1003
A
30000.00 2
30.000
1003
D
50000.00 1
50.000
...
...
...
...
順序付き分析関数に代わる Teradata 固有の構文
Teradata SQL は、順序付き分析関数の 2 つの代替構文をサポートしています。
• Teradata 固有
• ANSI SQL:2011 準拠
ウィンドウ集約、順位、分布、および行番号関数は ANSI SQL:2011 に準拠していま
す。一方、Teradata 固有の関数は準拠していません。
Teradata 固有の関数および ANSI SQL:2011 ウィンドウ関数
次の表は、Teradata 固有の関数に相当する ANSI SQL:2011 ウィンドウ関数を示し
たものです。
注: 以下の表にリストされている、Teradata 固有の関数の使用は強く推奨されませ
ん。それらの関数は、既存のアプリケーションとの下位互換性のためにのみ残され
ています。新規アプリケーションを開発する場合は、ANSI 準拠のウィンドウ関数を
使用するようにしてください。
Teradata 固有の関数
対応する ANSI SQL:2011 ウィンドウ関数
CSUM
SUM
MAVG
AVG
MDIFF(x, w, y)
SUM から構成可能
MLINREG
SUM および COUNT から構成可能
QUANTILE
RANK および COUNT から構成可能
RANK
RANK
MSUM
SUM
ウィンドウ集約関数と Teradata 固有の関数の比較
ANSI 準拠にして移植可能にするアプリケーションでは、 MAVG、CSUM、および
MSUM などの Teradata 固有の関数の使用は避けてください。
SQL 関数、演算子、式および述部
923
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ANSI
関数
Teradata 関係
関数
AVG
MAVG
ROWS value PRECEDING の集約グループを指定する AVG ウィンドウ
関数の形式は、Teradata 固有の関数 MAVG に相当する ANSI の形式で
す。
ROWS value PRECEDING 句は、現在行との移動合計の計算対象とな
る、現在行に先行する行の合計数を指定することに注意してください。
集約グループ内の行の合計数は value + 1 です。MAVG 関数の場合の
集約グループ内の行の合計数は width の値です。
AVG ウィンドウ関数の場合、たとえば ROWS 5 PRECEDING の集約グ
ループを指定すると、移動平均の計算対象として、現在行とそれに先
行する 5 つの行が使用されることになります。したがって、区分の 6
番目の行の移動平均は、行 6、5、4、3、2、1 (つまり、全部で 6 行)
が対象になります。
MAVG 関数の場合、width が 5 であれば、現在行とそれに先行する 4
つの行が移動平均の計算に使用されます。したがって、6 番目の行の
移動平均は、行 6、5、4、3、2 (つまり、全部で 5 行)が対象になりま
す。
SUM
CSUM
MSUM
新規アプリケーションを開発する場合は、ANSI 準拠の SUM ウィンド
ウ関数を使用するようにしてください。ANSI 準拠にして移植可能にす
るアプリケーションでは、CSUM および MSUM の使用は避けてくださ
い。
ここでは、SUM ウィンドウ関数と、Teradata 固有の関数である CSUM
関数および MSUM 関数との関係について、それぞれ説明します。
• ORDER BY 句を使い、なおかつ ROWS UNBOUNDED PRECEDING
を指定する SUM ウィンドウ関数は、CSUM の ANSI 版と言えます。
• ORDER BY 句を使い、なおかつ ROWS value PRECEDING を指定す
る SUM ウィンドウ関数は、MSUM の ANSI 版と言えます。
ROWS value PRECEDING 句は、現在行との移動合計の計算対象と
なる、現在行に先行する行の合計数を指定することに注意してくだ
さい。集約グループ内の行の合計数は value + 1 です。MSUM 関数
の場合の集約グループ内の行の合計数は width の値です。
したがって、移動合計を計算する SUM ウィンドウ関数の場合、
ROWS 5 PRECEDING の集約グループを指定すると、移動合計の計
算対象として、現在行とそれに先行する 5 つの行が使用されること
になります。たとえば、区分の 6 番目の行の移動合計は、行 6、5、
4、3、2、1 (つまり、全部で 6 行)が対象になります。
924
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ANSI
関数
Teradata 関係
関数
MSUM 関数の場合、width が 5 であれば、現在行とそれに先行す
る 4 つの行が移動合計の計算に使用されます。したがって、たとえ
ば 6 番目の行の移動合計は、行 6、5、4、3、2 (つまり、全部で 5
行)が対象になります。
さらに、行の数が width 個よりも少ないデータの場合、MSUM は、
先行するすべての行を使って合計を計算します。MSUM は、サン
プル内の行の数が width よりも少ない場合、null ではなく現在の合
計を返します。
例: グループ カウント
以下の SQL 問合わせを実行すると、その次にあるような結果が生成されます。この
結果では、city と kind で定義した 4 つの各パーティションについて、売上げのグ
ループ カウントが戻されています。売上げのない行がカウントされていないことに
注意する必要があります。
SELECT city, kind, sales, profit,
COUNT(sales) OVER (PARTITION BY city, kind
ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING)
FROM activity_month;
city
------LA
LA
LA
LA
LA
LA
Seattle
Seattle
Seattle
Seattle
Seattle
kind
-------Canvas
Canvas
Canvas
Canvas
Leather
Leather
Canvas
Canvas
Canvas
Leather
Leather
sales
----45
125
125
20
20
?
15
20
20
35
?
profit
-----320
190
400
120
40
?
30
30
100
50
?
Group Count(sales)
-----------------4
4
4
4
1
1
3
3
3
1
1
例: 残存カウント
売上げが入っていない行を含む、すべての行をカウントするには、COUNT(*)を使用
します。現在行より後のパーティションに残っている行の数をカウントする例を次
に示します。
SELECT city, kind, sales, profit,
COUNT(*) OVER (PARTITION BY city, kind ORDER BY profit DESC
SQL 関数、演算子、式および述部
925
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
FROM activity_month;
city
------LA
LA
LA
LA
LA
LA
Seattle
Seattle
Seattle
Seattle
Seattle
kind
-------Canvas
Canvas
Canvas
Canvas
Leather
Leather
Canvas
Canvas
Canvas
Leather
Leather
sales
----20
125
45
125
?
20
15
20
20
?
35
profit
-----120
190
320
400
?
40
30
30
100
?
50
Remaining Count(*)
-----------------?
1
2
3
?
1
?
1
2
?
1
ウィンドウ指定で指定する並替え順序によって関数の適用対象の行の並替え順序が
定義されますが、それによって結果の順序が定義されるわけではないことに注意し
てください。
この例では計算には DESC 並替え順序が指定されていますが、結果はその逆の順序
で戻されています。
結果を順序付けするには、次のように、SELECT 文で ORDER BY 句を使用します。
SELECT city, kind, sales, profit,
COUNT(*) OVER (PARTITION BY city, kind ORDER BY profit DESC
ROWS BETWEEN 1 FOLLOWING AND
UNBOUNDED FOLLOWING)
FROM activity_month
ORDER BY city, kind, profit DESC;
city
------LA
LA
LA
LA
LA
LA
Seattle
Seattle
Seattle
Seattle
Seattle
926
kind
-------Canvas
Canvas
Canvas
Canvas
Leather
Leather
Canvas
Canvas
Canvas
Leather
Leather
sales
----125
45
125
20
20
?
20
20
15
35
?
profit
-----400
320
190
120
40
?
100
30
30
50
?
Remaining Count(*)
-----------------3
2
1
?
1
?
2
1
?
1
?
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
例: 累計最大
以下の SQL 問合わせを実行すると、その次にあるような結果が生成されます。この
結果では、city と kind で定義した区分のそれぞれについて、売上げの累積最大値が
戻されています。
SELECT city, kind, sales, week,
MAX(sales) OVER (PARTITION BY city, kind
ORDER BY week ROWS UNBOUNDED PRECEDING)
FROM activity_month;
city
------LA
LA
LA
LA
LA
LA
LA
LA
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
kind
-------Canvas
Canvas
Canvas
Canvas
Leather
Leather
Leather
Leather
Canvas
Canvas
Canvas
Leather
Leather
Leather
Leather
Leather
sales
----263
294
321
274
144
826
489
555
100
182
94
933
840
899
915
462
week
---16
17
18
20
16
17
20
21
16
17
18
16
17
18
19
20
Cumulative Max(sales)
--------------------263
294
321
321
144
826
826
826
100
182
182
933
933
933
933
933
例: 累積最小
以下の SQL 問合わせを実行すると、その次にあるような結果が生成されます。この
結果では、city と kind で定義した区分のそれぞれについて、売上げの累積最小値が
戻されています。
SELECT city, kind, sales, week,
MIN(sales) OVER (PARTITION BY city, kind
ORDER BY week
ROWS UNBOUNDED PRECEDING)
FROM activity_month;
city
------LA
LA
SQL 関数、演算子、式および述部
kind
-------Canvas
Canvas
sales
----263
294
week
---16
17
Cumulative Min(sales)
--------------------263
263
927
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
LA
LA
LA
LA
LA
LA
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
Seattle
Canvas
Canvas
Leather
Leather
Leather
Leather
Canvas
Canvas
Canvas
Leather
Leather
Leather
Leather
Leather
321
274
144
826
489
555
100
182
94
933
840
899
915
462
18
20
16
17
20
21
16
17
18
16
17
18
19
20
263
263
144
144
144
144
100
100
94
933
840
840
840
462
例: 累積合計
以下の問合わせは、取引日付の順序で並べた口座ごとの累積残高を戻します。
SELECT acct_number, trans_date, trans_amount,
SUM(trans_amount) OVER (PARTITION BY acct_number
ORDER BY trans_date
ROWS UNBOUNDED PRECEDING) as balance
FROM ledger
ORDER BY acct_number, trans_date;
上記の SELECT の結果の例を示します。
acct_number
trans_date
trans_amount
balance
73829
1998-11-01
113.45
113.45
73829
1988-11-05
-52.01
61.44
73929
1998-11-13
36.25
97.69
82930
1998-11-01
10.56
10.56
82930
1998-11-21
32.55
43.11
82930
1998-11-29
-5.02
38.09
例: グループ合計
以下の問合わせは、各都市の肉の売上げの総合計を示します。
SELECT city, kind, sales,
SUM(sales) OVER (PARTITION BY city ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) FROM monthly;
上記の SELECT 文の結果は、たとえば以下のような表になります。
928
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
city
kind
sales
Group Sum (sales)
Omaha
pure pork
45
220
Omaha
pure pork
125
220
Omaha
pure pork
25
220
Omaha
variety pack
25
220
Chicago
variety pack
55
175
Chicago
variety pack
45
175
Chicago
pure pork
50
175
Chicago
variety pack
25
175
例: グループ合計
以下の問合わせは、すべての都市の肉の売上げの総合計を戻します。SUM 関数に
PARTITION BY 句がないため、グループ合計にすべての都市が含まれることに注意
する必要があります。
SELECT city, kind, sales,
SUM(sales) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING)
FROM monthly;
上記の SELECT 文の結果は、たとえば以下のような表になります。
city
kind
sales
Group Sum (sales)
Omaha
pure pork
45
395
Omaha
pure pork
125
395
Omaha
pure pork
25
395
Omaha
variety pack
25
395
Chicago
variety pack
55
395
Chicago
variety pack
45
395
Chicago
pure pork
50
395
Chicago
variety pack
25
395
例: 移動合計
以下の問合わせは、都市ごとの肉の売上げの移動合計を戻します。問合わせが、都
市(区分)ごとに、区分の現在行とそれに先行する 3 つの行(可能な場合)について、売
上げの移動合計を戻していることに注意する必要があります。
肉の種類が戻されている順序は、利益に基づくデフォルトの昇順になっています。
SQL 関数、演算子、式および述部
929
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
売上げの数字がない場合は、売上げの移動合計を計算することはできません。この
場合、sum(sales)列は null になります。
SELECT city, kind, sales, profit,
SUM(sales) OVER (PARTITION BY city, kind
ORDER BY profit ROWS 3 PRECEDING)
FROM monthly;
930
city
kind
sales
profit
Moving sum (sales)
Omaha
pure pork
25
40
25
Omaha
pure pork
25
120
50
Omaha
pure pork
45
140
95
Omaha
pure pork
125
190
220
Omaha
pure pork
45
320
240
Omaha
pure pork
1255
400
340
Omaha
variety pack
?
?
?
Omaha
variety pack
25
40
25
Omaha
variety pack
25
120
50
Chicago
pure pork
?
?
?
Chicago
pure pork
15
10
15
Chicago
pure pork
54
12
69
Chicago
pure pork
14
20
83
Chicago
pure pork
54
24
137
Chicago
pure pork
14
34
136
Chicago
pure pork
95
80
177
Chicago
pure pork
95
140
258
Chicago
pure pork
15
220
219
Chicago
variety pack
23
39
23
Chicago
variety pack
25
40
48
Chicago
variety pack
125
70
173
Chicago
variety pack
125
100
298
Chicago
variety pack
23
100
298
Chicago
variety pack
25
120
298
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
例: 残存合計
以下の問合わせは、すべての都市の肉の売上げの残存合計を戻します。SUM 関数に
PARTITION BY 句がないため、残存合計にすべての都市が含まれることに注意する
必要があります。
SELECT city, kind, sales,
SUM(sales) OVER (ORDER BY city, kind
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
FROM monthly;
上記の SELECT 文の結果は、たとえば以下のような表になります。
city
------Omaha
Omaha
Omaha
Omaha
Chicago
Chicago
Chicago
Chicago
kind
------------variety pack
pure pork
pure pork
pure pork
variety pack
variety pack
variety pack
pure pork
sales
------25
125
25
45
55
25
45
50
Remaining Sum(sales)
-------------------?
25
150
175
220
275
300
345
計算の並替え順序は、まず city 単位でアルファベット順、そして kind 単位でアル
ファベット順であることに注意してください。しかし結果は、その逆の順序で表示
されます。
ウィンドウ指定で指定する並替え順序によって関数の適用対象の行の並替え順序が
定義されますが、それによって結果の順序が定義されるわけではありません。結果
を順序付けするには、SELECT 文で ORDER BY 句を使用します。
以下に例を示します。
SELECT city, kind, sales,
SUM(sales) OVER (ORDER BY city, kind
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
FROM monthly
ORDER BY city, kind;
上記の SELECT 文の結果は、たとえば以下のような表になります。
city
------Chicago
Chicago
Chicago
Chicago
Omaha
kind
------------pure pork
variety pack
variety pack
variety pack
pure pork
SQL 関数、演算子、式および述部
sales
------50
55
25
45
25
Remaining Sum(sales)
-------------------345
265
320
220
70
931
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
Omaha
Omaha
Omaha
pure pork
pure pork
variety pack
125
45
25
95
25
?
計算対象
使用する関数
累積合計
• SUM ウィンドウ関数
• CSUM
累計、グループ、または移動カウント
COUNT ウィンドウ関数
グループ合計
SUM ウィンドウ関数
移動平均
• AVG ウィンドウ関数
• MAVG
現在の行列値と、それに先行する n 番目の行列値との
間の移動差分
MDIFF
移動線形回帰
MLINREG
移動合計
• SUM ウィンドウ関数
• MSUM
列の値の分位スコア
QUANTILE
グループ内のすべての行の順序付き順位
• RANK ウィンドウ関数
• RANK
グループ内の行の相対的な順位
PERCENT_RANK ウィンドウ関数
ウィンドウのウィンドウ順序に基づく、そのウィンド
ウ パーティション内の行の順次行番号
ROW_NUMBER
累計、グループ、または移動最大値
MAX ウィンドウ関数
累計、グループ、または移動最小値
MIN ウィンドウ関数
GROUP BY 句
GROUP BY とウィンドウ関数
ウィンドウ関数の場合、GROUP BY 句には、以下のものに指定されている列がすべ
て含まれていなければなりません。
•
•
•
•
932
SELECT 句の選択リスト
SELECT 句の選択リストのウィンドウ関数
QUALIFY 句の検索条件のウィンドウ関数
RESET WHEN 句内の条件
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
たとえば、次の SELECT 文の場合、選択リストの中で列 City が指定されており、選
択リストの COUNT ウィンドウ関数の中と QUALIFY 句の中で列 StoreID が指定され
ています。どちらの列も、GROUP BY 句でも指定されています。
SELECT City, StoreID, COUNT(StoreID) OVER ()
FROM sales_tbl
GROUP BY City, StoreID
QUALIFY COUNT(StoreID) >=3;
ウィンドウ関数の場合、GROUP BY は group-by 列に同じ値が入っているすべての
行を 1 つの行に圧縮します。
たとえば、次の文では GROUP BY 句を使用することにより、City と StoreID が同じ
値の行をすべて 1 つの行に圧縮します。
SELECT City, StoreID, COUNT(StoreID) OVER ()
FROM sales_tbl
GROUP BY City, StoreID;
結果は次のようになります。
City
----Pecos
Pecos
Ozona
StoreID
------1001
1002
1003
Group Count(StoreID)
-------------------3
3
3
GROUP BY を使用しない場合の結果は次のようになります。
City
----Pecos
Pecos
Pecos
Pecos
Pecos
Pecos
Pecos
Ozona
Ozona
StoreID
------1001
1001
1001
1001
1002
1002
1002
1003
1003
Group Count(StoreID)
-------------------9
9
9
9
9
9
9
9
9
GROUP BY と Teradata 固有の関数
Teradata 固有の関数の場合、GROUP BY は関数の実行対象の区分を決定します。こ
の句は、group-by 列に同じ値が入っているすべての行を 1 つの行に圧縮することを
しない。したがって、このような場合に GROUP BY 句に必要なのは、関数の区分化
列を指定することだけです。
たとえば、次の文は GROUP BY 句を使用して店舗ごとの連続売上げを計算して、
sales_tbl 内のデータを StoreID 別に区分します。
SQL 関数、演算子、式および述部
933
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
SELECT StoreID, Sales, CSUM(Sales, StoreID)
FROM sales_tbl
GROUP BY StoreID;
結果は次のようになります。
StoreID
------1001
1001
1001
1001
1002
1002
1002
1003
1003
Sales
-------1100.00
400.00
1000.00
2000.00
500.00
1500.00
2500.00
1000.00
3000.00
CSum(Sales,StoreID)
------------------1100.00
1500.00
2500.00
4500.00
500.00
2000.00
4500.00
1000.00
4000.00
ウィンドウ関数、Teradata 固有の関数、および GROUP BY の組み合わせ
次の表は、ウィンドウ関数、Teradata 固有の関数、集約関数、および GROUP BY 句
の使用可能な組み合わせの意味を示したものです。
組み合わせ
ウィンド
ウ関数
Teradata 固有の 集約関数
関数
意味構造
GROUP BY
句
X
値は行ごとに計算される。
X
値は行ごとに計算される。テーブ
ル全体が、Teradata 固有の関数の
実行対象の単一のグループ(区分)を
構成する。
X
X
X
X
934
テーブル全体で 1 つの集約値が計
算される。
X
GROUP BY は、group-by 列に同じ
値が入っているすべての行を 1 つ
の行に圧縮する。値は結果行ごと
に計算される。
X
GROUP BY は、Teradata 固有の関
数の実行対象の区分を決定する。
この句は、group-by 列に同じ値が
入っているすべての行を 1 つの行
に圧縮することをしない。
X
集約はグループごとに行なわれる。
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ウィンドウ指定
組み合わせ
ウィンド
ウ関数
Teradata 固有の 集約関数
関数
X
X
X
X
X
意味構造
GROUP BY
句
Teradata 固有の関数は区分を持た
ない。テーブル全体が 1 つの区分
になる。
X
X
GROUP BY は、Teradata 固有の関
数の区分を決定する。GROUP BY
は、group-by 列に同じ値が入って
いるすべての行を 1 つの行に圧縮
することをしない。また GROUP
BY は、ウィンドウ関数の計算には
影響しない。
X
GROUP BY は、group-by 列に同じ
値が入っているすべての行を 1 つ
の行に圧縮する。ウィンドウ関数
の場合、値は結果行ごとに計算さ
れる。集約関数の場合、集約はグ
ループごとに行なわれる。
SELECT Sum の結果オーバーフローが発生する可能性
この関数を使用する場合に、データ タイプおよび書式が一致していないと、オー
バーフローが発生することがあります。列を次のように定義したとします。
Salary Decimal(15,2) Format '$ZZZ,ZZ9.99'
以下の問合わせを実行します。
SELECT SUM (Salary) FROM Employee;
小数オペランドおよび書式が一致していないため、オーバーフローが発生します。
オーバーフローが発生する可能性を回避するには、結果のデータ タイプでの、その
小数の合計が収まる十分な大きさで、小数の合計の書式を明示的に指定します。
SELECT Sum(Salary) (format '$Z,ZZZ,ZZZ,ZZ9.99) FROM Employee;
関連トピック
詳細は、以下を参照してください。
• 集約関数および引数の説明については、「集約関数」を参照してください。
• 詳細については、 SQL データ操作言語、B035-1146 の「RESET WHEN 条件の
ルール」と「QUALIFY 句」を参照してください。
• データ タイプのデフォルトの書式、および書式における書式設定文字について
の説明は、<SQL データ型とリテラル>の「データ タイプの書式および書式句」
を参照してください。
SQL 関数、演算子、式および述部
935
第 22 章 順序付き分析関数/ウィンドウ集約関数
CSUM
CSUM
目的
パーティション内の行を sort_expression リストによって整列するという前提で、
パーティション内の各行について、値式の累積合計(または現在までの合計)を戻しま
す。
タイプ
Teradata 固有の関数
構文
CSUM
(
value_expression,
,
sort_expression
(
ASC
DESC
構文要素
value_expression
連続合計を計算するための数値リテラルまたは列式。
デフォルトで CSUM は value_expression のデフォルト データ型を使用します。より
大きな数値は、これをより高位のデータ型にキャストすることによってサポートさ
れます。
この式に順序付き分析関数や集約関数を含めることはできません。
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
この式に順序付き分析関数や集約関数を含めることはできません。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
936
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
CSUM
CSUM に代わる SUM の使用
CSUM は使用しないようにしてください。これは ANSI SQL:2011 規格の Teradata
拡張機能であり、集約グループとして ROWS UNBOUNDED PRECEDING を指定する
ANSI 準拠の SUM ウィンドウ関数に相当するものです。CSUM は、既存のアプリ
ケーションとの下位互換性のためにのみ残されています。
累積合計の意味
CSUM は、各行に SUM の現在値を与えながら、行の順序セットの合計を累積して
いきます。
SELECT Sum の結果オーバーフローが発生する可能性
SELECT Sum の結果オーバーフローが発生する可能性
この関数を使用する場合に、データ型とフォーマットが同期していないと、結果に
よりオーバーフローが発生することがあります。列が以下のように定義されている
場合:
Salary Decimal(15,2) Format ‘$ZZZ,ZZ9.99’
以下の問合わせを実行します。
SELECT SUM (Salary) FROM Employee;
小数オペランドおよび書式が一致していないため、オーバーフローが発生します。
オーバーフローが発生する可能性を回避するには、結果のデータ タイプでの、その
小数の合計が収まる十分な大きさで、小数の合計の書式を明示的に指定します。
SELECT Sum(Salary) (format ‘$Z,ZZZ,ZZZ,ZZ9.99) FROM Employee;
結果のタイプと属性
CSUM のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: オペランド x と同じ
• オペランド x が文字である場合、書式は FLOAT のデフォルトの書式である。
• オペランド x が数値である場合、書式は x と同じ書式である。
例
例
1998 年の各月ごとに、製品コード 10 について、毎日の売上げの連続合計を出して
みます。
SELECT cmonth, CSUM(sumPrice, cdate)
FROM
SQL 関数、演算子、式および述部
937
第 22 章 順序付き分析関数/ウィンドウ集約関数
CUME_DIST
(SELECT a2.month_of_year,
a2.calendar_date,a1.itemID, SUM(a1.price)
FROM Sales a1, SYS_CALENDAR.Calendar a2
WHERE a1.calendar_date=a2.calendar_date
AND a2.calendar_date=1998
AND a1.itemID=10
GROUP BY a2.month_of_year, a1.calendar_date,
a1.itemID) AS T1(cmonth, cdate, sumPrice)
GROUP BY cmonth;
月ごとにグループ化してあるので、各月の月末までの累積合計が出たら、翌月の計
算のために値がゼロに設定されるようになっています。したがって、同一の問合わ
せで各品目の累積合計を計算できます。
例
店舗 5 号について、1 月の各品目の売上げの連続合計を出し、グラフ作成プログラ
ムにエクスポートできる状態の出力を生成してみましょう。
SELECT Item, SalesDate, CSUM(Revenue,Item,SalesDate) AS
CumulativeSales
FROM
(SELECT Item, SalesDate, SUM(Sales) AS Revenue
FROM DailySales
WHERE StoreId=5 AND SalesDate BETWEEN
'1/1/1999' AND '1/31/1999'
GROUP BY Item, SalesDate) AS ItemSales
ORDER BY SalesDate;
結果は、たとえば以下のようなテーブルになります。
Item
SalesDate
CumulativeSales
InstaWoof dog food
01/01/1999
972.99
InstaWoof dog food
01/02/1999
2361.99
InstaWoof dog food
01/03/1999
5110.97
InstaWoof dog food
01/04/1999
7793.91
CUME_DIST
目的
値グループの値の累積分布を計算します。
938
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
CUME_DIST
タイプ
ANSI SQL:2011 ウィンドウ関数。
構文
CUME_DIST()
OVER
A
(
,
PARTITION BY
column_reference
,
A
ORDER BY
)
value_expression
ASC
DESC
NULLS FIRST
NULLS LAST
RESET WHEN condition
構文要素
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法を指定します。
値は、PARTITION BY 句 BEGIN および RESET WHEN 句 END に基づいてグループ化
され、ORDER BY 句に基づいて整列され、パーティション内の集約グループに基づ
いて処理の対象とされます。
PARTITION BY
関数が操作対象とするグループ。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送ら
れる結果セット全体がパーティションになります。
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
ORDER BY
グループまたはパーティション内の値の整列順序。
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
降順の整列順序。
SQL 関数、演算子、式および述部
939
第 22 章 順序付き分析関数/ウィンドウ集約関数
CUME_DIST
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
関数の実行対象になる 1 つまたは複数のグループ。指定された条件の評価に応じて
変化します。条件が TRUE と評価されると、指定されたウィンドウ パーティション
内に新しい動的パーティションが作成されます。
RESET WHEN は任意指定です。RESET WHEN 句または PARTITION BY 句を指定し
ない場合は、結果セット全体が単一のパーティションになります。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送られ
る結果セット全体がパーティションになります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、そのウィ
ンドウ パーティション内にサブ パーティションを作成します。
詳細については、<SQL データ操作言語>の「RESET WHEN 条件のルール」および
「QUALIFY 句」を参照してください。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
CUME_DIST の使用
CUME_DIST は、PERCENT_RANK に似ています。同順位の存在下で RANK 値を考慮
する PERCENT_RANK と異なり、CUME_DIST は同順位の最も高い順位を使用しま
す。つまり、同等の順位があるときには、同順位の最後に位置する値を使用します。
CUME_DIST は、パーティション内のその位置の比になります(RANK-HIGH/NUM
ROWS)。
結果
CUME_DIST によって返される値の範囲は、0 より大きく、1 以下となります。
940
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
DENSE_RANK (ANSI)
例
次の SELECT 文について考えてみます。
SELECT lname, serviceyrs,
CUME_DIST()OVER(ORDER BY serviceyrs)
FROM schooltbl
GROUP BY 1,2;
schooltbl に記載されている教師の勤続年数別に累積分布を返します。
lname
serviceyrs
CUME_DIST
Adams
10
0.333333
Peters
10
0.333333
Murray
10
0.333333
Rogers
15
0.444333
Franklin
16
0.555333
Smith
20
0.888889
Ford
20
0.888889
Derby
20
0.888889
Baker
20
1.000000
DENSE_RANK (ANSI)
目的
ORDER BY 句に含まれる value_expression に基づいて、行の順序付き順位を戻しま
す。
タイプ
ANSI SQL:2011 ウィンドウ関数。
SQL 関数、演算子、式および述部
941
第 22 章 順序付き分析関数/ウィンドウ集約関数
DENSE_RANK (ANSI)
構文
DENSE_RANK()
OVER
A
(
,
PARTITION BY
column_reference
,
A
ORDER BY
)
value_expression
ASC
DESC
NULLS FIRST
NULLS LAST
RESET WHEN condition
構文要素
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法を指定します。
値は、PARTITION BY 句 BEGIN および RESET WHEN 句 END に基づいてグループ化
され、ORDER BY 句に基づいて整列され、パーティション内の集約グループに基づ
いて処理の対象とされます。
PARTITION BY
関数が操作対象とするグループ。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送られ
る結果セット全体がパーティションになります。
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
ORDER BY
グループまたはパーティション内の値の整列順序。
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
942
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
DENSE_RANK (ANSI)
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
関数の実行対象になる 1 つまたは複数のグループ。指定された条件の評価に応じて
変化します。条件が TRUE と評価されると、指定されたウィンドウ パーティション
内に新しい動的パーティションが作成されます。
RESET WHEN 句または PARTITION BY 句を指定しない場合は、結果セット全体が
単一のパーティションになります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、その
ウィンドウ パーティション内にサブ パーティションを作成します。
詳細については、<SQL データ操作言語>の「RESET WHEN 条件のルール」および
「QUALIFY 句」を参照してください。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
DENSE_RANK の使用
順位は、1 で始まる連続する整数です。値が等しい行は、同じ順位になります。同
順位の場合、順位値はスキップされません。
結果のタイプ
結果のデータ タイプは INTEGER です。
例
次の SELECT 文について考えてみます。
SELECT lname, serviceyrs,
DENSE_RANK()OVER(ORDER BY serviceyrs)
FROM schooltbl
GROUP BY 1,2;
schooltbl に記載されている教師の勤続年数別に順序付き順位を返します。
SQL 関数、演算子、式および述部
943
第 22 章 順序付き分析関数/ウィンドウ集約関数
FIRST_VALUE/LAST_VALUE
lname
serviceyrs
DENSE_RANK
Adams
10
1
Peters
10
1
Murray
10
1
Rogers
15
2
Franklin
16
3
Smith
20
4
Ford
20
4
Derby
20
4
Baker
25
5
FIRST_VALUE/LAST_VALUE
目的
値の順序セットの最初の値または最後の値を返します。
タイプ
ANSI SQL:2011 ウィンドウ関数。
構文
FIRST_VALUE
LAST_VALUE
(
value_expression
)
IGNORE
window
NULLS
RESPECT
構文要素
value_expression
列式。
FIRST_VALUE および LAST_VALUE では、value_expression のデフォルトのデータ
タイプが使用されます。
より大きな数値は、これをより高位のデータ タイプにキャストすることによってサ
ポートされます。
この式に順序付き分析関数や集約関数を含めることはできません。
944
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
FIRST_VALUE/LAST_VALUE
IGNORE NULLS
NULL を返さないことを指定するキーワード。
• IGNORE NULLS (FIRST_VALUE あり) = セット内の最初の非 NULL 値を返します。
ただし、すべての値が NULL である場合には NULL を返します。
• IGNORE NULLS (LAST_VALUE あり) = セット内の最後の非 NULL 値を返します。
ただし、すべての値が NULL である場合には NULL を返します。
RESPECT NULLS
NULL を返すかどうかを指定する任意選択のキーワード。
• RESPECT NULLS (FIRST_VALUE あり) = 最初の値が null かどうかを返します。
• RESPECT NULLS(LAST_VALUE あり) = 最後の値が null かどうかを返します。
すべての値が NULL である場合は、NULL が返されます。
window
グループ、累積、または移動の計算。
ウィンドウ集約関数の構文については、ウィンドウ集約関数を参照してください。
ウィンドウ集約関数構文の整列キーに同順位がある場合、FIRST_VALUE および
LAST_VALUE は非確定です。並べ替え値の同順位があるいずれかの行から
value_expression が返されます。
注: ROWS 句を省略し、ORDER BY 句を指定すると、デフォルトの ROWS は
UNBOUNDED PRECEDING AND CURRENT ROW になります。
ROWS 句を省略し、ORDER BY 句を指定しないと、デフォルトの ROWS は
UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING になります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
使用上の注意
FIRST_VALUE および LAST_VALUE は、計算のベースラインとしてよく使用される
ため、特に有益です。たとえば、日付順の売上げデータを保持するパーティション
を使用して、各日の売上げ高を期間最初の売上げ日(FIRST_VALUE)と比較できます。
または、行を売上げの少ない順に並べて、地域最大の売上げ高(LAST_VALUE)と比
較した、地域の各売上げ高の比率を確認できます。
IGNORE NULLS は、在庫テーブルに値を正しく取り込む場合に特に便利です。
IGNORE NULLS または RESPECT NULLS のいずれも選択しないことは、RESPECT
NULLS を選択することと同じです。
SQL 関数、演算子、式および述部
945
第 22 章 順序付き分析関数/ウィンドウ集約関数
MAVG
例
次の例では、開始日付別に給与、移動平均(ma)、および移動平均グループの最初と
最後の給与を返しています。
注: この関数は、ウィンドウの最初と最後の値を返します。例では、最初と最後の行
がウィンドウ内に収まっています。ウィンドウが 3 行前と 2 行前の間にあった場合
には、先頭 2 つの行の最初の値に NULL が表示されます。
SELECT start_date, salary,
AVG(salary) OVER(ORDER BY start_date
ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) ma,
FIRST_VALUE(salary) OVER(ORDER BY start_date
ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) first,
LAST_VALUE(salary) OVER(ORDER BY start_date
ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) last
FROM employee
ORDER BY start_date;
start_date
salary
ma
first
last
21-MAR-76
6661.78
6603.280
6661.78
6544.78
12-DEC-78
6544.78
5183.780
6661.78
2344.78
24-OCT-82
2344.78
4471.530
6661.78
2344.78
15-JAN-84
2334.78
4441.780
6661.78
4322.78
30-JUL-87
4322.980
4688.980
6544.78
7897.78
31-DEC-90
7897.78
3626.936
2344.78
1234.56
25-JUL-96
1234.56
3404.536
2334.78
1232.78
17-SEP-96
1232.78
3671.975
4322.78
1232.78
MAVG
目的
現在行とそれに先行する width-1 個の行の指定された値式を使って、区分内の各行
の値式の移動平均を計算します。
タイプ
Teradata 固有の関数
946
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MAVG
構文
MAVG
(
value_expression,
width,
,
sort_expression
(
ASC
DESC
構文要素
value_expression
この式に順序付き分析関数や集約関数を含めることはできません。
width
計算で使用される前の行の数。
この値は、常に正の整数リテラルです。
最大値は 4096 です。
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
例えば、MAVG(Sale, 6, Region ASC, Store DESC)のように指定します。Sale は
value_expression, であり、6 は width であり、Region ASC, Store DESC は
sort_expression リストです。
この式に順序付き分析関数や集約関数を含めることはできません。
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
SQL 関数、演算子、式および述部
947
第 22 章 順序付き分析関数/ウィンドウ集約関数
MAVG
MAVG に代わる AVG の使用
MAVG は使用しないようにしてください。これは ANSI SQL:2011 規格の Teradata
拡張機能であり、集約グループとして ROWS value PRECEDING を指定する ANSI 準
拠の AVG ウィンドウ関数に相当するものです。MAVG は、既存のアプリケーション
との下位互換性のためにのみ残されています。
結果のタイプと属性
MAVG のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: オペランド x と同じ
• オペランド x が文字である場合、書式は FLOAT のデフォルトの書式である。
• オペランド x が数値、日付、または間隔である場合、書式は x と同じ書式である。
データが欠けている場合の問題
MAVG を使って分析するデータに、欠けているデータ ポイントがないことを確認し
てください。欠けているデータ ポイントがあるデータに関して移動平均を計算する
と、予期しない不正確な結果が生成されます。なぜなら、n 個の論理データ ポイン
トではなく、n 個の物理データ行が計算の対象になるからです。
行数が width より少ない場合の移動平均の計算
その結果として生じる関係(おそらくグループ化した関係)の場合、width 個の行を対
象とした移動平均は、行が sort_expression リストで整列された状態で計算されます。
行の数が width 個よりも少ない場合、現在行とそれに先行するすべての行を対象と
して平均が計算されます。
例
例
1996 年 10 月について、製品コード 10 の毎日の売上げから 7 日間の移動平均を計
算してみましょう。
SELECT cdate, itemID, MAVG(sumPrice, 7, date)
FROM (SELECT a1.calendar_date, a1.itemID,
SUM(a1.price)
FROM Sales a1
WHERE a1.itemID=10 AND a1.calendar_date
BETWEEN 96-10-01 AND 96-10-31
GROUP BY a1.calendar_date, a1.itemID) AS T1(cdate,
itemID, sumPrice);
948
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MDIFF
例
以下の例では、Zemlinsky Bros. Corporation の株の毎日の終値から、50 日間の移動
平均を計算します。同社の略号は ZBC です。
SELECT MarketDay, ClosingPrice,
MAVG(ClosingPrice,50, MarketDay) AS ZBCAverage
FROM MarketDailyClosing
WHERE Ticker = 'ZBC'
ORDER BY MarketDay;
この問合わせの結果は、たとえば以下のような表になります。
MarketDay
ClosingPrice
ZBCAverage
12/27/1999
89 1/16
85 1/2
12/28/1999
91 1/8
86 1/16
12/29/1999
92 3/4
86 1/2
12/30/1999
94 1/2
87
MDIFF
目的
現在の行の指定された値式と、それに先行するパーティション内の各行の width 行
との移動差分を返します。
タイプ
Teradata 固有の関数
構文
MDIFF
(
value_expression,
width,
,
sort_expression
(
ASC
DESC
構文要素
value_expression
移動平均を計算するための数値列またはリテラル。
この式に順序付き分析関数や集約関数を含めることはできません。
SQL 関数、演算子、式および述部
949
第 22 章 順序付き分析関数/ウィンドウ集約関数
MDIFF
width
計算で使用される前の行の数。
この値は、常に正の整数リテラルです。
最大値は 4096 です。
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
移動差異の意味
現在期間の特定の変数に関する活動と、過去を一定時間さかのぼった別の期間の同
じ変数に関する活動を比較した結果は、ビジネスで普通に使われる判断基準です。
たとえば、現在の売上げ総額を前の四半期の売上げ総額と比較してみることがある
でしょう。これが移動差異の計算です。この場合は、value_expression が四半期の
売上げ総額、width が 4、sort_expression が SYS_CALENDAR.Calendar システム
ビューの quarter_of_calendar 列になるでしょう。
MDIFF に代わる SUM の使用
MDIFF は使用しないようにしてください。これは ANSI SQL:2011 規格の Teradata
拡張機能であり、既存のアプリケーションとの下位互換性のためにのみ保持されて
います。MDIFF(x, w, y)は、次と等価です。
x - SUM(x) OVER (ORDER BY y
ROWS BETWEEN w PRECEDING AND w PRECEDING)
結果のタイプと属性
MDIFF のデータ タイプ、書式、およびタイトルは、次のとおりです。
950
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MDIFF
• オペランド x が文字である場合、データ タイプは x と同じであり、書式は FLOAT
のデフォルトの書式になります。
• オペランド x が数値である場合、データ タイプは x と同じであり、書式は x と
同じ書式になります。
• オペランドが日付である場合、データ タイプは INTEGER であり、書式は INTEGER
のデフォルトの書式になります。
データが欠けている場合の問題
MDIFF を使って分析する行に、欠けているデータ ポイントがないことを確認してく
ださい。欠けているデータ ポイントがあるデータに関して移動差異を計算すると、
予期しない不正確な結果が生成されます。なぜなら、n 個の論理データ ポイントで
はなく、n 個の物理データ行が計算の対象になるからです。
前に行がないときの移動差異の計算
移動差異の計算に使用する、前にある行の数が、指定した width より少ない場合、
結果は NULL になります。
例
例
製品コード 10 について、各四半期ごとに、昨年の同じ四半期との売上げの差異を
表示してみましょう。
SELECT year_of_calendar, quarter_of_calendar,
MDIFF(sumPrice, 4, year_of_calendar, quarter_of_calendar)
FROM (SELECT a2.year_of_calendar,
a2.quarter_of_calendar, SUM(a2.Price) AS sumPrice
FROM Sales a1, SYS_CALENDAR.Calendar a2
WHERE a1.itemID=10 and a1.calendar_date=a2.calendar_date
GROUP BY a2.year_of_calendar, a2.quarter_of_calendar) AS T1
ORDER BY year_of_calendar, quarter_of_year;
例
以下の例では、Horatio Parker Imports 社の株について、週ごとの取引高の差異を
計算します。同社の略号は HPI です。
SELECT MarketWeek, WeekVolume,
MDIFF(WeekVolume,1,MarketWeek) AS HPIVolumeDiff
FROM
(SELECT MarketWeek, SUM(Volume) AS WeekVolume
FROM MarketDailyClosing
WHERE Ticker = 'HPI'
SQL 関数、演算子、式および述部
951
第 22 章 順序付き分析関数/ウィンドウ集約関数
MEDIAN
GROUP BY MarketWeek)
ORDER BY MarketWeek;
結果は、たとえば以下のような表になります。HPIVolume Diff (HPI 取引高出差異)
列の最初の行が null になっていることに注意する必要があります。これは、差異を
計算するための先行の行がないからです。
MarketWeek
WeekVolume
HPIVolumeDiff
11/29/1999
9817671
?
12/06/1999
9945671
128000
12/13/1999
10099459
153788
12/20/1999
10490732
391273
12/27/1999
11045331
554599
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• SUM ウィンドウ関数の詳細については、「ウィンドウ集約関数」を参照してくだ
さい。
MEDIAN
目的
数値または日時値を取り、中央値、または値の並べ替え後に中央値となる補間値を
返します。計算では NULL は無視されます。
タイプ
MEDIAN は集約関数です。
構文
MEDIAN
(value_expression)
構文要素
value_expression
必ず数値または DateTime データ型となる単一の式。
952
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MLINREG
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果
この関数は、引数のデータ タイプと同じデータ タイプを返します。
例
MEDIAN は連続分布モデルとなる逆分布関数であり、パーセンタイル値が 0.5 の
PERCENTILE_CONT に固有の事例です。
MEDIAN (value_expression
)
次と同じです。
PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY value_expression
)
関連トピック
詳細は、以下を参照してください。
• 「PERCENTILE_CONT/PERCENTILE_DISC」を参照してください。
MLINREG
目的
先行する width -1 (sort_expression に基づく)個の列値の移動線形回帰の最小二乗に
基づいて、式の予測値を戻します。
タイプ
Teradata 固有の関数
構文
MLINREG
(
value_expression,
width,
sort_expression
(
ASC
DESC
SQL 関数、演算子、式および述部
953
第 22 章 順序付き分析関数/ウィンドウ集約関数
MLINREG
構文要素
value_expression
この式に順序付き分析関数や集約関数を含めることはできません。
width
計算で使用される前の行の数。
この値は、常に正の整数リテラルです。
最大値は 4096 です。
sort_expression
線形回帰を計算する IN 従属変数を定義する列式。
例えば、MLINREG(Sales, 6, Fiscal_Year_Month ASC)のように指定します。Sales は
value_expression であり、6 は width であり、Fiscal_Year_Month ASC は
sort_expression です。
この列参照のデータ タイプは数値または Teradata Database が正しく暗黙的に数値
に変換できるデータ タイプでなければなりません。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
MLINREG に代わる ANSI 準拠のウィンドウ関数の使用
MLINREG の代わりに ANSI 準拠のウィンドウ関数を使用することを強くお勧めしま
す。MLINREG は ANSI SQL:2011 規格の Teradata 拡張機能であり、既存のアプリ
ケーションとの下位互換性のためにのみ残されています。
結果のタイプと属性
MLINREG のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: オペランド x と同じ
• オペランド x が文字である場合、書式は FLOAT のデフォルトの書式である。
• オペランド x が数値、日付、または間隔である場合、書式は x と同じ書式である。
954
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MLINREG
デフォルトの独立変数
MLINREG は、sort_expression に独立変数を記述することを前提としています。
先行する行の数が width -1 より小さい場合の MLINREG の計算
先行する行の数が width -1 個よりも少ない場合、MLINREG は、先行するすべての
行を使って回帰を計算します。
MLINREG のレポート構造
結果テーブルの最初の 2 つの行(常に null)以外のすべての行には、予測値が表示さ
れます。
例
sales_table の itemID、smonth、および sales 列について考えてみます。
SELECT itemID, smonth, sales
FROM fiscal_year_sales_table
ORDER BY itemID, smonth;
itemID smonth
sales
------ -------- ----A
1
100
A
2
110
A
3
120
A
4
130
A
5
140
A
6
150
A
7
170
A
8
190
A
9
210
A
10
230
A
11
250
A
12 ?
B
1
20
B
2
30
...
sales 列に NULL があるのは、この例では 12 月(month 12)が将来の日付であって、
値が不明であるためです。
次の文では MLINREG を使用し、過去 6 ヶ月の売上げデータを使って、各製品ごと
の各月の傾向に基づき、予想売上げを表示してみましょう。
SQL 関数、演算子、式および述部
955
第 22 章 順序付き分析関数/ウィンドウ集約関数
MSUM
SELECT itemID, smonth, sales, MLINREG(sales,7,smonth)
FROM fiscal_year_sales_table;
GROUP BY itemID;
itemID smonth
sales MLinReg(sales,7,smonth)
------ -------- ----- ----------------------A
1
100 ?
A
2
110 ?
A
3
120
120
A
4
130
130
A
5
140
140
A
6
150
150
A
7
170
160
A
8
190
177
A
9
210
198
A
10
230
222
A
11
250
247
A
12 ?
270
B
1
20 ?
B
2
30 ?
...
関連トピック
データ タイプのデフォルトの書式、および書式における書式設定文字についての説
明は、< SQL データ型とリテラル、B035-1143>の「データ タイプの書式および書
式句」を参照してください。
MSUM
目的
現在行とそれに先行する n-1 個の行の値式によって指定される移動合計を計算しま
す。この関数は、MAVG 関数とよく似ています。
タイプ
Teradata 固有の関数
構文
MSUM
(
value_expression,
width,
,
sort_expression
(
ASC
DESC
956
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
MSUM
構文要素
value_expression
この式に順序付き分析関数や集約関数を含めることはできません。
width
計算で使用される前の行の数。
この値は、常に正の整数リテラルです。
最大値は 4096 です。
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
MSUM に代わる SUM の使用
MSUM は使用しないようにしてください。これは ANSI SQL:2011 規格の Teradata
拡張機能であり、ANSI 準拠の SUM ウィンドウ関数に相当するものです。MSUM
は、既存のアプリケーションとの下位互換性のためにのみ残されています。
結果のタイプと属性
MSUM のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ: オペランド x と同じ
• オペランド x が文字である場合、書式は FLOAT のデフォルトの書式である。
• オペランド x が数値である場合、書式は x と同じ書式である。
データが欠けている場合の問題
MSUM を使って分析するデータに、欠けているデータ ポイントがないことを確認
してください。欠けているデータ ポイントがあるデータに関して移動平均を計算す
SQL 関数、演算子、式および述部
957
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENT_RANK
ると、予期しない不正確な結果が生成されます。なぜなら、n 個の論理データ ポイ
ントではなく、n 個の物理データ行が計算の対象になるからです。
行数が width より少ない場合の MSUM の計算
行の数が width 個よりも少ないデータの場合、MSUM は、先行するすべての行を
使って合計を計算します。MSUM は、サンプル内の行の数が width よりも少ない場
合、null ではなく現在の合計を返します。
SELECT Sum の結果オーバーフローが発生する可能性
この関数を使用する場合に、データ タイプおよび書式が一致していないと、オーバー
フローが発生することがあります。列を次のように定義したとします。
Salary Decimal(15,2) Format ‘$ZZZ,ZZ9.99’
以下の問合わせを実行します。
SELECT SUM (Salary) FROM Employee;
小数オペランドおよび書式が一致していないため、オーバーフローが発生します。
オーバーフローが発生する可能性を回避するには、結果のデータ タイプでの、その
小数の合計が収まる十分な大きさで、小数の合計の書式を明示的に指定します。
SELECT Sum(Salary) (format ‘$Z,ZZZ,ZZZ,ZZ9.99) FROM Employee;
PERCENT_RANK
目的
value_expression の行の相対的な順位を戻します。
タイプ
ANSI SQL:2011 ウィンドウ関数。
構文
PERCENT_RANK()
OVER
A
(
,
PARTITION BY
column_reference
,
A
ORDER BY
)
value_expression
ASC
DESC
958
NULLS FIRST
NULLS LAST
RESET WHEN condition
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENT_RANK
構文要素
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法を指定します。
値は、PARTITION BY 句 BEGIN および RESET WHEN 句 END に基づいてグループ化
され、ORDER BY 句に基づいて整列され、パーティション内の集約グループに基づ
いて処理の対象とされます。
PARTITION BY
関数が操作対象とするグループ。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送ら
れる結果セット全体がパーティションになります。
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
ORDER BY
グループまたはパーティション内の値の整列順序。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
関数の実行対象になる 1 つまたは複数のグループ。指定された条件の評価に応じて
変化します。条件が TRUE と評価されると、指定されたウィンドウ パーティション
内に新しい動的パーティションが作成されます。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送ら
れる結果セット全体がパーティションになります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
SQL 関数、演算子、式および述部
959
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENT_RANK
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、そのウィ
ンドウ パーティション内にサブ パーティションを作成します。
詳細については、<SQL データ操作言語>の「RESET WHEN 条件のルール」および
「QUALIFY 句」を参照してください。
ANSI への準拠
これは、ANSI SQL:2011 に準拠しています。
RESET WHEN 句は、ANSI SQL 規格に対する Teradata 拡張機能です。
計算
割り当てられた行の順位とは、その行に先行し、その行と同等ではない行の数に 1
を加えたものと定義されます。
PERCENT_RANK は、0.0 から 1.0 までの数値の割合の概算の形で表現されます。
PERCENT_RANK の値
結果行に割り当てられる順位
0.0
1.
1.0
結果内の最大値。
結果のタイプと属性
PERCENT_RANK() OVER (PARTITION BY x ORDER BY y direction)のデータ型、書
式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
REAL
DECIMAL(7,6)のデフォルトの書式
Percent_Rank(y direction)
例
例
percent_rank という、クリスマス セールの相対的な順位を調べます。
以下の問合わせを実行します。
SELECT sales_amt,
PERCENT_RANK() OVER (ORDER BY sales_amt)
FROM xsales;
上記の問合わせは、たとえば以下のような結果を戻します。相対的な順位が昇順(並
替え順序が指定されない場合のデフォルト)で戻されることと、通貨記号が明示的に
報告されないことに注意する必要があります。
960
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENT_RANK
sales_amt
Percent_Rank
100.00
0.000000
120.00
0.125000
130.00
0.250000
140.00
0.375000
143.00
0.500000
147.00
0.625000
150.00
0.750000
155.00
0.875000
160.00
1.000000
例
クリスマス セールの順位と相対的な順位を調べます。
SELECT sales_amt,
RANK() OVER (ORDER BY sales_amt),
PERCENT_RANK () OVER (ORDER BY sales_amt)
FROM xsales;
sales_amt
Rank
Percent_Rank
100.00
1
0.000000
120.00
2
0.125000
130.00
3
0.250000
140.00
4
0.375000
143.00
5
0.500000
147.00
6
0.625000
150.00
7
0.750000
155.00
8
0.875000
160.00
9
1.000000
例
次の SQL 文は、PERCENT_RANK と累積分布との違いを示しています。
SELECT sales_amt,
PERCENT_RANK() OVER (ORDER BY sales_amt),
SQL 関数、演算子、式および述部
961
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENTILE_CONT/PERCENTILE_DISC
CUME_DIST() OVER (ORDER BY sales_amt)
FROM xsales;
sales_amt
PERCENT_Rank
CUME_DIST
100.
.000000
0.125000
120.
.142857
0.250000
130
.285714
.375000
140.
.428571
.500000
147.
.571429
.625000
150.
.714286
.750000
155.
.857143
.875000
160.
1.000000
1.000000
PERCENTILE_CONT/PERCENTILE_DISC
目的
整列指定を基準にして value_expression 内に収まる補間値を返します。
タイプ
PERCENTILE_CONT および PERCENTILE_DISC は集約関数です。
構文
PERCENTILE_CONT
( value_expression_1 )
A
WITHIN GROUP
PERCENTILE_DISC
,
A
(
ORDER BY
)
value_expression_2
ASC
DESC
NULLS FIRST
NULLS LAST
構文要素
value_expression_1
0 から 1 までの数値。
WITHIN GROUP
グループまたはパーティション内の値の整列順序。
962
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
PERCENTILE_CONT/PERCENTILE_DISC
ORDER BY
グループまたはパーティション内の値の整列順序。
value_expression_2
必ず数値または日時値となる単一の式。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
結果
この関数は、引数のデータ タイプと同じデータ タイプを返します。
計算では NULL は無視されます。
使用上の注意
どちらの関数も、連続分布となる逆分布関数です。
• PERCENTILE_CONT は、線形補間の実施後に計算結果を返します。
• PERCENTILE_DISC は、単に値セットから値を返します。
例
次の表を使用します。
Area
Address
Price
Downtown
72 Easy Street
509000
Downtown
29 Right Way
402000
SQL 関数、演算子、式および述部
963
第 22 章 順序付き分析関数/ウィンドウ集約関数
QUANTILE
Area
Address
Price
Downtown
45 Diamond Lane
203000
Downtown
76 Blind Alley
201000
Downtown
15 Tern Pike
199000
Downtown
444 Kanga Road
102000
Uptown
15 Peak Street
456000
Uptown
27 Primrose Path
349000
Uptown
44 Shady Lane
341000
Uptown
34 Design Road
244000
Uptown
2331 Highway 64
244000
Uptown
77 Sunset Strip
102000
次の SQL 文は、その直後のテーブルに指定されたとおりに、線形補間の実施後に計
算結果を返します。
SELECT area,
AVG(price),
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY price),
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price)
FROM market
GROUP BY area;
Area
Average Price
PERC_DISC
PERC_CONT
Downtown
269333
201000
202000
Uptown
289333
244000
292500
QUANTILE
目的
グループ内の値の分位スコアを計算します。
タイプ
Teradata 固有の関数
964
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
QUANTILE
構文
QUANTILE
(
quantile_literal,
,
sort_expression
(
ASC
DESC
構文要素
quantile_literal
対象となる分位パーティションの数を定義するために使用する正の整数リテラル 。
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
定義
分位とは、ユーザー定義の幅を持った汎用間隔です。たとえば、100 分位の場合は
100 等分した間隔、10 分位の場合は 10 等分した間隔、4 分位の場合は 4 等分した
間隔といった具合に、一定の間隔でデータを分割します。分位スコアは、
sort_expression 値が現在値よりも小さい行の割合を示します。例えば、100 分位の
スコアが 98 の場合、リスト内の行のうち 98%の sort_expression 値が現在値より小
さいということです。
QUANTILE に代わる ANSI ウィンドウ関数の使用
QUANTILE は使用しないようにしてください。これは ANSI SQL:2011 規格の
Teradata 拡張機能であり、既存のアプリケーションとの下位互換性のためにのみ保
持されています。
ANSI ウィンドウ関数を使用して QUANTILE(q, s)を計算するには、次を使用します。
(RANK() OVER (ORDER BY s) - 1) * q / COUNT(*) OVER()
SQL 関数、演算子、式および述部
965
第 22 章 順序付き分析関数/ウィンドウ集約関数
QUANTILE
QUANTILE レポート
QUANTILE は、グループ内のすべての行の sort_expression 値に対する、グループ内
の各行の sort_expression 値の分位を表わす整数値を返します。
分位値の範囲
分位値は、0~(Q-1)の範囲になります。Q は quantile_literal で指定する分位区分の
数です。
結果のタイプと属性
QUANTILE(Q, list)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER データ タイプのデフォルトの書式
Quantile(Q, list)
例
例
売上げ総額に基づいて、10 分位の上から 9 番目に入る各品目とそれぞれの売上げ総
額を表示してみましょう。
SELECT itemID, sumPrice
FROM (SELECT a1.itemID, SUM(price)
FROM Sales a1
GROUP BY a1.itemID) AS T1(itemID, sumPrice)
QUALIFY QUANTILE(10,sumPrice)=9;
例
以下の例では、利益率に基づいて、すべての品目を 10 分位にグループ化します。
SELECT Item, Profit, QUANTILE(10, Profit) AS Decile
FROM
(SELECT Item, Sum(Sales) — (Count(Sales) * ItemCost) AS Profit
FROM DailySales, Items
WHERE DailySales.Item = Items.Item
GROUP BY Item) AS Item;
結果は、たとえば以下のような表になります。
966
Item
Profit
Decile
High Tops
97112
9
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
QUANTILE
Item
Profit
Decile
Low Tops
74699
7
Running
69712
6
Casual
28912
3
Xtrain
100129
9
例
QUANTILE は指定されたデータをパーティション化するために等幅ヒストグラムを
使用するため、QUANTILE が等高ヒストグラムを使用してデータを等しくパーティ
ション化することはありません。言い換えれば、指定された分位ごとに行カウント
が等しくなるとは期待できないということです。例えば、データの中に重複する
sort_expression の値がある場合、空の分位ヒストグラムの生じることが期待されま
す。
たとえば、次の単純な SELECT 文を考えてみましょう。
SELECT itemNo, quantity, QUANTILE(10,quantity) FROM inventory;
報告は、たとえば以下のようなものになります。
itemNo
quantity
Quantile(10, quantity)
13
1
0
9
1
0
7
1
0
2
1
0
5
1
0
3
1
0
1
1
0
6
1
0
4
1
0
10
1
0
8
1
0
11
1
0
12
9
9
分位の整列は quantity に基づいて行なわれ、inventory テーブルには 2 つしか
quantity のスコアがないため、10 分位の 1 から 8 までの報告にはスコアがありま
せん。
SQL 関数、演算子、式および述部
967
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (ANSI)
関連トピック
データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
RANK (ANSI)
目的
ORDER BY 句に含まれる value_expression に基づいて、行の順序付き順位を戻しま
す。
タイプ
ANSI SQL:2011 ウィンドウ関数。
構文
RANK()
(
OVER
A
,
PARTITION BY
column_reference
,
A
ORDER BY
B
value_expression
ASC
DESC
NULLS FIRST
NULLS LAST
RESET WHEN condition
)
B
WITH
TIES
LOW
HIGH
AVG
DENSE
構文要素
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法を指定します。
値は、PARTITION BY 句 BEGIN および RESET WHEN 句 END に基づいてグループ化
され、ORDER BY 句に基づいて整列され、パーティション内の集約グループに基づ
いて処理の対象とされます。
PARTITION BY
関数が操作対象とするグループ。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送られ
る結果セット全体がパーティションになります。
968
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (ANSI)
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
ORDER BY
グループまたはパーティション内の値の整列順序。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
関数の実行対象になる 1 つまたは複数のグループ。指定された条件の評価に応じて
変化します。条件が TRUE と評価されると、指定されたウィンドウ パーティション
内に新しい動的パーティションが作成されます。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送ら
れる結果セット全体がパーティションになります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、その
ウィンドウ パーティション内にサブ パーティションを作成します。
詳細については、<SQL データ操作言語>の「RESET WHEN 条件のルール」および
「QUALIFY 句」を参照してください。
TIES LOW
すべての同順位が最も低い順位になるように指定します。
整数データ タイプを返します。
TIES HIGH
すべての同順位が最も高い順位になるように指定します。
整数データ タイプを返します。
SQL 関数、演算子、式および述部
969
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (ANSI)
TIES AVG
すべての同順位が平均の順位になるように指定します。
10 進データ型を返します。
TIES DENSE
すべての同順位が DENSE_RANK の順位付けに従って並べられるように指定します。
整数データ タイプを返します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
順位の意味
RANK は、ORDER BY 句に含まれる value_expression に基づいて、行の順序付き順
位を戻します。value_expression 値が同じ行にはすべて、同じ順位が割り当てられ
ます。
n 個の行が同じ value_expression 値になっているとすれば、それらの行には同じ順
位(例えば r)が割り当てられます。さらに、次の明確な値に順位 r +n が与えられま
す。以下同様に続いていきます。
正式な機能ではありませんが、RANK は、結果セットを並べ替え、結果内の各行の
数値順位を識別することもします。RANK は結果の中に各行の順位を表わす整数を
戻します。
結果のタイプと属性
RANK() OVER (PARTITION BY x ORDER BY y direction)のデータ型、書式、およびタ
イトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER データ タイプのデフォルトの書式
Rank(y direction)
例
例
次の例は、販売地域ごとに売上げに基づいて販売担当者を順位付けします。
SELECT sales_person, sales_region, sales_amount,
RANK() OVER (PARTITION BY sales_region ORDER BY sales_amount DESC)
FROM sales_table;
970
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (ANSI)
sales_person
sales_region
sales_amount
Rank(sales_amount)
Garabaldi
East
100
1
Baker
East
99
2
Fine
East
89
3
Adams
East
75
4
Edwards
West
100
1
Connors
West
99
2
Davis
West
99
2
上記の表の rank 列では、PARTITION BY 句で指定した列(sales_region)ごとに、販
売担当者が売上げ高の降順でリストアップされており、sales_region が変わると、
売上げの順位(sales_amount)がリセットされます。
例
次の SQL 文は、RANK(ANSI)と DENSE_RANK(ANSI)との違いを示しており、
sales_region および sales_amount 別に sales_person の RANK および DENSE_RANK
を返します。
SELECT sales_person, sales_region, sales_amount,
RANK() OVER
(PARTITION BY sales_region ORDER BY sales_amount DESC) as "Rank",
DENSE_RANK() OVER
(PARTITION BY sales_region ORDER BY sales_amount DESC) as "DenseRank"
FROM sales_table;
sales_person
sales_region
sales_amount
Rank
DenseRank
Garabaldi
East
100
1
1
Baker
East
100
1
1
Fine
East
89
3
2
Adams
East
75
4
3
Edwards
West
100
1
1
Connors
West
99
2
2
Davis
West
99
2
2
Russell
West
50
4
3
関連トピック
詳細は、以下を参照してください。
SQL 関数、演算子、式および述部
971
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (Teradata)
• 詳細については、< SQL データ操作言語、B035-1146>の「RESET WHEN 条件の
ルール」と「QUALIFY 句」を参照してください。
• 書式における書式設定文字についての説明は、 < SQL データ型とリテラル、
B035-1143>の「データ タイプの書式および書式句」を参照してください。
RANK (Teradata)
目的
sort_expression リストの値ごとに、グループ内のすべての行の順位(1 … n)を戻しま
す。sort_expression の値が同じ行は同じ順位になります。
タイプ
Teradata 固有の関数
構文
RANK
(
,
sort_expression
(
ASC
DESC
構文要素
sort_expression
値の並べ替えに使用するリテラルまたは列式、あるいはリテラルまたは列式のカン
マ区切りリスト。
この式に順序付き分析関数や集約関数を含めることはできません。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
972
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (Teradata)
Teradata RANK に代わる ANSI RANK の使用
Teradata RANK は使用しないようにしてください。これは ANSI SQL:2011 規格の
Teradata 拡張機能であり、ANSI 準拠の RANK ウィンドウ関数に相当するものです。
Teradata RANK は、既存のアプリケーションとの下位互換性のためにのみ残されて
います。
順位の意味
順位 r は、sort_expression 値の後にちょうど r-1 個の行があることを示します。
sort_expression 値が同じ行にはすべて、同じ順位が割り当てられます。
例えば、n 個の行が同じ sort_expression 値になっているとすれば、それらの行には
同じ順位(例えば r)が割り当てられます。さらに、次の明確な値に順位 r +n が与え
られます。
正式な機能ではありませんが、RANK は、結果セットを並べ替え、結果内の各行の
数値順位を識別することもします。RANK の唯一の引数は、並替え列(複数も可)で
す。この関数は、結果内の各行の順位を表わす整数を戻します。
上位値と下位値の計算
RANK を使って、以下の例のように、上位値と下位値を計算することもできます。
Top(n, column)は、QUALIFY RANK(column DESC) <=n.として計算されます。
Bottom(n, column)は、QUALIFY RANK(column ASC) <=n として計算されます。
結果のタイプと属性
RANK(x)のデータ タイプ、書式、およびタイトルは、次のとおりです。
データ タイプ
書式
タイトル
INTEGER
INTEGER データ タイプのデフォルトの書式
Rank(x)
例
例
売上げトップ 100 の品目について、各品目、それぞれの売上げ総額、それぞれの売
上げ順位を表示してみましょう。
SELECT itemID, sumPrice, RANK(sumPrice)
FROM
(SELECT a1.itemID, SUM(a1.Price)
FROM Sales a1
SQL 関数、演算子、式および述部
973
第 22 章 順序付き分析関数/ウィンドウ集約関数
RANK (Teradata)
GROUP BY a1.itemID AS T1(itemID, sumPrice)
QUALIFY RANK(sumPrice) <=100;
例
社員をアルファベット順に並べ替え、社内における先任権レベルを識別してみましょ
う。
SELECT EmployeeName, (HireDate - CURRENT_DATE) AS ServiceDays,
RANK(ServiceDays) AS Seniority
FROM Employee
ORDER BY EmployeeName;
結果は、たとえば以下のような表になります。
EmployeeName
Service Days
Seniority
Ferneyhough
9931
2
Lucier
9409
4
Revueltas
9408
5
Ung
9931
2
Wagner
10248
1
例
カテゴリ別に品目を並べ替え、売上げ順位の降順で報告してみましょう。
SELECT Category, Item, Revenue, RANK(Revenue) AS ItemRank
FROM ItemCategory,
(SELECT Item, SUM(sales) AS Revenue
FROM DailySales
GROUP BY Item) AS ItemSales
WHERE ItemCategory.Item = ItemSales.Item
ORDER BY Category, ItemRank DESC;
結果は、たとえば以下のような表になります。
974
Category
Item
Revenue
ItemRank
Hot Cereal
Regular Oatmeal
39112.00
4
Hot Cereal
Instant Oatmeal
44918.00
3
Hot Cereal
Regular COW
59813.00
2
Hot Cereal
Instant COW
75411.00
1
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ROW_NUMBER
関連トピック
詳細は、以下を参照してください。
• データ タイプのデフォルトの書式の詳細については、< SQL データ型とリテラ
ル、B035-1143>の「データ タイプの書式および書式句」を参照してください。
• RANK ウィンドウ関数の詳細については、「RANK (ANSI)」を参照してください。
ROW_NUMBER
目的
ウィンドウのウィンドウ順序に基づく、そのウィンドウ パーティション内での行の
順次行番号を戻します(最初の行が番号 1 です)。
タイプ
ANSI SQL:2011 ウィンドウ関数。
構文
ROW_NUMBER()
OVER
A
(
,
PARTITION BY
column_reference
,
A
ORDER BY
)
value_expression
ASC
DESC
NULLS FIRST
NULLS LAST
RESET WHEN condition
構文要素
OVER
累計、グループ、または移動関数を計算する際に、値をグループ化、順序付け、お
よび処理対象とする方法を指定します。
値は、PARTITION BY 句 BEGIN および RESET WHEN 句 END に基づいてグループ化
され、ORDER BY 句に基づいて整列され、パーティション内の集約グループに基づ
いて処理の対象とされます。
PARTITION BY
関数が操作対象とするグループ。
関数が操作対象とするグループ。
PARTITION BY 句は、ウィンドウ パーティション句と呼ばれることもあります。
SQL 関数、演算子、式および述部
975
第 22 章 順序付き分析関数/ウィンドウ集約関数
ROW_NUMBER
ORDER BY
グループまたはパーティション内の値の整列順序。
ASC
昇順の整列順序。
デフォルトは ASC です。
DESC
降順の整列順序。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
RESET WHEN
関数の実行対象になる 1 つまたは複数のグループ。指定された条件の評価に応じて
変化します。条件が TRUE と評価されると、指定されたウィンドウ パーティション
内に新しい動的パーティションが作成されます。
PARTITION BY 句または RESET WHEN 句を指定しない場合は、FROM 句から送られ
る結果セット全体がパーティションになります。
condition
条件によるパーティション化を決めるために使用する条件式。RESET WHEN 句の条
件は、QUALIFY 句の条件と適用範囲は同じですが、ネストされた順序付き分析関数
は RESET WHEN 句を指定できないという追加の制約があります。また、条件内の
subquery としての SELECT は指定できません。
条件は、指定されたすべてのウィンドウ パーティション内の行に適用され、そのウィ
ンドウ パーティション内にサブ パーティションを作成します。
詳細については、<SQL データ操作言語>の「RESET WHEN 条件のルール」および
「QUALIFY 句」を参照してください。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
ウィンドウ集約の等価性
ROW_NUMBER() OVER (PARTITION BY 列
ORDER BY value
)
976
SQL 関数、演算子、式および述部
第 22 章 順序付き分析関数/ウィンドウ集約関数
ROW_NUMBER
は、次と等価です。
COUNT(*) OVER (PARTITION BY 列
ORDER BY value
ROWS UNBOUNDED PRECEDING).
例
販売地域内の売上げに基づいて販売担当者を順序付けするために次の SQL 問合わせ
を使用すると、その次に示すような結果が得られます。
SELECT ROW_NUMBER() OVER (PARTITION BY sales_region
ORDER BY sales_amount DESC),
sales_person, sales_region, sales_amount
FROM sales_table;
Row_Number()
-----------1
2
3
4
1
2
3
sales_person
-----------Baker
Edwards
Davis
Adams
Garabaldi
Connors
Fine
sales_region
-----------East
East
East
East
West
West
West
sales_amount
-----------100
99
89
75
100
99
99
関連トピック
詳細は、以下を参照してください。
• 詳細については、< SQL データ操作言語、B035-1146>の「RESET WHEN 条件の
ルール」と「QUALIFY 句」を参照してください。
• COUNT の詳細については、「ウィンドウ集約関数」を参照してください。
SQL 関数、演算子、式および述部
977
第 22 章 順序付き分析関数/ウィンドウ集約関数
ROW_NUMBER
978
SQL 関数、演算子、式および述部
第 23 章
期間関数および演算子
概要
この章では、期間関数および演算子について説明します。
これらの関数および演算子には、真の Period データ タイプと派生 PERIOD 列の両
方をサポートしているものがいくつかあります。 Period データ タイプと派生 PERIOD
列は、派生 PERIOD によって表わされる期間の開始境界値と終了境界値を格納する
2 つの個別の DateTime 列から構成されています。
Period 値コンストラクタ
目的
Period データ タイプのインスタンスを初期設定します。
構文
PERIOD (datetime_expression)
PERIOD (datetime_expression, datetime_expression)
PERIOD (datetime_expression, UNTIL_CHANGED)
PERIOD (datetime_expression, UNTIL_CLOSED)
構文要素
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
UNTIL_CHANGED
変更されなければ永久とみなされる DATE 値または TIMESTAMP 値。
PERIOD(DATE)タイプの場合、UNTIL_CHANGED は DATE '9999-12-31'の値になり
ます。
PERIOD(TIMESTAMP[(n)] [WITH TIME ZONE])タイプの場合、UNTIL_CHANGED は
TIMESTAMP '9999-12-31 23:59:59.999999 00:00'の値になります(精度は開始境界
SQL 関数、演算子、式および述部
979
第 23 章 期間関数および演算子
Period 値コンストラクタ
の精度にまで切り詰められ、開始境界にタイムゾーンがない場合はタイムゾーンが
省略されます)。
UNTIL_CHANGED は、派生 PERIOD をサポートします。IS UNTIL_CHANGED/IS NOT
UNTIL_CHANGED を参照してください。
UNTIL_CLOSED
行が開いている行であることを示すテンポラル テーブルの transaction-time 列の
PERIOD 値に対する終了境界。
UNTIL_CLOSED のデータ タイプは TIMESTAMP(6) WITH TIME ZONE で、値は
TIMESTAMP '9999-12-31 23:59:59.999999+00: 00' になります。
テンポラル テーブルについて、詳細は<一時テーブルのサポート 、B035-1182>を参
照してください。
UNTIL_CLOSED は、派生 PERIOD をサポートします。IS UNTIL_CLOSED/IS NOT
UNTIL_CLOSED を参照してください。
結果値
結果値には、次に示す規則が適用されます。
• 開始境界または終了境界が NULL の場合や、両方の境界が NULL の場合、結果は
NULL になります。
• 開始境界および終了境界が NULL の場合や、開始境界が NULL で終了境界が
UNTIL_CHANGED の場合、期間のタイプは PERIOD(TIMESTAMP(0))がデフォル
トになります。
• 開始境界のみを指定する場合、結果の終了境界は開始境界に結果の構成要素のタ
イプの 1 最小単位を加算したものになります。結果の終了境界が、PERIOD(DATE)
または PERIOD(TIMESTAMP(n) [WITH TIME ZONE])の結果のデータ タイプに許
容された、最大の DATE 値または TIMESTAMP 値以上になる場合は、エラーが報
告されます。
• 終了境界が値式として指定されていて、開始境界と終了境界の精度が異なる場
合、精度の高い方が結果の精度になります。それ以外の場合、結果の精度は開始
境界の精度になります。
• UNTIL_CHANGED により、結果の終了構成要素には、開始境界のデータ タイプ
に応じて DATE または TIMESTAMP の最大値が設定されます。開始境界のデー
タ タイプが TIMESTAMP(n) WITH TIME ZONE の場合、結果の終了構成要素は、
UTC での(つまり、終了境界のタイムゾーン変位が INTERVAL '00:00' HOUR TO
MINUTE になる)最大の TIMESTAMP(n) WITH TIME ZONE 値に設定されます。
• 開始境界または終了境界、または開始境界および終了境界にタイムゾーン値が含
まれる場合で、終了境界が UNTIL_CHANGED ではない場合、結果のデータ タイ
プは WITH TIME ZONE になります。境界のどちらかにのみタイムゾーン値が含
まれている場合、もう一方のタイムゾーンのフィールドには現在のセッションの
タイムゾーン変位が設定されます。どちらの境界にもタイムゾーン値が含まれて
いる場合は、それに対応するタイムゾーン値が結果の境界に含まれます。
980
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
Period 値コンストラクタ
• 結果の Period データ タイプは、前述の定義のように精度およびタイムゾーンを
除外した開始境界の日時データ タイプと同じ構成要素のタイプを持ちます。
• TIME および TIMESTAMP 構成要素のタイプを持つ Period データ タイプのうる
う秒は、次のように処理されます。開始境界または終了境界の値にうるう秒が含
まれている場合、秒部分が結果の精度にまで精度が切り詰められた 59.999999
に調整されます。この処理中に開始境界と終了境界が同じになると、エラーが報
告されます。
使用上の規則
Period 値コンストラクタには、次の規則が適用されます。
• 開始境界は日時データ タイプを持つ必要があり、終了境界が指定されている場
合は、開始境界および終了境界のデータ タイプを比較できるようにする必要が
あります。
• 開始境界のデータ タイプが DATE または TIMESTAMP の終了境界は、
UNTIL_CHANGED に設定できます。
• 終了境界が UNTIL_CLOSED に設定されている場合、以下が真になります。
• 開始境界値のデータ タイプは、TIMESTAMP(6) WITH TIME ZONE と比較可能
でなければなりません。
• コンストラクタは、結果が割り当てられるターゲット列が transaction-time 列
である場合の割り当て操作でのみ有効です。
• transaction-time 列の値を設定する方法が、非テンポラルの DML を使用する
こと以外にないため、コンストラクタは非テンポラルの DML 文でのみ有効で
す。
• 以下のいずれかが真の場合、Teradata Database はエラーを報告します。
• UNTIL_CHANGED が開始境界に指定されている。
• 結果の開始境界が、結果の終了境界以上か、等しくなる。
• 開始境界および終了境界のデータ タイプが比較可能ではない。
• 終了境界値に UNTIL_CHANGED が指定され、開始境界のデータ タイプが
TIME(n) [WITH TIME ZONE]。
• UNTIL_CLOSED が開始境界に指定されている。
例
次に示す例では、INTEGER 列 c1 および PERIOD(DATE)列 c2 を含むテーブル t1 と、
INTEGER 列 a および 2 つの DATE 列 b と c を含むテーブル t2 があると仮定します。
この例では、2 つの INSERT 文で使用される Period 値コンストラクタを示します。
INSERT INTO t1
VALUES (1, PERIOD(DATE '2005-02-03', DATE '2006-02-04'));
INSERT INTO t1 SELECT a, PERIOD(b, c) FROM t2;
SQL 関数、演算子、式および述部
981
第 23 章 期間関数および演算子
算術演算子
算術演算子
目的
Period 値に対して間隔値を加算または減算します。または、間隔値に Period 値を加
算します。
構文
period_expression
+
_
interval_expression
interval_expression
+
_
period_expression
構文要素
period_expression
変換される PERIOD 式。
PERIOD データ型と評価される任意の式。
interval_expression
INTERVAL データ型と評価される式。
INTERVAL データ タイプについて、詳細は< SQL データ型とリテラル、B035-1143>
を参照してください。
p は構成要素のタイプが DATE または TIMESTAMP の期間式で、v は間隔式だとしま
す。
• p + v および v + p は、どちらも次と等価になります。
PERIOD(BEGIN(p) + v, CASE WHEN END(p) IS UNTIL_CHANGED THEN END(p)
ELSE (END(p) + v) END)
• p - v は、次と等価になります。
PERIOD(BEGIN (p) - v, CASE WHEN END(p) IS UNTIL_CHANGED THEN END(p)
ELSE (END(p) - v) END)
p は構成要素のタイプが TIME の期間式で、v は間隔式だとします。
• p + v および v + p は、どちらも次と等価になります。
PERIOD(BEGIN(p) + v, END(p) + v)
• p - v は、次と等価になります。
PERIOD(BEGIN (p) - v, END(p) - v)
使用上の規則
算術演算子および Period データ タイプには、次に示すルールが適用されます。
982
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
期間タイプの比較
• 間隔式は、有効な間隔式であり、間隔式のルールに従っている必要があります
(「ANSI の間隔式」を参照)。そのようにしないと、エラーが報告されます。たと
えば、間隔式(DATE '2006-02-03' - DATE '2005-02-03') DAY は、結果として 365
日の値になり、間隔修飾子 DAY のデフォルト精度の 2 に収まらなくなるため、
エラーが報告されます。
• 期間に対する間隔の加算または減算や、間隔への期間の加算といった期間算術演
算は、日時式のルールに従います。そのようにしないと、エラーが報告されま
す。日時式のルールの詳細については、「ANSI の間隔式」を参照してください。
• 期間式から間隔式を減算することはできますが、その逆はできません。間隔式か
ら期間式を減算すると、エラーが報告されます。
• TIME の構成要素のタイプを含む期間式の場合、期間算術演算の結果として開始
境界が終了境界よりも小さくなると、エラーが報告されます。
• 構成要素のタイプが DATE または TIMESTAMP の期間では、終了境界が
UNTIL_CHANGED なら、結果として終了境界は UNTIL_CHANGED になります。
終了境界が UNTIL_CHANGED ではない場合に、結果として終了境界が
UNTIL_CHANGED 値と評価されるとエラーが報告されます。
• 期間算術演算では、オペランドの 1 つを INTERVAL データ タイプにする必要が
あります。そのようにしないと、エラーが報告されます。
期間タイプの比較
データ タイプ
主なフィールド
DATE
年、月、および日
TIME
時間、分、および秒
TIMESTAMP
YEAR、MONTH、DAY、HOUR、MINUTE、および
SECOND
2 つの Period 値の要素型が同じ DateTime データ型の場合は、これらの値を比較す
ることができます。日時データ タイプは、DATE、TIME、および TIMESTAMP など
です。
• PERIOD(DATE)データ タイプは、PERIOD(DATE)データ タイプと比較できます。
• PERIOD(TIME(n)[WITH TIME ZONE])データ タイプは、PERIOD(TIME(m)[WITH
TIME ZONE])データ タイプと比較できます。
• PERIOD(TIMESTAMP(n)[WITH TIME ZONE])データ タイプは、
PERIOD(TIMESTAMP(m)[WITH TIME ZONE])データ タイプと比較できます。
Teradata はこれを拡張して、CHARACTER 値と VARCHAR 値をいくつかの演算子に
対して PERIOD データ タイプとして暗黙にキャストできるようにし、これにより、
PERIOD データ タイプを持つことができるようにしています。PERIOD データ型は
他の期間式のデータ型なので、これらの期間式は比較対象になります。
SQL 関数、演算子、式および述部
983
第 23 章 期間関数および演算子
期間タイプの比較
日時および Period データは最大精度 6 で内部的に保存されますが、指定された精度
がこれより少ない場合はゼロが挿入されます。したがって、異なる精度の比較演算
子は、追加のロジックなしで機能します。
さらに、内部値は、時刻またはタイムスタンプ値については UTC に保存され、Period
値については、TIME または TIMESTAMP の構成要素のタイプで保存されます。この
内部表現により、すべての比較可能な期間式は直接比較することができます。タイ
ムゾーン値を含むかどうかや、これらの精度が同じかどうかは関係ありません。
注: 値を比較するときにはタイムゾーン値が無視されます。
システムのバージョン情報が設定された system-time 列またはテンポラル テーブル
の transaction-time 列の UNTIL_CLOSED に関与する、すべての比較演算子は、
UNTIL_CLOSED(TIMESTAMP '9999-12-3123:59:59:999999+00:00')の内部値を使
用して、結果を評価します。
比較演算子
次の表では、比較演算子について説明します。
演算子
目的
EQ または =
例えば、p1 および p2 は期間式で、比較可能な PERIOD データ型を持つと
します。
BEGIN(p1) = BEGIN(p2) AND END(p1) = END(p2)ならば、比較の結果は
TRUE になり、そうでなければ FALSE になります。
どちらかの期間式が NULL になる場合、結果は UNKNOWN となります。
期間式間の要素タイプが異なる場合は、いずれか一方が他方と同じになる
ような明示的な CAST が必要になります。
一方の期間式が Period データ タイプを持ち、他方の期間式が CHARACTER
または VARCHAR データ タイプを持つ場合、CHARACTER または
VARCHAR の式は、比較の前に、期間式のフォーマットに基づいて、期間
式のデータ タイプに暗黙的に変換されます。
EQ は、派生 PERIOD どうしの比較をサポートします。
LT または <
例えば、p1 および p2 は期間式で、比較可能な PERIOD データ型を持つと
します。
BEGIN(p1) < BEGIN(p2) OR (BEGIN(p1) = BEGIN(p2) AND END(p1) <
END(p2))ならば、比較の結果は TRUE になり、そうでなければ FALSE に
なります。
どちらかの期間式が NULL になる場合、結果は UNKNOWN となります。
期間式間の要素タイプが異なる場合は、いずれか一方が他方と同じになる
ような明示的な CAST が必要になります。
984
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
期間タイプの比較
演算子
目的
一方の期間式が Period データ タイプを持ち、他方の期間式が CHARACTER
または VARCHAR データ タイプを持つ場合、CHARACTER または
VARCHAR のオペランドは、比較の前に、期間式のフォーマットに基づい
て、期間式のデータ タイプに暗黙的に変換されます。
システムのバージョン情報が設定された system-time 列またはテンポラ
ル テーブルの transaction-time 列の終了境界値が UNTIL_CLOSED の場合、
終了境界値は TIMESTAMP 列値以下にしかなりません。あるいは、列値ま
たはリテラルがうるう秒で最大の TIMESTAMP 値になる場合も、終了境界
値は TIMESTAMP 定数以下にしかなりません。これは、システムのバー
ジョン情報が設定された system-time 列または transaction-time 列の終了
境界がタイムスタンプ値との比較に使用される場合にのみ可能です。テン
ポラル テーブルについて、詳細は<ANSI 一時テーブルのサポート 、
B035-1186>または<一時テーブルのサポート、B035-1182>を参照してく
ださい。
LT は、派生 PERIOD どうしの比較をサポートします。
GT または >
例えば、p1 および p2 は期間式で、比較可能な PERIOD データ型を持つと
します。
BEGIN(p1) > BEGIN(p2) OR (BEGIN(p1) = BEGIN(p2) AND END(p1) >
END(p2))ならば、比較の結果は TRUE になり、そうでなければ FALSE に
なります。
どちらかの期間式が NULL になる場合、結果は UNKNOWN となります。
一方の期間式が PERIOD データ型を持ち、他方の期間式が CHARACTER ま
たは VARCHAR データ型を持つ場合、CHARACTER または VARCHAR の期
間式は、比較の前に、期間式のフォーマットに基づいて、期間式のデータ
型に暗黙的に変換されます。
GT は、派生 PERIOD どうしの比較をサポートします。
NE または <> ま
たは
NOT = または^=
または
LE または <= ま
たは
GE または >=
SQL 関数、演算子、式および述部
これらの比較演算子は、比較可能な期間式間でサポートされます。
一方の期間式が Period データ タイプを持ち、他方の期間式が CHARACTER
または VARCHAR データ タイプを持つ場合、CHARACTER または
VARCHAR の期間式は、比較の前に、期間式のフォーマットに基づいて、
期間式のデータ タイプに暗黙的に変換されます。
NE、LE、および GE は、派生 PERIOD どうしの比較をサポートします。
985
第 23 章 期間関数および演算子
BEGIN
BEGIN
目的
期間式または派生 PERIOD の開始境界値を返します。
構文
BEGIN
( period_expression )
( derived_period )
構文要素
period_expression
変換される PERIOD 式。
derived_period
PERIOD データ型と評価される任意の式。
戻り値
BEGIN 関数の結果のデータ タイプは、期間式の構成要素のタイプと同じになるか、
または引数が派生 PERIOD 列である場合には開始列のデータ タイプと同じになりま
す。引数が NULL の場合、結果は NULL になります。
フォーマットおよびタイトル
書式は、期間式の構成要素のタイプのデフォルトの書式になるか、または引数が派
生 PERIOD 列である場合には開始列の書式になります。
エラー条件
引数に Period データ タイプがない場合は、エラーが報告されます。
例
例
BEGIN は、Period データ タイプの開始境界値を返します。
SELECT * FROM employee WHERE BEGIN(period1) = DATE '2004-06-19';
period1 が PERIOD(DATE)列の次の employee テーブルに対して、問合わせを実行し
たとします。
986
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
CONTAINS
ename
----Jones
Adams
Mary
Simon
dept
----------Sales
Marketing
Development
Sales
period1
---------------------------('2004-01-02', '2004-01-05')
('2004-06-19', '2005-02-09')
('2004-06-19', '2005-01-05')
('2004-06-22', '2005-01-07')
結果は以下のようになります。
ename
----Adams
Mary
dept
----------Marketing
Development
period1
---------------------------('2004-06-19', '2005-02-09')
('2004-06-19', '2005-01-05')
例
BEGIN は、次の SQL 文を使用して作成された jobduration という派生 PERIOD の開
始境界値(jdbegin)を返します。
CREATE TABLE employee(id INTEGER,
name VARCHAR(50),
jdbegin DATE NOT NULL FORMAT 'YYYY-MM-DD',
jdend
DATE NOT NULL FORMAT 'YYYY-MM-DD',
PERIOD FOR jobduration(jdbegin,jdend)
)PRIMARY INDEX(id);
次の SQL 文を実行します。
INSERT INTO employee(1025,'John',DATE'2011-01-02',DATE'2012-05-02');
SELECT BEGIN (jobduration) FROM employee;
次の結果が得られます。
jdbegin
__________
2011-01-02
CONTAINS
目的
2 つの期間式、派生 PERIOD、または日時式を TRUE、FALSE、または UNKNOWN
に評価します。
SQL 関数、演算子、式および述部
987
第 23 章 期間関数および演算子
CONTAINS
構文
period_expression
CONTAINS
period_expression
datetime_expression
derived_period
CONTAINS
period_expression
CONTAINS
derived_period
datetime_expression
NOT
datetime_expression
NOT
derived_period
NOT
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
derived_period
PERIOD データ型と評価される任意の式。
エラー条件
どちらかの式が期間または日時以外のデータ タイプと評価されると、エラーが報告
されます。
式に比較可能なデータ タイプがない場合、エラーが報告されます。
結果値
988
EID Name DeptNo
JobSt1
1
Tom
101
DATE'2 DATE'2004-0 DATE'2005-0 DATE'2006-01-01'
001-01- 1-01'
1-01'
01'
2
Rick
201
DATE'2 DATE'2006-0 DATE'2001-0 DATE'2004-01-01'
005-01- 1-01'
1-01'
01'
3
Joo
301
DATE'2 DATE'2006-0 DATE'2006-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
JobEnd1
JobSt2
JobEnd2
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
CONTAINS
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
4
Tam
401
DATE'2 DATE'2006-0 DATE'2002-0 DATE'2004-01-01'
001-01- 1-01'
1-01'
01'
5
Pat
501
DATE'2 DATE'2007-0 DATE'2006-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
6
Jack
601
DATE'2 DATE'2007-0 DATE'2007-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
7
Yu
701
DATE'2 DATE'2007-0 DATE'2004-0 DATE'2005-01-01'
005-01- 1-01'
1-01'
01'
8
Tim
801
DATE'2 DATE'2007-0 DATE'2005-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
例
例
period1 および period2 が PERIOD(DATE)列の employee テーブルに対して、次の問
合わせを実行したとします。
SELECT * FROM employee WHERE period2 CONTAINS period1;
ename
period1
period2
Adams
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
Mary
('2005-04-02',
'2006-01-03')
('2005-02-03',
'2006-02-03')
Jones
('2004-01-02',
'2004-03-05')
('2004-03-05',
'2004-10-07')
Randy
('2004-01-02',
'2004-03-05')
('2004-03-07',
'2004-10-07')
Simon
?
('2005-02-03',
'2005-07-27')
結果は以下のようになります。
SQL 関数、演算子、式および述部
989
第 23 章 期間関数および演算子
CONTAINS
ename
period1
period2
Adams
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
Mary
('2005-04-02',
'2006-01-03')
('2005-02-03',
'2006-02-03')
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
990
EID Name DeptNo
JobSt1
1
Tom
101
DATE'2 DATE'2004-0 DATE'2005-0 DATE'2006-01-01'
001-01- 1-01'
1-01'
01'
2
Rick
201
DATE'2 DATE'2006-0 DATE'2001-0 DATE'2004-01-01'
005-01- 1-01'
1-01'
01'
3
Joo
301
DATE'2 DATE'2006-0 DATE'2006-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
4
Tam
401
DATE'2 DATE'2006-0 DATE'2002-0 DATE'2004-01-01'
001-01- 1-01'
1-01'
01'
5
Pat
501
DATE'2 DATE'2007-0 DATE'2006-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
JobEnd1
JobSt2
JobEnd2
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
END
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
6
Jack
601
DATE'2 DATE'2007-0 DATE'2007-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
7
Yu
701
DATE'2 DATE'2007-0 DATE'2004-0 DATE'2005-01-01'
005-01- 1-01'
1-01'
01'
8
Tim
801
DATE'2 DATE'2007-0 DATE'2005-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
次の SQL 文では、CONTAINS を employee テーブルの派生 PERIOD 列で使用してい
ます。
SELECT eid, name, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 CONTAINS jobdur2;
結果は以下のようになります。
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
4
Tam
401
DATE'2001- DATE'200601-01'
01-01'
DATE'200201-01'
DATE'200401-01'
8
Tim
801
DATE'2005- DATE'200701-01'
01-01'
DATE'200501-01'
DATE'200701-01'
END
目的
期間引数の終了境界値を返します。
構文
END
( period_expression )
( derived_period )
SQL 関数、演算子、式および述部
991
第 23 章 期間関数および演算子
END
構文要素
period_expression
PERIOD データ型と評価される任意の式。
derived_period
PERIOD データ型と評価される任意の式。
戻り値
END 関数の結果のデータ タイプは、期間式の構成要素のタイプと同じになるか、ま
たは引数が派生 PERIOD 列である場合には終了列のデータ タイプと同じになりま
す。引数が NULL の場合、結果は NULL になります。
フォーマットおよびタイトル
書式は、期間式の構成要素のタイプのデフォルトの書式になるか、または引数が派
生 PERIOD 列である場合には終了列の書式になります。
エラー条件
Period データ タイプ以外のデータ タイプの引数が関数に渡されると、エラーが報告
されます。
例
例
次の問合わせを仮定します。
SELECT * FROM employee WHERE END(period1) = DATE '2005-01-07';
これを PERIOD(DATE)列が period1 である employee テーブルに対して実行します。
ename
----Jones
Adams
Mary
Simon
dept
----------Sales
Marketing
Development
Sales
period1
---------------------------('2004-01-02', '2004-01-05')
('2004-06-19', '2005-02-09')
('2004-06-19', '2005-01-05')
('2004-06-22', '2005-01-07')
結果は以下のようになります。
ename
----Simon
992
dept
----------Sales
period1
---------------------------('2004-06-22', '2005-01-07')
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
EQUALS
例
END は、次の SQL 文を使用して作成された jobduration という派生 PERIOD の終了
境界値(jdend)を返します。
CREATE TABLE employee(id INTEGER,
name VARCHAR(50),
jdbegin DATE NOT NULL FORMAT 'YYYY-MM-DD',
jdend
DATE NOT NULL FORMAT 'YYYY-MM-DD',
PERIOD FOR jobduration(jdbegin,jdend)
)PRIMARY INDEX(id);
次の SQL 文を実行します。
INSERT INTO employee(1025,'John',DATE'2011-01-02',DATE'2012-05-02');
SELECT END (jobduration) FROM employee;
次の結果が得られます。
jdend
__________
2011-05-02
EQUALS
目的
2 つの期間式または派生 PERIOD を TRUE、FALSE、または UNKNOWN に評価しま
す。
構文
period_expression
EQUALS
period_expression
derived_period
EQUALS
derived_period
period_expression
NOT
derived_period
NOT
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
SQL 関数、演算子、式および述部
993
第 23 章 期間関数および演算子
EQUALS
derived_period
PERIOD データ型と評価される任意の式。
結果値
• 両方の式に Period データ タイプまたは派生 PERIOD がある場合、第 1 の式の開
始境界および終了境界が第 2 の式の開始境界および終了境界に等しい場合には
TRUE を返し、それ以外の場合は FALSE を返します。
• どちらかのオペランドが NULL の場合、演算子は UNKNOWN を返します。
例
例
次の CREATE TABLE 文で作成された employee1 テーブルで、period1 と period2 が
PERIOD (DATE)列であるとします。
CREATE TABLE employee1 (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
period1(date),
period2(date)
) PRIMARY INDEX(eid);
EID
Name
DeptNo
Period1
Period2
1
Adams
101
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
2
Mary
201
('2005-04-02',
'2006-01-03')
('2006-01-03',
'2007-02-03')
3
Jones
301
('2004-01-02',
'2005-03-05')
('2003-03-05',
'2004-01-02')
次の SQL 文では、EQUALS を employee1 テーブルの PERIOD 列で使用しています。
SELECT eid, name, depno, period1, period2
FROM employee1
WHERE period1 EQUALS period2;
結果は以下のようになります。
994
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
EQUALS
EID
Name
DeptNo
Period1
Period2
1
Adams
101
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
1
Tom
101
DATE'200101-01'
DATE'200401-01'
DATE'2005- DATE'2006-0
01-01'
1-01'
2
Rick
201
DATE'200501-01'
DATE'200601-01'
DATE'2001- DATE'2004-0
01-01'
1-01'
3
Joo
301
DATE'200501-01'
DATE'200601-01'
DATE'2006- DATE'2007-0
01-01'
1-01'
4
Tam
401
DATE'200101-01'
DATE'200601-01'
DATE'2002- DATE'2004-0
01-01'
1-01'
5
Pat
501
DATE'200501-01'
DATE'200701-01'
DATE'2006- DATE'2008-0
01-01'
1-01'
6
Jack
601
DATE'200501-01'
DATE'200701-01'
DATE'2007- DATE'2008-0
01-01'
1-01'
7
Yu
701
DATE'200501-01'
DATE'200701-01'
DATE'2004- DATE'2005-0
01-01'
1-01'
8
Tim
801
DATE'200501-01'
DATE'200701-01'
DATE'2005- DATE'2007-0
01-01'
1-01'
次の SQL 文では、EQUALS を employee テーブルの派生 PERIOD 列で使用していま
す。
SQL 関数、演算子、式および述部
995
第 23 章 期間関数および演算子
IS UNTIL_CHANGED/IS NOT UNTIL_CHANGED
SELECT eid, name, deptno, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 EQUALS jobdur2;
結果は以下のようになります。
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
8
Tim
801
DATE'2005- DATE'200701-01'
01-01'
DATE'2005- 'DATE'200701-01'
01-01'
IS UNTIL_CHANGED/IS NOT UNTIL_CHANGED
目的
期間式または派生 PERIOD の終了境界値が UNTIL_CHANGED か、または IS NOT
UNTIL_CHANGED であるかをテストします。
構文
END
( period_expression )
IS
( derived_period )
UNTIL_CHANGED
NOT
構文要素
period_expression
PERIOD データ型と評価される任意の式。次のものがあります。
• PERIOD (TIMESTAMP WITH TIME ZONE)
• PERIOD (TIMESTAMP)
• PERIOD(DATE)タイプ
derived_period
PERIOD データ型と評価される任意の式。
使用上の注意
UNTIL_CHANGED は、要素タイプが DATE または TIMESTAMP WITH TIME ZONE で
ある Period 値の終了境界とのみ比較可能です。そのため、END 関数の結果の型は
DATE または TIMESTAMP WITH TIME ZONE でなければなりません。END 関数につ
いては、「END」を参照してください。
比較の際に、UNTIL_CHANGED 値の精度は、比較対象の終了境界値の精度にまで切
り詰められます。つまり、UNTIL_CHANGED の小数点以下桁数は、比較対象の終了
996
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
IS UNTIL_CHANGED/IS NOT UNTIL_CHANGED
境界値の精度によって変わるということです。終了境界値にタイムゾーンがなけれ
ば、タイムゾーンは省略されます。
終了境界値が NULL の場合、IS [NOT] UNTIL_CHANGED は UNKNOWN を返します。
system-time 列またはテンポラル テーブルの列の終了境界で IS [NOT]
UNTIL_CHANGED を使用することはできません。
例
例
次の employee テーブルでは、列 eduration が PERIOD(DATE)データ型として定義さ
れているとします。
ename
---------Adams
Gunther
Montoya
Chan
Fuller
eid
----------210677
199347
199340
210427
197899
eduration
-----------------------('05/03/01', '06/05/21')
('04/06/06', '99/12/31')
('04/06/02', '99/12/31')
('04/09/24', '99/12/31')
('03/05/27', '03/11/30')
次の SQL 問合わせでは、IS UNTIL_CHANGED を使用して eduration 列の終了境界値
と UNTIL_CHANGED とを比較します。
SELECT ename, eid
FROM employee
WHERE END(eduration) IS UNTIL_CHANGED;
結果は以下のようになります。
ename
---------Gunther
Montoya
Chan
eid
----------199347
199340
210427
例
次の SQL 文で employee テーブルが作成されたとします。
CREATE MULTISET TABLE employee(empno
INTEGER,
ename
VARCHAR(50),
deptno
INTEGER,
jobstart DATE NOT NULL,
jobend
DATE NOT NULL,
PERIOD FOR jobduration(jobstart, jobend))
PRIMARY INDEX(empno);
SQL 関数、演算子、式および述部
997
第 23 章 期間関数および演算子
IS UNTIL_CLOSED/IS NOT UNTIL_CLOSED
次の行が含まれています。
INSERT INTO employee(1025, 'John', '999', DATE'2005-02-03',
UNTIL_CHANGED);
次の SELECT 文について考えてみます。
SELECT empno,ename(CHAR(30)) FROM employee WHERE END(jobduration) IS
UNTIL_CHANGED;
次の結果が得られます。
empno ename
------ -----1025
John
IS UNTIL_CLOSED/IS NOT UNTIL_CLOSED
目的
テンポラル テーブルの system-time 列または transaction-time 列の終了境界値をテ
ストして、行が開いている(終了境界値 IS UNTIL_CLOSED)のか、閉じている(終了境
界値 IS NOT UNTIL_CLOSED)のかを調べます。
構文
END
( period_expression )
IS
( derived_period )
UNTIL_CLOSED
NOT
構文要素
period_expression
PERIOD データ型と評価される任意の式。
derived_period
PERIOD データ型と評価される任意の式。
使用上の注意
system-time 次元(列)または transaction-time 次元(列)のあるテンポラル テーブルで
行が作成されると、Teradata Database により列の終了境界が UNTIL_CLOSED に設
定され、その行は開いていると見なされます。行を閉じると、Teradata Database は
終了境界値を終了のタイムスタンプに設定します。
指定された transaction-time 列の終了境界が最大のタイムスタンプ値(9999-12-31
23:59:59.999999+00: 00)の場合、IS UNTIL_CLOSED が真と評価されます。
998
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
IS UNTIL_CLOSED/IS NOT UNTIL_CLOSED
例
例
CREATE MULTISET TABLE employee(
empno INTEGER,
ename VARCHAR(50),
deptno INTEGER,
jobstart TIMESTAMP WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW START,
jobend TIMESTAMP WITH TIME ZONE NOT NULL AS
GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME(jobstart,jobend)
)
PRIMARY INDEX(empno) WITH SYSTEM VERSIONING;
テーブルに以下の行が含まれているとします。
empno ename deptno
jobstart
jobend
----- ------ ------ -------------------------------- -------------------------------1025 John
999 2005-02-03 12:12:12.123456+00:00 9999-12-31
23:59:59.999999+00:00
次の SELECT 文の結果は次のとおりです。
SELECT empno,ename(CHAR(6)) FROM employee
WHERE END(SYSTEM_TIME) IS UNTIL_CLOSED;
empno ename
------ -----1025 John
SELECT empno,ename(CHAR(6)) FROM employee
WHERE END(SYSTEM_TIME) IS NOT UNTIL_CLOSED;
*** Query completed. No rows found.
例
次の SQL 文で employee テーブルが作成されたとします。
CREATE MULTISET TABLE employee(
id INTEGER,
name VARCHAR(50),
dept INTEGER,
tt PERIOD(TIMESTAMP(6)WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
SQL 関数、演算子、式および述部
999
第 23 章 期間関数および演算子
IMMEDIATELY PRECEDES
)
PRIMARY INDEX(id);
次のように実際の期間を表わす行が含まれています。
INSERT INTO employee(102, 'John', 222);
次の SELECT 文について考えてみます。
SELECT * FROM employee WHERE END(tt) IS UNTIL_CLOSED;
次の結果が得られます。
id
name
dept
-------------------102
John
222
IMMEDIATELY PRECEDES
目的
2 つの期間式または派生 PERIOD を TRUE、FALSE、または UNKNOWN に評価しま
す。
構文
構文要素
period_expression1/period_expression2
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
derived_period1/derived_period2
PERIOD データ型と評価される任意の式。
1000
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
IMMEDIATELY PRECEDES
結果値
この述部は、period_expression_1 と period_expression_2 の両方が PERIOD 列、
PERIOD のコンストラクタ、または Period 値の式である場合に適用されます。この
場合、述部は period_expression_1 の終了境界値が period_expression_2 の開始境
界値と等しい場合に真を返します。オペランドのいずれか、または両方が NULL で
ある場合、結果は UNKNOWN となります。
どちらかの式が NULL の場合、演算子は UNKNOWN を返します。
例
例
次の CREATE TABLE 文で作成された employee1 テーブルで、period1 と period2 が
PERIOD(DATE)列であるとします。
CREATE TABLE employee1 (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
period1(date),
period2(date)
) PRIMARY INDEX(eid);
EID
Name
DeptNo
Period1
Period2
1
Adams
101
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
2
Mary
201
('2005-04-02',
'2006-01-03')
('2006-01-03',
'2007-02-03')
3
Jones
301
('2004-01-02',
'2005-03-05')
('2003-03-05',
'2004-01-02')
次の SQL 文では、IMMEDIATELY PRECEDES を employee1 テーブルの PERIOD 列
で使用しています。
SELECT eid, name, depno, period1, period2
FROM employee1
WHERE period1 IMMEDIATELY PRECEDES period2;
結果は以下のようになります。
EID
Name
DeptNo
Period1
Period2
2
Mary
201
('2005-04-02',
'2006-01-03')
('2006-01-03',
'2007-02-03')
SQL 関数、演算子、式および述部
1001
第 23 章 期間関数および演算子
IMMEDIATELY PRECEDES
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
1002
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
1
Tom
101
DATE'2 DATE'2004-0 DATE'2005-0 DATE'2006-01-01'
001-01- 1-01'
1-01'
01'
2
Rick
201
DATE'2 DATE'2006-0 DATE'2001-0 DATE'2004-01-01'
005-01- 1-01'
1-01'
01'
3
Joo
301
DATE'2 DATE'2006-0 DATE'2006-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
4
Tam
401
DATE'2 DATE'2006-0 DATE'2002-0 DATE'2004-01-01'
001-01- 1-01'
1-01'
01'
5
Pat
501
DATE'2 DATE'2007-0 DATE'2006-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
6
Jack
601
DATE'2 DATE'2007-0 DATE'2007-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
7
Yu
701
DATE'2 DATE'2007-0 DATE'2004-0 DATE'2005-01-01'
005-01- 1-01'
1-01'
01'
8
Tim
801
DATE'2 DATE'2007-0 DATE'2005-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
IMMEDIATELY SUCCEEDS
IMMEDIATELY SUCCEEDS
目的
2 つの期間式または派生 PERIOD を TRUE、FALSE、または UNKNOWN に評価しま
す。
構文
構文要素
period_expression1/period_expression2
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
derived_period1/derived_period2
PERIOD データ型と評価される任意の式。
結果値
この述部は、period_expression_1 と period_expression_2 の両方が PERIOD 列、
PERIOD のコンストラクタ、または Period 値の式である場合に適用されます。この
場合、述部は period_expression_1 の開始境界値が period_expression_2 の終了境
界値と等しい場合に真を返します。オペランドのいずれか、または両方が NULL で
ある場合、結果は UNKNOWN となります。
どちらかの式が NULL の場合、演算子は UNKNOWN を返します。
例
例
次の CREATE TABLE 文で作成された employee1 テーブルで、period1 と period2 が
PERIOD(DATE)列であるとします。
CREATE TABLE employee1 (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
SQL 関数、演算子、式および述部
1003
第 23 章 期間関数および演算子
IMMEDIATELY SUCCEEDS
deptno INTEGER NOT NULL,
period1(date),
period2(date)
) PRIMARY INDEX(eid);
EID
Name
DeptNo
Period1
Period2
1
Adams
101
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
2
Mary
201
('2005-04-02',
'2006-01-03')
('2006-01-03',
'2007-02-03')
3
Jones
301
('2004-01-02',
'2005-03-05')
('2003-03-05',
'2004-01-02')
次の SQL 文では、IMMEDIATELY SUCCEEDS を employee1 テーブルの PERIOD 列で
使用しています。
SELECT eid, name, deptno, period1, period2
FROM employee1
WHERE period1 IMMEDIATELY SUCCEEDS period2;
結果は以下のようになります。
EID
Name
DeptNo
Period1
Period2
3
Jones
301
('2004-01-02',
'2005-03-05')
('2003-03-05',
'2004-01-02')
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
1004
EID Name DeptNo
JobSt1
1
DATE'2 DATE'2004-0 DATE'2005-0 DATE'2006-01-01'
001-01- 1-01'
1-01'
01'
Tom
101
JobEnd1
JobSt2
JobEnd2
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
INTERVAL
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
2
Rick
201
DATE'2 DATE'2006-0 DATE'2001-0 DATE'2004-01-01'
005-01- 1-01'
1-01'
01'
3
Joo
301
DATE'2 DATE'2006-0 DATE'2006-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
4
Tam
401
DATE'2 DATE'2006-0 DATE'2002-0 DATE'2004-01-01'
001-01- 1-01'
1-01'
01'
5
Pat
501
DATE'2 DATE'2007-0 DATE'2006-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
6
Jack
601
DATE'2 DATE'2007-0 DATE'2007-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
7
Yu
701
DATE'2 DATE'2007-0 DATE'2004-0 DATE'2005-01-01'
005-01- 1-01'
1-01'
01'
8
Tim
801
DATE'2 DATE'2007-0 DATE'2005-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
次の SQL 文では、IMMEDIATELY SUCCEEDS を employee テーブルの派生 PERIOD
列で使用しています。
SELECT eid, name, depno, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 IMMEDIATELY SUCCEEDS jobdur2;
結果は以下のようになります。
EID
Name
DeptNo
JobSt1
7
Yu
701
DATE'2005- DATE'200701-01'
01-01'
JobEnd1
JobSt2
JobEnd2
DATE'200401-01'
DATE'2005-0
1-01'
INTERVAL
目的
期間式または派生 PERIOD の終了境界と開始境界の差を算出し、その差を指定した
間隔修飾子に引数の時間間隔として返します。
SQL 関数、演算子、式および述部
1005
第 23 章 期間関数および演算子
INTERVAL
構文
INTERVAL
( period_expression )
interval_qualifier
( derived_period )
構文要素
period_expression
PERIOD データ型と評価される任意の式。
derived_period
PERIOD データ型と評価される任意の式。
interval_qualifier
引数の要素の型に適合する任意の間隔修飾子。間隔修飾子は、次のとおりです。
年-月の間隔:
• YEAR
• YEAR TO MONTH
• MONTH
日-時刻の間隔:
•
•
•
•
•
•
•
DAY
DAY TO HOUR、MINUTE または SECOND
HOUR
HOUR TO MINUTE または SECOND
MINUTE
MINUTE TO SECOND
SECOND
戻り値
引数 p が期間式で、IQ が間隔修飾子だとすると、INTERVAL (p) IQ 関数の結果は、
(END(p) - BEGIN(p)) IQ の値になります。
引数が NULL の場合、結果は NULL になります。
フォーマットおよびタイトル
フォーマットは、指定した間隔修飾子と一致する間隔データ タイプのデフォルト
フォーマットです。
タイトルは、INTERVAL(period _expression) interval_qualifier です。
エラー条件
エラーが報告される可能性のある条件は、次のとおりです。
1006
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
INTERVAL
• INTERVAL 関数の引数に、Period データ タイプがない場合。
• 引数に PERIOD(DATE)データ タイプがあるのに、間隔修飾子が YEAR、YEAR TO
MONTH、MONTH または DAY ではない場合。
• 引数に PERIOD(TIME(n) [WITH TIME ZONE])データ タイプがあるのに、間隔修
飾子が HOUR、HOUR TO MINUTE、HOUR TO SECOND、MINUTE、MINUTE TO
SECOND または SECOND ではない場合。
• INTERVAL 式の結果が、間隔修飾子の精度に規定されたルールに違反する場合
は、エラーがレポートされる。たとえば、p1 が PERIOD '(2006-01-01 12:12:12,
2007-01-01 12:12:12)'の値を持つ PERIOD(TIMESTAMP(0))式だとします。
INTERVAL(p1) DAY が指定されている場合、DAY 間隔修飾子のデフォルトの精度
は 2 になります。3 桁の値になる 365 日は DAY(2)間隔修飾子に収まらないため、
エラーが報告されます。
• INTERVAL 関数の引数が、DATE または TIMESTAMP(n) [WITH TIME ZONE]を含
む期間で、終了境界の値が UNTIL_CHANGED の場合。
例
例
period1 が PERIOD(DATE)列の employee テーブルに対して、次の問合わせを実行し
たとします。
SELECT INTERVAL (period1) MONTH FROM employee;
ename
dept
period1
-----------------------------------------Jones
Sales
('2004-01-02', '2004-03-05')
結果は以下のようになります。
INTERVAL(period) MONTH
----------------------2
例
INTERVAL は、次の SQL 文を使用して作成された jobduration という派生 PERIOD
の間隔値を返します。
CREATE TABLE employee(id INTEGER,
name VARCHAR(50),
jdbegin DATE NOT NULL FORMAT 'YYYY-MM-DD',
jdend
DATE NOT NULL FORMAT 'YYYY-MM-DD',
PERIOD FOR jobduration(jdbegin,jdend)
)PRIMARY INDEX(id);
次の値が employee テーブルに挿入されるとします。
INSERT INTO employee(1025,'John',DATE'2011-01-02',DATE'2012-05-02');
SQL 関数、演算子、式および述部
1007
第 23 章 期間関数および演算子
LAST
次の SQL 文を実行します。
SELECT INTERVAL(jobduration)MONTH(4) FROM employee;
次の結果が得られます。
INTERVAL(jobduration) MONTH
----------------------------16
LAST
目的
期間引数の最後の値(つまり、終了境界から引数の構成要素のタイプの 1 最小単位を
減算した値)を返します。
構文
LAST
( period_expression )
( derived_period )
構文要素
period_expression
PERIOD データ型と評価される任意の式。
derived_period
PERIOD データ型と評価される任意の式。
戻り値
LAST 関数の結果のデータ タイプは、期間式の構成要素のタイプと同じになるか、
または引数が派生 PERIOD 列である場合には開始列または終了列のデータ タイプと
同じになります。引数が NULL の場合、結果は NULL になります。
フォーマットおよびタイトル
書式は、期間式の構成要素のタイプのデフォルトの書式になるか、または引数が派
生 PERIOD である場合には開始列または終了列の書式になります。
エラー条件
引数に Period データ タイプ以外のデータ タイプがあると、エラーが報告されます。
1008
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
LAST
例
例
period1 が PERIOD(DATE)列の employee テーブルに対して、次の問合わせを実行し
たとします。
SELECT * FROM employee WHERE LAST(period1) = DATE '2004-01-04';
ename
dept
period1
-----------------------------------------Jones
Sales
('2004-01-02', '2004-01-05')
Adams
Marketing
('2004-06-19', '2005-02-09')
Mary
Development
('2004-06-19', '2005-01-05')
Simon
Sales
('2004-06-22', '2005-01-07')
結果は以下のようになります。
ename
----Jones
dept
----------Sales
period1
---------------------------('2004-01-02', '2004-01-05')
例
LAST は、次の SQL 文を使用して作成された jobduration という派生 PERIOD の最
後の値を返します。
CREATE TABLE employee(id INTEGER,
name VARCHAR(50),
jdbegin DATE NOT NULL FORMAT 'YYYY-MM-DD',
jdend
DATE NOT NULL FORMAT 'YYYY-MM-DD',
PERIOD FOR jobduration(jdbegin,jdend)
)PRIMARY INDEX(id);
次の値が employee テーブルに挿入されるとします。
INSERT INTO employee(1025,'John',DATE'2011-01-02',DATE'2012-05-02');
次の SQL 文を実行します。
SELECT LAST (jobduration) FROM employee;
次の結果が得られます。
LAST(jobduration)
-----------------------2012-05-01
SQL 関数、演算子、式および述部
1009
第 23 章 期間関数および演算子
MEETS
MEETS
目的
2 つの期間式、派生 PERIOD、または日時式を TRUE、FALSE、または UNKNOWN
に評価します。
構文
period_expression
MEETS
period_expression
datetime_expression
NOT
derived_period
datetime_expression
MEETS
period_expression
NOT
derived_period
MEETS
NOT
derived_period
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
derived_period
PERIOD データ型と評価される任意の式。
結果値
• 両方の式に Period データ タイプまたは派生 PERIOD がある場合、第 1 の式の終
了境界が第 2 の式の開始境界に等しいか、第 2 の式の終了境界が第 1 の式の開始
境界に等しい場合には TRUE を返し、それ以外の場合は FALSE を返します。
• 一方の式が Period データ タイプで、他方の式が日時式の場合、期間式の終了境
界が日時式に等しいか、日時式に 1 最小単位を加算したものが期間式の終了境界
に等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。
• どちらかの式が NULL の場合、関数は UNKNOWN を返します。
1010
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
MEETS
エラー条件
どちらかの式が期間または日時以外のデータ タイプと評価されると、エラーが報告
されます。
式の間での比較ができないとエラーが報告されます。
例
例
period1 および period2 が PERIOD(DATE)列の employee テーブルに対して、次の問
合わせを実行したとします。
SELECT * FROM employee WHERE period2 MEETS period1;
ename
period1
period2
Adams
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
Mary
('2005-04-02',
'2006-01-03')
('2005-02-03',
'2006-02-03')
Jones
('2004-01-02',
'2004-03-05')
('2004-03-05',
'2004-10-07')
Randy
('2004-01-02',
'2004-03-05')
('2004-03-07',
'2004-10-07')
Simon
?
('2005-02-03',
'2005-07-27')
結果は以下のようになります。
ename
period1
Jones
('2004-01-02','2004-03-05') ('2004-03-05',
'2004-10-07')
period2
例: MEETS の使用
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
SQL 関数、演算子、式および述部
1011
第 23 章 期間関数および演算子
MEETS
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
1
Tom
101
DATE'2 DATE'2004-0 DATE'2005-0 DATE'2006-01-01'
001-01- 1-01'
1-01'
01'
2
Rick
201
DATE'2 DATE'2006-0 DATE'2001-0 DATE'2004-01-01'
005-01- 1-01'
1-01'
01'
3
Joo
301
DATE'2 DATE'2006-0 DATE'2006-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
4
Tam
401
DATE'2 DATE'2006-0 DATE'2002-0 DATE'2004-01-01'
001-01- 1-01'
1-01'
01'
5
Pat
501
DATE'2 DATE'2007-0 DATE'2006-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
6
Jack
601
DATE'2 DATE'2007-0 DATE'2007-0 DATE'2008-01-01'
005-01- 1-01'
1-01'
01'
7
Yu
701
DATE'2 DATE'2007-0 DATE'2004-0 DATE'2005-01-01'
005-01- 1-01'
1-01'
01'
8
Tim
801
DATE'2 DATE'2007-0 DATE'2005-0 DATE'2007-01-01'
005-01- 1-01'
1-01'
01'
次の SQL 文では、MEETS を employee テーブルの派生 PERIOD 列で使用しています。
SELECT eid, name, deptno, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 MEETS jobdur2;
結果は以下のようになります。
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
1012
3
Joo
301
DATE'2005-01- DATE'2006-0
01'
1-01'
DATE'2006-01-0 DATE'2007-0
1'
1-01'
6
Jack
601
DATE'2005-01- DATE'2007-0
01'
1-01'
DATE'2007-01-0 DATE'2008-0
1'
1-01'
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
NEXT
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
7
Yu
701
DATE'2005-01- DATE'2007-0
01'
1-01'
DATE'2004-01-0 DATE'2005-0
1'
1-01'
NEXT
目的
引数の次の値(引数と返される値の差が、引数のタイプの最小単位 1 つ分)を返します。
構文
NEXT ( datetime_expression )
構文要素
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
戻り値
結果のデータ タイプは、引数のデータ タイプと同じになります。引数の値が NULL
の場合、結果は NULL になります。
フォーマットおよびタイトル
フォーマットは、近似引数のデータ タイプのデフォルト フォーマットです。
エラー条件
引数に日時データ タイプがない場合は、エラーが報告されます。
結果が引数のデータ タイプの値に許容された範囲を超えると、エラーが報告されま
す。たとえば、NEXT(DATE '9999-12-31')が指定されると、エラーが報告されます。
例
period1 が PERIOD(DATE)列の employee テーブルに対して、次の問合わせを実行し
たとします。
SQL 関数、演算子、式および述部
1013
第 23 章 期間関数および演算子
OVERLAPS
SELECT *
FROM employee
WHERE NEXT(END(period1)) = DATE '2004-03-06';
ename
dept
period1
-----------------------------------------Jones
Sales
('2004-01-02', '2004-03-05')
Simon
Sales
?
結果は以下のようになります。
ename
----Jones
dept
----------Sales
period1
---------------------------('2004-01-02', '2004-03-05')
OVERLAPS
目的
2 つの時間が相互に重なっているかどうかをテストします。
構文
構文要素
datetime_expression
開始および終了日時。
interval_expression
終了日時。
1014
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
OVERLAPS
row_subquery
式または式のリストで指定された数と同じ数の式を選択する副問合わせ。
Subquery で SELECT AND CONSUME 文を指定することはできません。
period_expression
変換される PERIOD 式。
derived_period
PERIOD データ型と評価される任意の式。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
時間
時間の始まりと終わりの日時値が年代順に配列されない場合には、すべてに
end_DateTime >= start_DateTime という規則を使用して、そのように配列されてか
ら比較されます。
時間に null の start_DateTime と非 null の end_DateTime が含まれている場合、値
は非 null の start_DateTime と null の end_DateTime を示すように切り替わります。
注: Period データ タイプへの暗黙的なキャストはサポートされていません。
結果
次の一般的な OVERLAPS の比較について説明します。
(S1, E1) OVERLAPS (S2, E2)
OVERLAPS の結果は、以下のようになります。
(S1 > S2 AND NOT (S1 >= E2 AND E1 >= E2))
OR
(S2 > S1 AND NOT (S2 >= E1 AND E2 >= E1))
OR
(S1 = S2 AND (E1 = E2 OR E1 <> E2))
Period データ タイプまたは派生 PERIOD(p1 が第 1 の期間式または派生 PERIOD、
p2 が第 2 の期間式または派生 PERIOD)の場合、S1、E1、S2、および E2 の値は、
次のようになります。
S1 = BEGIN(p1)
E1 = END(p1)
SQL 関数、演算子、式および述部
1015
第 23 章 期間関数および演算子
OVERLAPS
S2 = BEGIN(p2)
E2 = END(p2)
規則
• 2 つの日時タイプを指定するときには、比較可能でなければなりません。
• 2 つの期間タイプ(派生 PERIOD も含む)を指定する場合、それらは比較可能でな
ければなりません。
• 期間タイプを 1 つまたは両方の期間に指定する場合、期間式に NULL を明示的に
含めてはいけません。
• 最初の列にある左右の時間がどちらも日時タイプの場合、それらは同じデータ タ
イプ(両方とも DATE、両方とも TIME または両方とも TIMESTAMP)である必要が
あります。
• 一方の時間のみが期間タイプならば、最初の列のもう一方の時間は期間の要素タ
イプと同じデータ タイプである必要があります。
• どちらの時間も期間タイプではない場合、2 番目の列にある左右それぞれの時間
は、その列に対応する最初の列と同じ日時データ タイプであるか、対応する日時
タイプの値に追加できるような精度を持つ日時フィールドのみを伴う間隔タイプ
でなければなりません。
例
例
次の例では、1 つの共通点 CURRENT_TIME を共有する 2 つの期間を比較します。
2 つの期間が 1 つの共通点を共有するときには、定義によって重ならないため、返
される結果は FALSE です。
SELECT 'OVERLAPS'
WHERE (CURRENT_TIME(0), INTERVAL '1' HOUR)
OVERLAPS (CURRENT_TIME(0), INTERVAL -'1' HOUR);
次の例は、前の例とほぼ同じです。ただし、引数は、1 秒ずつ重なるように調整さ
れました。結果は TRUE です。値「OVERLAPS」が返されます。
SELECT 'OVERLAPS'
WHERE (CURRENT_TIME(0), INTERVAL '1' HOUR)
OVERLAPS (CURRENT_TIME(0) + INTERVAL '1' SECOND,INTERVAL -'1' HOUR);
次の例では、datetime_expression, datetime_expression 形式の OVERLAPS を使用し
ています。2 つの DATE 期間が重なり合うので、結果は TRUE です。
SELECT 'OVERLAPS'
WHERE (DATE '2000-01-15',DATE '2002-12-15')
OVERLAPS (DATE '2001-06-15',DATE '2005-06-15');
1016
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
OVERLAPS
次の例は前の例と同じですが、row_subquery の形式になっています。
SELECT 'OVERLAPS'
WHERE (SELECT DATE '2000-01-15', DATE '2002-12-15')
OVERLAPS (SELECT DATE '2001-06-15', DATE '2005-06-15');
次の例にある NULL は、2 番目の datetime_expression の開始時刻が 2001-06-13
15:00:00 で、終了時刻が null であることを示しています。
SELECT 'OVERLAPS'
WHERE (TIMESTAMP '2001-06-12 10:00:00', TIMESTAMP '2001-06-15
08:00:00')
OVERLAPS (TIMESTAMP '2001-06-13 15:00:00', NULL);
2 番目の式の開始時刻は最初の式で定義される TIMESTAMP 間隔内にあるため、結
果は TRUE です。
period1 および period2 が PERIOD(DATE)列の employee テーブルに対して、次の問
合わせを実行したとします。
SELECT * FROM employee WHERE period2 OVERLAPS period1;
Ename
period1
period2
Adams
('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
Mary
('2005-04-02', '2006-01-03')
('2005-02-03', '2006-02-03')
Jones
('2004-01-02', '2004-03-05')
('2004-03-05', '2004-10-07')
Randy
('2004-01-02', '2004-03-05')
('2004-03-07', '2004-10-07')
Simon
?
('2005-02-03', '2005-07-27')
結果は以下のようになります。
Ename
period1
period2
Adams
('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
Mary
('2005-04-02', '2006-01-03')
('2005-02-03', '2006-02-03')
次の表と問合わせについて考慮します。
CREATE TABLE project
(id INTEGER,
analysis_phase PERIOD(DATE))
UNIQUE PRIMARY INDEX (id);
INSERT project (1, PERIOD(DATE'2010-06-21',DATE'2010-06-25'));
SELECT 'OVERLAPS'
FROM project
WHERE analysis_phase OVERLAPS
PERIOD(DATE'2010-06-24',NULL);
SQL 関数、演算子、式および述部
1017
第 23 章 期間関数および演算子
OVERLAPS
OVERLAP のオペランドの 1 つが、明示的に NULL を指定する期間式を持つ期間タイ
プであるため、SELECT 文はエラーを返します。
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
EID
Name
DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
1
Tom
101
DATE'2001-01-01'
DATE'2004-01-01' DATE'2005-01-01' DATE'2006-01-01'
2
Rick
201
DATE'2005-01-01'
DATE'2006-01-01' DATE'2001-01-01' DATE'2004-01-01'
3
Joo
301
DATE'2005-01-01'
DATE'2006-01-01' DATE'2006-01-01' DATE'2007-01-01'
4
Tam
401
DATE'2001-01-01'
DATE'2006-01-01' DATE'2002-01-01' DATE'2004-01-01'
5
Pat
501
DATE'2005-01-01'
DATE'2007-01-01' DATE'2006-01-01' DATE'2008-01-01'
6
Jack
601
DATE'2005-01-01'
DATE'2007-01-01' DATE'2007-01-01' DATE'2008-01-01'
7
Yu
701
DATE'2005-01-01'
DATE'2007-01-01' DATE'2004-01-01' DATE'2005-01-01'
8
Tim
801
DATE'2005-01-01'
DATE'2007-01-01' DATE'2005-01-01' DATE'2007-01-01'
次の SQL 文では、OVERLAPS を employee テーブルの派生 PERIOD 列で使用してい
ます。
SELECT eid, name, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 OVERLAPS jobdur2;
結果は以下のようになります。
EID
Name
DeptNo
JobSt1
JobEnd1
4
Tam
401
DATE'2001-01-01'
DATE'2006-01-01' DATE'2002-01-01' DATE'2004-01-01'
5
Pat
501
DATE'2005-01-01'
DATE'2007-01-01' DATE'2006-01-01' DATE'2008-01-01'
8
Tim
801
DATE'2005-01-01'
DATE'2007-01-01' DATE'2005-01-01' DATE'2007-01-01'
1018
JobSt2
JobEnd2
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
OVERLAPS
例
次の例は、前の例とほぼ同じです。ただし、引数は、1 秒ずつ重なるように調整さ
れました。結果は TRUE です。値「OVERLAPS」が返されます。
SELECT 'OVERLAPS'
WHERE (CURRENT_TIME(0), INTERVAL '1' HOUR)
OVERLAPS (CURRENT_TIME(0) + INTERVAL '1' SECOND,INTERVAL -'1' HOUR);
例
次の例では、datetime_expression, datetime_expression 形式の OVERLAPS を使用し
ています。2 つの DATE 期間が重なり合うので、結果は TRUE です。
SELECT 'OVERLAPS'
WHERE (DATE '2000-01-15',DATE '2002-12-15')
OVERLAPS (DATE '2001-06-15',DATE '2005-06-15');
例
次の例は前の例と同じですが、row_subquery の形式になっています。
SELECT 'OVERLAPS'
WHERE (SELECT DATE '2000-01-15', DATE '2002-12-15')
OVERLAPS (SELECT DATE '2001-06-15', DATE '2005-06-15');
例
次の例にある NULL は、2 番目の datetime_expression の開始時刻が 2001-06-13
15:00:00 で、終了時刻が null であることを示しています。
SELECT 'OVERLAPS'
WHERE (TIMESTAMP '2001-06-12 10:00:00', TIMESTAMP '2001-06-15
08:00:00')
OVERLAPS (TIMESTAMP '2001-06-13 15:00:00', NULL);
2 番目の式の開始時刻は最初の式で定義される TIMESTAMP 間隔内にあるため、結
果は TRUE です。
例
period1 および period2 が PERIOD(DATE)列の employee テーブルに対して、次の問
合わせを実行したとします。
SELECT * FROM employee WHERE period2 OVERLAPS period1;
Ename
period1
period2
Adams
('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
Mary
('2005-04-02', '2006-01-03')
('2005-02-03', '2006-02-03')
SQL 関数、演算子、式および述部
1019
第 23 章 期間関数および演算子
OVERLAPS
Ename
period1
period2
Jones
('2004-01-02', '2004-03-05')
('2004-03-05', '2004-10-07')
Randy
('2004-01-02', '2004-03-05')
('2004-03-07', '2004-10-07')
Simon
?
('2005-02-03', '2005-07-27')
結果は以下のようになります。
Ename
period1
period2
Adams
('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
Mary
('2005-04-02', '2006-01-03')
('2005-02-03', '2006-02-03')
例
次の表と問合わせについて考慮します。
CREATE TABLE project
(id INTEGER,
analysis_phase PERIOD(DATE))
UNIQUE PRIMARY INDEX (id);
INSERT project (1, PERIOD(DATE'2010-06-21',DATE'2010-06-25'));
SELECT 'OVERLAPS'
FROM project
WHERE analysis_phase OVERLAPS
PERIOD(DATE'2010-06-24',NULL);
OVERLAP のオペランドの 1 つが、明示的に NULL を指定する期間式を持つ期間タイ
プであるため、SELECT 文はエラーを返します。
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
1020
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
OVERLAPS
EID Name DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
1
Tom
101
DATE'2 DATE'2004001-01- 01-01'
01'
DATE'2005-0 DATE'2006-01-01'
1-01'
2
Rick
201
DATE'2 DATE'2006005-01- 01-01'
01'
DATE'2001-0 DATE'2004-01-01'
1-01'
3
Joo
301
DATE'2 DATE'2006005-01- 01-01'
01'
DATE'2006-0 DATE'2007-01-01'
1-01'
4
Tam
401
DATE'2 DATE'2006001-01- 01-01'
01'
DATE'2002-0 DATE'2004-01-01'
1-01'
5
Pat
501
DATE'2 DATE'2007005-01- 01-01'
01'
DATE'2006-0 DATE'2008-01-01'
1-01'
6
Jack
601
DATE'2 DATE'2007005-01- 01-01'
01'
DATE'2007-0 DATE'2008-01-01'
1-01'
7
Yu
701
DATE'2 DATE'2007005-01- 01-01'
01'
DATE'2004-0 DATE'2005-01-01'
1-01'
8
Tim
801
DATE'2 DATE'2007005-01- 01-01'
01'
DATE'2005-0 DATE'2007-01-01'
1-01'
次の SQL 文では、OVERLAPS を employee テーブルの派生 PERIOD 列で使用してい
ます。
SELECT eid, name, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 OVERLAPS jobdur2;
結果は以下のようになります。
EID
Name
DeptNo
JobSt1
4
Tam
401
DATE'2001- DATE'200601-01'
01-01'
SQL 関数、演算子、式および述部
JobEnd1
JobSt2
JobEnd2
DATE'2002-01- DATE'2004-0101'
01'
1021
第 23 章 期間関数および演算子
P_INTERSECT
EID
Name
DeptNo
JobSt1
JobEnd1
JobSt2
JobEnd2
5
Pat
501
DATE'2005- DATE'200701-01'
01-01'
DATE'2006-01- DATE'2008-0101'
01'
8
Tim
801
DATE'2005- DATE'200701-01'
01-01'
DATE'2005-01- DATE'2007-0101'
01'
P_INTERSECT
目的
期間式の間に重複部分がある場合に、それらに共通する期間式の部分を返します。
構文
period_expression
P_INTERSECT
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
結果値
• 期間式に重複部分がない場合、結果は NULL になります。どちらかの期間式が
NULL の場合、結果は NULL になります。それ以外の場合の結果は、期間式の間
で比較できる Period データ型になります。
• 期間式の間で精度が異なる PERIOD(TIMESTAMP(n) [WITH TIME ZONE])または
PERIOD(TIME(n) [WITH TIME ZONE])データ型があると、結果は精度が高い方の
データ型の Period 値になります。どちらの期間式にもタイムゾーンがない場合、
結果の期間はタイムゾーンを持ちません。それ以外の場合には、結果の期間はタ
イムゾーンを持ち、結果のタイムゾーンの値は次に示すルールにより決定されま
す:
• 両方の期間式に 1 つのタイムゾーンがある場合、結果の境界に含まれるタイム
ゾーンの変移は、後述の Period 値コンストラクタで定義されているように、
期間式の一致する境界から取得されます。
• どちらか一方の期間式にのみタイムゾーンがある場合、もう一方の期間式は現
在のセッションのタイムゾーンにあるとみなされ、結果は次に示すように計算
されます。
1022
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
P_INTERSECT
例えば、p1 および p2 が期間式で、上述のとおりに決定された結果の構成要素のタ
イプが rt だとします。p1 OVERLAPS p2 が TRUE の場合、p1 P_INTERSECT p2 の
結果は次のようになります。
PERIOD(
CASE WHEN CAST(BEGIN(p1) AS rt) >= CAST(BEGIN(p2) AS rt)
THEN CAST(BEGIN(p1) AS rt)
ELSE CAST(BEGIN(p2) AS rt) END,
CASE WHEN CAST(END(p1) AS rt) <= CAST(END(p2) AS rt)
THEN CAST(END(p1) AS rt)
ELSE CAST(END(p2) AS rt) END)
内部的には、Period 値は UTC で保存されます。その後で、それらの値の UTC 表示
フォーマットを使用して OVERLAPS 演算子が評価され、重複があると P_INTERSECT
操作が実行されます。
フォーマットおよびタイトル
フォーマットは結果の Period データ タイプのデフォルト フォーマットです。
エラー条件
どちらか 一方でも期間式でない場合には、エラーがレポートされます。
期間式の間での比較ができないとエラーが報告されます。
例
例
ename
period1
period2
Adams
('2005-02-03 10:10:10.1',
'2007-02-03 10:10:10.1')
('2004-02-03 10:10:10',
'2006-02-03 10:10:10')
Paul
('2004-02-03 10:10:10.1',
'2006-02-03 10:10:10.1')
('2005-02-03 10:10:10',
'2007-02-03 10:10:10')
James
('2004-03-03 10:10:10.1',
'2006-01-03 10:10:10.1')
('2004-02-03 10:10:10',
'2006-02-03 10:10:10')
Mary
('2007-04-02 10:10:10.1',
'2008-01-03 10:10:10.1')
('2005-02-03 10:10:10',
'2006-02-03 10:10:10')
(period2 P_INTERSECT period1)
('2005-02-03 10:10:10.1', '2006-02-03 10:10:10.0')
SQL 関数、演算子、式および述部
1023
第 23 章 期間関数および演算子
P_INTERSECT
例
次に示す例では、選択リストで P_INTERSECT 演算子を使用しています。
SELECT period2 P_INTERSECT period1
FROM product_tests
WHERE pid = 11804;
次に示すテーブル product_tests に対して、上記の問合わせを実行するとします。こ
こでは、period1 が PERIOD(TIME(1))列、period2 が PERIOD(TIME(0))列だとしま
す。
pid
----11804
10996
period1
---------------------------('10:10:10.1', '11:10:10.1')
('11:10:10.1', '11:40:40.1')
period2
-----------------------('10:10:10', '10:10:11')
('10:10:10', '10:10:11')
結果は、以下のとおりです。
(period2 P_INTERSECT period1)
----------------------------('10:10:10.1', '10:10:11.0')
P_INTERSECT
目的
期間式の間に重複部分がある場合に、それらに共通する期間式の部分を返します。
構文
period_expression
P_INTERSECT
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
結果値
• 期間式に重複部分がない場合、結果は NULL になります。どちらかの期間式が
NULL になる場合、結果は NULL となります。それ以外の場合の結果は、期間式
の間で比較できる Period データ型になります。
1024
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
P_INTERSECT
• 期間式の間で精度が異なる PERIOD(TIMESTAMP(n) [WITH TIME ZONE])または
PERIOD(TIME(n) [WITH TIME ZONE])データ型があると、結果は精度が高い方の
データ型の Period 値になります。どちらの期間式にもタイムゾーンがない場合、
結果の期間はタイムゾーンを持ちません。それ以外の場合には、結果の期間はタ
イムゾーンを持ち、結果のタイムゾーンの値は次に示すルールにより決定されま
す:
• 両方の期間式に 1 つのタイムゾーンがある場合、結果の境界に含まれるタイ
ムゾーンの変移は、後述の Period 値コンストラクタで定義されているように、
期間式の一致する境界から取得されます。
• どちらか一方の期間式にのみタイムゾーンがある場合、もう一方の期間式は
現在のセッションのタイムゾーンにあるとみなされ、結果は次に示すように
計算されます。
例えば、p1 および p2 が期間式で、上述のとおりに決定された結果の構成要素のタ
イプが rt だとします。p1 OVERLAPS p2 が TRUE の場合、p1 P_INTERSECT p2 の
結果は次のようになります。
PERIOD(
CASE WHEN CAST(BEGIN(p1) AS rt) >= CAST(BEGIN(p2) AS rt)
THEN CAST(BEGIN(p1) AS rt)
ELSE CAST(BEGIN(p2) AS rt) END,
CASE WHEN CAST(END(p1) AS rt) <= CAST(END(p2) AS rt)
THEN CAST(END(p1) AS rt)
ELSE CAST(END(p2) AS rt) END)
内部的には、Period 値は UTC で保存されます。その後で、それらの値の UTC 表示
フォーマットを使用して OVERLAPS 演算子が評価され、重複があると P_INTERSECT
操作が実行されます。
フォーマットおよびタイトル
フォーマットは結果の Period データ タイプのデフォルト フォーマットです。
エラー条件
どちらか 一方でも期間式でない場合には、エラーがレポートされます。
期間式の間での比較ができないとエラーが報告されます。
SQL 関数、演算子、式および述部
1025
第 23 章 期間関数および演算子
P_INTERSECT
例
例
ename
period1
period2
Adams
('2005-02-03 10:10:10.1',
'2007-02-03 10:10:10.1')
('2004-02-03 10:10:10',
'2006-02-03 10:10:10')
Paul
('2004-02-03 10:10:10.1',
'2006-02-03 10:10:10.1')
('2005-02-03 10:10:10',
'2007-02-03 10:10:10')
James
('2004-03-03 10:10:10.1',
'2006-01-03 10:10:10.1')
('2004-02-03 10:10:10',
'2006-02-03 10:10:10')
Mary
('2007-04-02 10:10:10.1',
'2008-01-03 10:10:10.1')
('2005-02-03 10:10:10',
'2006-02-03 10:10:10')
(period2 P_INTERSECT period1)
('2005-02-03 10:10:10.1', '2006-02-03 10:10:10.0')
例
次に示す例では、選択リストで P_INTERSECT 演算子を使用しています。
SELECT period2 P_INTERSECT period1
FROM product_tests
WHERE pid = 11804;
次に示すテーブル product_tests に対して、上記の問合わせを実行するとします。こ
こでは、period1 が PERIOD(TIME(1))列、period2 が PERIOD(TIME(0))列だとしま
す。
pid
----11804
10996
period1
---------------------------('10:10:10.1', '11:10:10.1')
('11:10:10.1', '11:40:40.1')
period2
-----------------------('10:10:10', '10:10:11')
('10:10:10', '10:10:11')
結果は、以下のとおりです。
(period2 P_INTERSECT period1)
----------------------------('10:10:10.1', '10:10:11.0')
1026
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
PRECEDES
PRECEDES
目的
2 つの期間式、派生 PERIOD、または日時式を TRUE、FALSE、または UNKNOWN
に評価します。
構文
period_expression
PRECEDES
period_expression
datetime_expression
NOT
derived_period
datetime_expression
PRECEDES
period_expression
NOT
derived_period
PRECEDES
NOT
derived_period
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
derived_period
PERIOD データ型と評価される任意の式。
結果値
• 両方の式に Period データ型または派生 PERIOD がある場合、第 1 の式の 終了境
界が第 2 の式の開始境界より小さいか等しい場合には TRUE を返し、それ以外の
場合は FALSE を返します。
• 第 1 の式が期間式で、第 2 の式が日時式の場合、第 1 の式の終了境界が第 2 の
式より小さいか等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。
• 第 1 の式が日時値式で、第 2 の式が Period データ タイプの場合、第 1 の式が第
2 の式の開始境界より小さい場合は TRUE を返し、それ以外の場合は FALSE を返
します。
• どちらかの式が NULL の場合、演算子は UNKNOWN を返します。
SQL 関数、演算子、式および述部
1027
第 23 章 期間関数および演算子
PRECEDES
エラー条件
どちらかの式が Period データ タイプまたは日時値式以外の場合、エラーが報告され
ます。
期間式の間での比較ができないとエラーが報告されます。
例
例
period1 および period2 が PERIOD(DATE)列の employee テーブルに対して、次の問
合わせを実行したとします。
SELECT * FROM employee WHERE period1 PRECEDES period2;
ename
period1
period2
Adams
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
Mary
('2005-04-02',
'2006-01-03')
('2005-02-03',
'2006-02-03')
Jones
('2004-01-02',
'2004-03-05')
('2004-03-05',
'2004-10-07')
Randy
('2004-01-02',
'2004-03-05')
('2004-03-07',
'2004-10-07')
Simon
?
('2005-02-03',
'2005-07-27')
結果は以下のようになります。
ename
period1
Jones
('2004-01-02','2004-03-05') ('2004-03-05',
'2004-10-07')
Randy
('2004-01-02','2004-03-05') ('2004-03-07',
'2004-10-07')
period2
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
1028
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
PRECEDES
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
1
Tom
101
DATE'2001-0
1-01'
DATE'200401-01'
DATE'200501-01'
DATE'200601-01'
2
Rick
201
DATE'2005-0
1-01'
DATE'200601-01'
DATE'200101-01'
DATE'200401-01'
3
Joo
301
DATE'2005-0
1-01'
DATE'200601-01'
DATE'200601-01'
DATE'200701-01'
4
Tam
401
DATE'2001-0
1-01'
DATE'200601-01'
DATE'200201-01'
DATE'200401-01'
5
Pat
501
DATE'2005-0
1-01'
DATE'200701-01'
DATE'200601-01'
DATE'200801-01'
6
Jack
601
DATE'2005-0
1-01'
DATE'200701-01'
DATE'200701-01'
DATE'200801-01'
7
Yu
701
DATE'2005-0
1-01'
DATE'200701-01'
DATE'200401-01'
DATE'200501-01'
8
Tim
801
DATE'2005-0
1-01'
DATE'200701-01'
DATE'200501-01'
DATE'200701-01'
次の SQL 文では、PRECEDES を employee テーブルの派生 PERIOD 列で使用してい
ます。
SELECT eid, name, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 PRECEDES jobdur2;
結果は以下のようになります。
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
DATE'200101-01'
DATE'2004-0 DATE'2005- DATE'2006-01
1-01'
01-01'
-01'
No
1
Tom
SQL 関数、演算子、式および述部
101
1029
第 23 章 期間関数および演算子
PRIOR
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
3
Joo
301
DATE'200501-01'
DATE'2006-0 DATE'2006- DATE'2007-01
1-01'
01-01'
-01'
6
Jack
601
DATE'200501-01'
DATE'2007-0 DATE'2007- DATE'2008-01
1-01'
01-01'
-01'
PRIOR
目的
引数の 1 つ前の値(返される値と引数の差が、引数のタイプの最小単位 1 つ分)を返
します。
構文
PRIOR ( datetime_expression )
構文要素
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
戻り値
結果のデータ タイプは、引数のデータ タイプと同じになります。引数の値が NULL
の場合、結果は NULL になります。
フォーマットおよびタイトル
フォーマットは、引数のデータ タイプのデフォルト フォーマットです。
制約事項
ビルトイン関数 DATE は PRIOR 関数に対する引数としてサポートされていません 。
たとえば、PRIOR(DATE)は無効です。代わりに、PRIOR(CURRENT_DATE)を使用す
る必要があります。
1030
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
LDIFF
エラー条件
引数に日時データ タイプがない場合は、エラーが報告されます。
結果が引数のデータ タイプに許容された範囲を超えると、エラーが報告されます。
例えば、PRIOR(DATE '0001-01-01')が指定されると、エラーがレポートされます。
例
period1 が PERIOD(DATE)列の employee テーブルに対して、次の問合わせを実行し
たとします。
SELECT *
FROM employee
WHERE PRIOR(END(period1)) = DATE '2004-03-04';
ename
dept
period1
-----------------------------------------Jones
Sales
('2004-01-02', '2004-03-05')
Simon
Sales
?
結果は以下のようになります。
ename
----Jones
dept
----------Sales
period1
---------------------------('2004-01-02', '2004-03-05')
LDIFF
目的
期間式が重複する場合に第 2 の期間式の開始前に存在する第 1 の期間式の部分を返
します。
期間式が重複しているが第 2 の期間式の開始前に第 1 の期間式の部分がない場合、
または期間式が重複していない場合、関数は NULL を返します。どちらかの期間式
が NULL の場合、LDIFF は NULL を返します。
構文
period_expression
LDIFF
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
SQL 関数、演算子、式および述部
1031
第 23 章 期間関数および演算子
LDIFF
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
結果値
• 例えば、p1 および p2 が比較できる期間式と仮定します。p1 OVERLAPS p2 が
TRUE、BEGIN(p1)が BEGIN(p2)より小さい場合に p1 LIDFF p2 は
PERIOD(BEGIN(p1), BEGIN(p2))を返します。期間式が NULL、p1 OVERLAPS p2
が FALSE、または BEGIN(p1)が BEGIN(p2)より小さくない場合、結果は NULL に
なります。
• 期間式の間で精度が異なる PERIOD(TIME(n) [WITH TIME ZONE])または
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])データ型があると、結果は精度が高
い方になります。期間式のいずれかにタイムゾーンが含まれ、もう 1 つの期間式
に含まれていない場合、結果には各要素のタイムゾーンが含まれています。結果
のタイムゾーンは、次に示すルールを使用して評価されます。
• 両方の期間式に 1 つのタイムゾーンがある場合、結果の境界に含まれるタイム
ゾーンの変位は、後述の Period 値コンストラクタで定義されているように、
式の一致する境界から取得されます。
• どちらか一方の期間式にのみタイムゾーンがある場合、もう一方の期間式は現
在のセッションのタイムゾーンにあるとみなされ、結果は次に示すように計算
されます。
例えば、p1 および p2 が期間 式で、上述のとおりに決定された結果の構成要素のタ
イプが rt だとします。p1 OVERLAPS p2 が TRUE の場合、p1 LDIFF p2 の結果は次
のようになります。
PERIOD(
CASE WHEN CAST(BEGIN(p1) AS rt) < CAST(BEGIN(p2) AS rt)
THEN CAST(BEGIN(p1) AS rt)
ELSE NULL END,
CASE WHEN CAST(BEGIN(p1) AS rt) < CAST(BEGIN(p2) AS rt)
THEN CAST(BEGIN(p2) AS rt)
ELSE NULL END)
内部的には、Period 値は UTC で保存されます。その後で、それらの値の UTC 表示
フォーマットを使用して OVERLAPS 演算子が評価され、重複があると LDIFF 操作が
実行されます。
フォーマットおよびタイトル
フォーマットは結果の Period データ タイプのデフォルト フォーマットです。
エラー条件
どちらかの式が期間式でないとエラーが報告されます。
1032
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
RDIFF
期間式の間での比較ができないとエラーが報告されます。
例
LDIFF は、第 1 の期間式と第 2 の期間式の左側の違いを検出するために使用されま
す。
SELECT ename, period2 LDIFF period1 FROM employee;
period1 および period2 が PERIOD(DATE)列の以下の employee テーブルに対して、
問合わせを実行したとします。
ename
----Adams
Mary
Jones
Randy
Simon
period1
---------------------------('2005-02-03', '2006-02-03')
('2005-04-02', '2006-01-03')
('2004-01-02', '2004-03-05')
('2006-01-02', '2007-03-05')
?
period2
---------------------------('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
('2002-03-05', '2004-10-07')
('2004-03-07', '2005-10-07')
('2005-02-03', '2005-07-27')
結果は以下のようになります。
ename
----Adams
Mary
Jones
Randy
Simon
(period2 LDIFF period1)
---------------------------?
('2005-02-03', '2005-04-02')
('2002-03-05', '2004-01-02')
?
?
RDIFF
目的
期間式の間に重複があるときに、2 番目の期間式の終了より後に存在する 1 番目の
期間式の部分を返します。期間式の間に重複があっても 2 番目の期間式の終了より
後に 1 番目の期間式の部分がない場合や、期間式の間に重複がない場合、RDIFF は
NULL を返します。どちらかの期間式が NULL の場合、RDIFF は NULL を返します。
構文
period_expression
SQL 関数、演算子、式および述部
RDIFF
period_expression
1033
第 23 章 期間関数および演算子
RDIFF
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
結果値
• 例えば、p1 および p2 が比較できる期間式であると仮定します。p1 OVERLAPS
p2 が TRUE、END(p1)が END(p2)より大きい場合、p1 RDIFF p2 は
PERIOD(END(p2), END(p1))を返します。期間式が NULL、p1 OVERLAPS p2 が
FALSE または END(p1)が END(p2)より大きくない場合、結果は NULL となります。
• 期間式の間で精度が異なる PERIOD(TIME(n) [WITH TIME ZONE])または
PERIOD(TIMESTAMP(n) [WITH TIME ZONE])データ型があると、結果は精度が高
い方になります。期間式のいずれかにタイムゾーンが含まれ、もう 1 つの期間式
に含まれていない場合、結果には各要素のタイムゾーンが含まれています。結果
のタイムゾーンは、次に示すルールを使用して評価されます。
• 両方の期間式に 1 つのタイムゾーンがあると、結果の境界に含まれるタイム
ゾーンの変移は、後述の Period 値コンストラクタで定義されているように、
期間式の該当する境界から取得されます。
• どちらか一方の期間式にのみタイムゾーンがある場合、もう一方の期間式は現
在のセッションのタイムゾーンにあるとみなされ、結果は次に示すように計算
されます。
例えば、p1 および p2 が期間式で、上述のとおりに決定された結果の構成要素のタ
イプが rt だとします。p1 OVERLAPS p2 が TRUE の場合、p1 RDIFF p2 の結果は次
のようになります。
PERIOD(
CASE WHEN CAST(END(p1) AS rt) > CAST(END(p2) AS rt)
THEN CAST(END(p2) AS rt)
ELSE NULL END,
CASE WHEN CAST(END(p1) AS rt) > CAST(END(p2) AS rt)
THEN CAST(END(p1) AS rt)
ELSE NULL END)
内部的には、Period 値は UTC で保存されます。その後で、それらの値の UTC 表示
フォーマットを使用して OVERLAPS 演算子が評価され、重複があると RDIFF 操作が
実行されます。
フォーマットおよびタイトル
フォーマットは結果の Period データ タイプのデフォルト フォーマットです。
1034
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
SUCCEEDS
エラー条件
どちらかの式が期間式でないとエラーが報告されます。
期間式の間での比較ができないとエラーが報告されます。
例
RDIFF は、第 1 の期間式と第 2 の期間式の右側の違いを検出するために使用されま
す。
period1 および period2 が PERIOD(DATE)列の以下の employee テーブルに対して、
問合わせを実行したとします。
SELECT ename, period2 RDIFF period1 FROM employee;
ename
period1
period2
----------------------------------------------------------Adams
('2005-02-03', '2006-02-03')
('2005-02-03', '2006-02-03')
Mary
('2005-04-02', '2006-01-03')
('2005-02-03', '2006-02-03')
Jones
('2001-01-02', '2003-03-05')
('2002-03-05', '2004-10-07')
Randy
('2006-01-02', '2007-03-05')
('2004-03-07', '2005-10-07')
Simon
?
('2005-02-03', '2005-07-27')
結果は以下のようになります。
ename
----Adams
Mary
Jones
Randy
Simon
(period2 RDIFF period1)
---------------------------?
('2006-01-03', '2006-02-03')
('2003-03-05', '2004-10-07')
?
?
SUCCEEDS
目的
2 つの期間式、派生 PERIOD、または日時式を TRUE、FALSE、または UNKNOWN
に評価します。
SQL 関数、演算子、式および述部
1035
第 23 章 期間関数および演算子
SUCCEEDS
構文
period_expression
SUCCEEDS
period_expression
datetime_expression
NOT
derived_period
datetime_expression
SUCCEEDS
period_expression
NOT
derived_period
SUCCEEDS
NOT
derived_period
period_expression
構文要素
period_expression
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
datetime_expression
DATE、TIME、または TIMESTAMP 値と評価される式。
derived_period
PERIOD データ型と評価される任意の式。
結果値
• 両方の式に Period データ タイプまたは派生 PERIOD がある場合、第 1 の式の開
始境界が第 2 の式の終了境界より大きいか等しい場合には TRUE を返し、それ以
外の場合は FALSE を返します。
• 第 1 の式が期間式で、第 2 の式が日時式の場合、第 1 の式の開始境界が第 2 の式
より大きい場合は TRUE を返し、それ以外の場合は FALSE を返します。
• 第 1 の式が日時式で、第 2 の式が期間式の場合、日時式が第 2 の式の終了境界よ
り大きいか等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。
• どちらかの式が NULL の場合、演算子は UNKNOWN を返します。
エラー条件
どちらかの式が Period データ タイプまたは日時値式以外の場合、エラーが報告され
ます。
式が比較可能なタイプでない場合、エラーが報告されます。
1036
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
SUCCEEDS
例
例
period1 および period2 が PERIOD(DATE)列の以下の employee テーブルに対して、
問合わせを実行したとします。
SELECT * FROM employee WHERE period2 SUCCEEDS period1;
ename
period1
period2
Adams
('2005-02-03',
'2006-02-03')
('2005-02-03',
'2006-02-03')
Mary
('2005-04-02',
'2006-01-03')
('2005-02-03',
'2006-02-03')
Jones
('2004-01-02',
'2004-03-05')
('2004-03-05',
'2004-10-07')
Randy
('2004-01-02',
'2004-03-05')
('2004-03-07',
'2004-10-07')
Simon
?
('2005-02-03',
'2005-07-27')
結果は以下のようになります。
ename
period1
Jones
('2004-01-02','2004-03-05') ('2004-03-05',
'2004-10-07')
Randy
('2004-01-02','2004-03-05') ('2004-03-07',
'2004-10-07')
period2
例
次の CREATE TABLE 文で作成された employee テーブルで、jobdur1 と jobdur2 が
派生 PERIOD 列であるとします。
CREATE TABLE employee (
eid INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
deptno INTEGER NOT NULL,
jobst1 DATE NOT NULL,
jobend1
DATE NOT NULL,
PERIOD FOR jobdur1(jobst1, jobend1),
jobst2 DATE NOT NULL,
jobend2
DATE NOT NULL,
PERIOD FOR jobdur2(jobst2, jobend2)
) PRIMARY INDEX(eid);
SQL 関数、演算子、式および述部
1037
第 23 章 期間関数および演算子
SUCCEEDS
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
1
Tom
101
DATE'2001- DATE'2004- DATE'200501-01'
01-01'
01-01'
DATE'2006-0
1-01'
2
Rick
201
DATE'2005- DATE'2006- DATE'200101-01'
01-01'
01-01'
DATE'2004-0
1-01'
3
Joo
301
DATE'2005- DATE'2006- DATE'200601-01'
01-01'
01-01'
DATE'2007-0
1-01'
4
Tam
401
DATE'2001- DATE'2006- DATE'200201-01'
01-01'
01-01'
DATE'2004-0
1-01'
5
Pat
501
DATE'2005- DATE'2007- DATE'200601-01'
01-01'
01-01'
DATE'2008-0
1-01'
6
Jack
601
DATE'2005- DATE'2007- DATE'200701-01'
01-01'
01-01'
DATE'2008-0
1-01'
7
Yu
701
DATE'2005- DATE'2007- DATE'200401-01'
01-01'
01-01'
DATE'2005-0
1-01'
8
Tim
801
DATE'2005- DATE'2007- DATE'200501-01'
01-01'
01-01'
DATE'2007-0
1-01'
次の SQL 文では、SUCCEEDS を employee テーブルの派生 PERIOD 列で使用してい
ます。
SELECT eid, name, jobst1, jobend1, jobst2, jobend2
FROM employee
WHERE jobdur1 SUCCEEDS jobdur2;
結果は以下のようになります。
EID
Name
Dept
JobSt1
JobEnd1
JobSt2
JobEnd2
No
1038
2
Rick
201
DATE'2005- DATE'200601-01'
01-01'
DATE'200101-01'
DATE'200401-01'
7
Yu
701
DATE'2005- DATE'200701-01'
01-01'
DATE'200401-01'
DATE'200501-01'
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_NORMALIZE_OVERLAP
TD_NORMALIZE_OVERLAP
目的
すべての関与する行の Period 値から、最古の開始境界と最新の終了境界を含む行を
正規化して、Period 値が重複する行を結合します。
構文
TD_NORMALIZE_OVERLAP
(grouping_column_list, period_column)
TD_SYSFNLIB.
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_NORMALIZE_OVERLAP は埋め込みサービス システム関数です 。
使用上の注意
TD_NORMALIZE_OVERLAP は 2 つの引数を持つテーブル関数です。関数に渡され
る引数は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定さ
れた列であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数
は、各列が UDT の属性である、動的 UDT として指定する必要があります。詳細
については、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、重複する Period 値を見つける必要がある PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要が
あります。
SQL 関数、演算子、式および述部
1039
第 23 章 期間関数および演算子
TD_NORMALIZE_OVERLAP
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。HASH
BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めることはで
きません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があり
ます。
• RETURNS 句の最後に任意の INTEGER 出力列を指定し、正規化された行数を含め
ることができます。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含まれ
ます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_NORMALIZE_OVERLAP の使用
WITH subtbl(flight_id, duration) AS
(SELECT flight_id, duration FROM FlightExp)
SELECT *
FROM TABLE (TD_SYSFNLIB.TD_NORMALIZE_OVERLAP(NEW
VARIANT_TYPE(subtbl.flight_id),
1040
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_NORMALIZE_MEET
subtbl.duration)
RETURNS (flight_id INT, duration PERIOD(TIMESTAMP(6) WITH TIME ZONE),
NrmCount INT)
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, duration, NrmCount) ORDER BY 1,2;
TD_NORMALIZE_MEET
目的
すべての関与する行の Period 値から、最古の開始境界と最新の終了境界を含む行を
正規化して、Period 値が一致する行を結合します。
構文
TD_NORMALIZE_MEET
(grouping_column_list, period_column)
TD_SYSFNLIB.
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_NORMALIZE_MEET は埋め込みサービス システム関数です 。
使用上の注意
TD_NORMALIZE_MEET は 2 つの引数を持つテーブル関数です。関数に渡される引
数は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定された
列であり、以下のようになります。
SQL 関数、演算子、式および述部
1041
第 23 章 期間関数および演算子
TD_NORMALIZE_MEET
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細につ
いては、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、条件を満たす Period 値を見つける必要がある PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要があ
ります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。HASH
BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めることはで
きません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があり
ます。
• RETURNS 句の最後に任意の INTEGER 出力列を指定し、正規化された行数を含め
ることができます。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含まれ
ます。
1042
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_NORMALIZE_OVERLAP_MEET
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_NORMALIZE_MEET の使用
WITH subtbl(flight_id, duration) AS
(SELECT flight_id, duration FROM FlightExp)
SELECT *
FROM TABLE (TD_SYSFNLIB.TD_NORMALIZE_MEET(NEW
VARIANT_TYPE(subtbl.flight_id),
subtbl.duration)
RETURNS (flight_id INT, duration PERIOD(TIMESTAMP(6) WITH TIME ZONE),
NrmCount INT)
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, duration, NrmCount) ORDER BY 1,2;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
TD_NORMALIZE_OVERLAP_MEET
目的
すべての関与する行の Period 値から、最古の開始境界と最新の終了境界を含む行を
正規化して、Period 値が条件を満たすか重複する行を結合します。
構文
TD_NORMALIZE_MEET
(grouping_column_list, period_column)
TD_SYSFNLIB.
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
SQL 関数、演算子、式および述部
1043
第 23 章 期間関数および演算子
TD_NORMALIZE_OVERLAP_MEET
period_column
PERIOD データ型と評価される任意の式。
期間式は、他の式との比較が可能である必要があります。Period データ タイプへの
暗黙的なキャストはサポートされていません。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_NORMALIZE_OVERLAP_MEET は埋め込みサービス システム関数です 。
使用上の注意
TD_NORMALIZE_OVERLAP_MEET は 2 つの引数を持つテーブル関数です。関数に
渡される引数は、WITH 要求修飾子を使用することにより派生するサブテーブルの
指定された列であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細につ
いては、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、重複する、または条件を満たす Period 値を見つける PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要があ
ります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。HASH
BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めることはで
きません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があり
ます。
• RETURNS 句の最後に任意の INTEGER 出力列を指定し、正規化された行数を含め
ることができます。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
1044
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_NORMALIZE_OVERLAP_MEET
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含ま
れます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_NORMALIZE_OVERLAP_MEET の使用
WITH subtbl(flight_id, duration) AS
(SELECT flight_id, duration FROM FlightExp)
SELECT *
FROM TABLE (TD_SYSFNLIB.TD_NORMALIZE_OVERLAP_MEET(NEW
VARIANT_TYPE(subtbl.flight_id),
RETURNS (flight_id INT, duration PERIOD(TIMESTAMP(6) WITH TIME
ZONE), NrmCount
INT)
subtbl.duration)
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, duration, NrmCount) ORDER BY 1,2;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
1045
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_OVERLAP
TD_SUM_NORMALIZE_OVERLAP
目的
Period 値が重複するため正規化された行すべてに対して、列の合計を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
numeric_column
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
データ型が PERIOD(DATE)、PERIOD(TIMESTAMP)または PERIOD(TIMESTAMP
WITH TIME ZONE)の列。
呼出し
TD_SUM_NORMALIZE_OVERLAP は埋め込みサービス システム関数です 。
使用上の注意
TD_SUM_NORMALIZE_OVERLAP は 3 つの引数を持つテーブル関数です。関数に渡
される引数は、WITH 要求修飾子を使用することにより派生するサブテーブルの指
定された列であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細は、
NEW VARIANT_TYPE を参照してください。
• 第 2 引数は、SUM()が要求される数値列です。すべての数値データ タイプがサ
ポートされます。この引数は、列が UDT の属性である動的 UDT として指定する
必要があります。
1046
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_OVERLAP
• 第 3 引数は、重複する Period 値を見つける必要がある PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要が
あります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。
HASH BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めるこ
とはできません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があ
ります。
• 合計結果値を含めるための数値出力列を含める必要があります。この列のデー
タ タイプは、対応する入力列と同じデータ タイプである必要があります。オー
バーフロー エラーの可能性を回避するために、CAST 関数を使用して、入力列の
データ タイプをより大きな数値データ タイプに変換することができます。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含ま
れます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
SQL 関数、演算子、式および述部
1047
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_MEET
例: TD_SUM_NORMALIZE_OVERLAP の使用
WITH subtbl(flight_id, charges, duration) AS
(SELECT flight_id, charges, duration FROM FlightExp)
SELECT *
FROM TABLE (TD_SYSFNLIB.TD_SUM_NORMALIZE_OVERLAP(NEW
VARIANT_TYPE(subtbl.flight_id),
NEW VARIANT_TYPE(subtbl.charges),
subtbl.duration)
RETURNS (flight_id INT, cnt INT, charges FLOAT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id /* input data is redistributed on column, flight_id */
LOCAL ORDER BY flight_id, duration) /* input data is sorted on these
columns */
AS DT(flight_id, charges, duration) ORDER BY 1,3;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
TD_SUM_NORMALIZE_MEET
目的
Period 値が条件を満たすため正規化された行すべてに対して、列の合計を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
numeric_column
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
1048
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_MEET
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_SUM_NORMALIZE_MEET は埋め込みサービス システム関数です 。
使用上の注意
TD_SUM_NORMALIZE_MEET は 3 つの引数を持つテーブル関数です。関数に渡され
る引数は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定さ
れた列であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数
は、各列が UDT の属性である、動的 UDT として指定する必要があります。詳細
は、NEW VARIANT_TYPE を参照してください。
• 第 2 引数は、SUM()が要求される数値列です。すべての数値データ タイプがサ
ポートされます。この引数は、列が UDT の属性である動的 UDT として指定する
必要があります。
• 第 3 引数は、条件を満たす Period 値を見つける必要がある PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要が
あります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。
HASH BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めるこ
とはできません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があ
ります。
• 合計結果値を含めるための数値出力列を含める必要があります。この列のデー
タ タイプは、対応する入力列と同じデータ タイプである必要があります。オー
バーフロー エラーの可能性を回避するために、CAST 関数を使用して、入力列の
データ タイプをより大きな数値データ タイプに変換することができます。
SQL 関数、演算子、式および述部
1049
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_MEET
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含まれ
ます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_SUM_NORMALIZE_MEET の使用
WITH subtbl(flight_id, charges, duration) AS
(SELECT flight_id, charges, duration FROM FlightExp)
SELECT *
FROM TABLE (TD_SYSFNLIB.TD_SUM_NORMALIZE_MEET(NEW
VARIANT_TYPE(subtbl.flight_id),
NEW
VARIANT_TYPE(subtbl.charges),
subtbl.duration)
RETURNS (flight_id INT, charges FLOAT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, charges, duration) ORDER BY 1,3;
1050
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_OVERLAP_MEET
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数「を参照してください。
TD_SUM_NORMALIZE_OVERLAP_MEET
目的
Period 値が条件を満たすか重複するため正規化された行すべてに対して、列の合計
を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
numeric_column
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
呼出し
TD_SUM_NORMALIZE_OVERLAP_MEET は埋め込みサービス システム関数です 。
使用上の注意
TD_SUM_NORMALIZE_OVERLAP_MEET は 3 つの引数を持つテーブル関数です。関
数に渡される引数は、WITH 要求修飾子を使用することにより派生するサブテーブ
ルの指定された列であり、以下のようになります。
SQL 関数、演算子、式および述部
1051
第 23 章 期間関数および演算子
TD_SUM_NORMALIZE_OVERLAP_MEET
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細につ
いては、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、SUM()が要求される数値列です。すべての数値データ タイプがサ
ポートされます。この引数は、列が UDT の属性である動的 UDT として指定する
必要があります。
• 第 3 引数は、重複する、または条件を満たす Period 値を検索する PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要があ
ります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。HASH
BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めることはで
きません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列が、PERIOD 列を含む、入力引数で指定されている列と同じになるように
指定する必要があります。
• 出力列を対応する入力列と同じデータ タイプで、同じ順序で指定する必要があり
ます。
• 合計結果値を含めるための数値出力列を含める必要があります。この列のデー
タ タイプは、対応する入力列と同じデータ タイプである必要があります。オー
バーフロー エラーの可能性を回避するために、CAST 関数を使用して、入力列の
データ タイプをより大きな数値データ タイプに変換することができます。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
例: TD_SUM_NORMALIZE_OVERLAP_MEET の使用
WITH subtbl(flight_id, charges, duration) AS
(SELECT flight_id, charges, duration FROM FlightExp)
SELECT * FROM TABLE (
TD_SYSFNLIB.TD_SUM_NORMALIZE_OVERLAP_MEET(NEW
VARIANT_TYPE(subtbl.flight_id),
NEW
VARIANT_TYPE(subtbl.charges),
subtbl.duration)
1052
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SEQUENCED_SUM
RETURNS (flight_id INT, charges FLOAT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, charges, duration) ORDER BY 1,3;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
TD_SEQUENCED_SUM
目的
Period 値が条件を満たすか重複する正規化された行のすべての隣接した期間に対し
て、列の合計を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
numeric_column
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
SQL 関数、演算子、式および述部
1053
第 23 章 期間関数および演算子
TD_SEQUENCED_SUM
データ型が PERIOD(DATE)、PERIOD(TIMESTAMP)または PERIOD(TIMESTAMP
WITH TIME ZONE)の列。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_SEQUENCED_SUM は埋め込みサービス システム関数です 。
使用上の注意
TD_SEQUENCED_SUM は 3 つの引数を持つテーブル関数です。関数に渡される引数
は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定された列
であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細につ
いては、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、SUM()が要求される数値列です。すべての数値データ タイプがサ
ポートされます。この引数は、列が UDT の属性である動的 UDT として指定する
必要があります。
• 第 3 引数は、重複する、または条件を満たす Period 値を検索する PERIOD 列です。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要があ
ります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。HASH
BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めることはで
きません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列には、すべてのグループ化列を入力列と同じデータ タイプと順序で含める
必要があります。
• 合計結果値を含めるための数値出力列を含める必要があります。この列のデー
タ タイプは、対応する入力列と同じデータ タイプである必要があります。オー
バーフロー エラーの可能性を回避するために、CAST 関数を使用して、入力列の
データ タイプをより大きな数値データ タイプに変換することができます。
• 入力 PERIOD 列と同じ Period データ タイプの PERIOD 列。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
1054
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SEQUENCED_SUM
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含ま
れます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_SEQUENCED_SUM の使用
WITH subtbl(flight_id, charges, duration) AS
(SELECT flight_id, charges, duration FROM FlightExp)
SELECT * FROM TABLE (
TD_SYSFNLIB.TD_SEQUENCED_SUM(NEW VARIANT_TYPE(subtbl.flight_id),
NEW VARIANT_TYPE(subtbl.charges),
subtbl.duration)
RETURNS (flight_id INT, charges FLOAT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id
/* input data is redistributed on column,
flight_id */
LOCAL ORDER BY flight_id, duration)
/* input data is sorted on
these columns */
AS DT(flight_id, charges, duration) ORDER BY 1,3;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
1055
第 23 章 期間関数および演算子
TD_SEQUENCED_AVG
TD_SEQUENCED_AVG
目的
Period 値が条件を満たすか重複する正規化された行のすべての隣接した期間に対し
て、列の平均を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
numeric_column
SUM()が要求される数値列。入力を動的 UDT として指定する必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_SEQUENCED_AVG は埋め込みサービス システム関数です 。
使用上の注意
TD_SEQUENCED_AVG は 3 つの引数を持つテーブル関数です。関数に渡される引数
は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定された列
であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数は、
各列が UDT の属性である、動的 UDT として指定する必要があります。詳細につ
いては、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は AVG()が要求される数値列です。すべての数値データ タイプがサポー
トされます。この引数は、列が UDT の属性である動的 UDT として指定する必要
があります。
• 第 3 引数は、重複する、または条件を満たす Period 値を検索する PERIOD 列です。
1056
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SEQUENCED_AVG
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要が
あります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。
HASH BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めるこ
とはできません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列には、すべてのグループ化列を入力列と同じデータ タイプと順序で含め
る必要があります。
• 数値の出力列を含めて、平均の結果値を格納する必要があります。この列のデー
タ タイプは、FLOAT または対応する入力列と同じデータ タイプにできますが、
結果値が丸められる可能性を回避するために、FLOAT を使用することをお勧め
します。オーバーフロー エラーの可能性を回避するために、CAST 関数を使用し
て、入力列のデータ タイプをより大きな数値データ タイプに変換することがで
きます。
• 入力 PERIOD 列と同じ Period データ タイプの PERIOD 列。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
タイトルは BEGIN(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含ま
れます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
SQL 関数、演算子、式および述部
1057
第 23 章 期間関数および演算子
TD_SEQUENCED_COUNT
例: TD_SEQUENCED_AVG の使用
WITH subtbl(flight_id, charges, duration) AS
(SELECT flight_id, charges, duration FROM FlightExp)
SELECT * FROM TABLE (
TD_SYSFNLIB.TD_SEQUENCED_AVG(NEW VARIANT_TYPE(subtbl.flight_id),
NEW VARIANT_TYPE(subtbl.charges),
subtbl.duration)
RETURNS (flight_id INT, charges FLOAT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id /* input data is redistributed on column, flight_id */
LOCAL ORDER BY flight_id, duration) /* input data is sorted on these
columns */
AS DT(flight_id, charges, duration) ORDER BY 1,3;
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
TD_SEQUENCED_COUNT
目的
Period 値が条件を満たすか重複する正規化された行のすべての隣接した期間に対し
て、列の数を算出します。
構文
構文要素
grouping_column_list
PERIOD 列を含まない、1 つ以上のグループ化列。入力を動的 UDT として指定する
必要があります。
period_column
結果が DATE 値、TIMESTAMP 値、または TIMESTAMP WITH TIME ZONE 値になる
式。
1058
SQL 関数、演算子、式および述部
第 23 章 期間関数および演算子
TD_SEQUENCED_COUNT
TD_SYSFNLIB
関数が格納されているデータベースの名前。
呼出し
TD_SEQUENCED_COUNT は埋め込みサービス システム関数です 。
使用上の注意
TD_SEQUENCED_COUNT は 2 つの引数を持つテーブル関数です。関数に渡される
引数は、WITH 要求修飾子を使用することにより派生するサブテーブルの指定され
た列であり、以下のようになります。
• 第 1 引数は、PERIOD 列を含まない、1 つ以上のグループ化列です。この引数
は、各列が UDT の属性である、動的 UDT として指定する必要があります。詳細
については、「NEW VARIANT_TYPE」を参照してください。
• 第 2 引数は、重複する、または条件を満たす Period 値を見つける PERIOD 列で
す。
テーブル関数への入力は、以下のようにグループ化列でハッシュ再分散され、グルー
プ化列と Period 値別にソートされる列である必要があります。
• グループ化列と PERIOD 列が入力引数で指定されたものと同じ順序で含まれる、
LOCAL ORDER BY 句を指定する必要があります。整列順序は昇順である必要が
あります。
• HASH BY 句にグループ化列のうち少なくとも 1 つを含める必要があります。
HASH BY 句には PERIOD 列、またはグループ化列の一部ではない列を含めるこ
とはできません。
以下のように、出力列を指定する RETURNS 句で関数を呼び出す必要があります。
• 出力列には、すべてのグループ化列を入力列と同じデータ タイプと順序で含め
る必要があります。
• INTEGER の出力列を含めて、カウントの結果を格納する必要があります。
• 入力 PERIOD 列と同じ Period データ タイプの PERIOD 列。
結果
この関数は、以下のように、RETURNS 句で指定した列を含む結果行を返します。
• 入力引数で指定されたグループ化列。
• 正規化された Period 値を含む PERIOD 列。
• Period 値が条件を満たすために正規化された行数を含む任意の INTEGER 列。
フォーマットおよびタイトル
フォーマットは、PERIOD 値式のエレメント タイプのデフォルト フォーマットです。
SQL 関数、演算子、式および述部
1059
第 23 章 期間関数および演算子
TD_SEQUENCED_COUNT
タイトルは(period_value_expression)です。
エラー条件
このテーブル関数は、以下の場合にエラーを返します。
• 関数の呼び出しには、グループ化列と PERIOD 列をすべて含む LOCAL ORDER BY
句は含まれません。
• この関数の呼び出しには、以下のグループ化列の 1 つ以上を含む HASH BY 句は
含まれません。
• HASH BY 句には PERIOD 列、またはグループ化列の一部ではない他の列が含まれ
ます。
• 関数が RETURNS 句なしで呼び出されました。または RETURNS 句で指定された
列が入力列に一致しない、または入力列と同じ順序ではありません。
例: TD_SEQUENCED_COUNT の使用
WITH subtbl(flight_id, duration) AS
(SELECT flight_id, duration FROM FlightExp)
SELECT * FROM TABLE (
TD_SYSFNLIB.TD_SEQUENCED_COUNT(NEW VARIANT_TYPE(subtbl.flight_id),
subtbl.duration)
RETURNS (flight_id INT, cnt INT,
duration PERIOD(TIMESTAMP(6) WITH TIME ZONE))
HASH BY flight_id /* input data is redistributed on column, flight_id */
LOCAL ORDER BY flight_id, duration) /* input
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
1060
SQL 関数、演算子、式および述部
第 24 章
正規表現の関数
概要
この章では、正規表現の関数について説明します。
REGEXP_SUBSTR
目的
regexp_string によって指定される正規表現と一致する副文字列を、source_string
から抽出します。
REGEXP_SUBSTR は 2 個、3 個、4 個または 5 個のパラメータをサポートします。
構文
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字の引数。
source_string が NULL の場合は NULL が返されます。
regexp_string
文字の引数。
regexp_string が NULL の場合は NULL が返されます。
SQL 関数、演算子、式および述部
1061
第 24 章 正規表現の関数
REGEXP_SUBSTR
position_arg
数値引数。
position_arg は source_string 内の、検索が開始される位置を指定します(デフォルト
は 1)。
position_arg が入力文字列より長い場合は NULL が返されます。
position_arg が NULL の場合、値 NULL が使用されます。position_arg が指定されて
いない場合は、デフォルト(1)が使用されます。
occurrence_arg
数値引数。
返される出現回数を指定します(デフォルトは 1)。例えば、occurrence_arg が 2 の
場合、関数は source_string 内の最初のオカレンスと一致し、次に source_string 内
の最初のオカレンスに続く文字から、source_string 内の 2 番目のオカレンスの検索
を開始します。
occurrence_arg が見つかった一致数より大きい場合は NULL が返されます。
occurrence_arg が NULL の場合は、NULL の結果が返されます。occurrence_arg を
省略すると、デフォルト値(1)が使用されます。
match_arg
文字の引数。
有効な値は、次のとおりです。
• 'i' =大文字と小文字を区別しない一致。
• 'c' =大文字と小文字を区別する一致。
• 'n' =ピリオド(任意の文字と一致)は改行文字と一致できます。
• 'm' = source_string は単一行ではなく、複数行として扱われます。このオプショ
ンを指定すると、'^'および'$'文字が source_string 全体ではなく、source_string
内の各行に適用されます。
• 'l' = source_string が source_string の現在の最大許可サイズ(現在は 16 MB)を超
えた場合に、エラーではなく NULL を返します。これは長時間実行する問合わせ
で、問合わせが失敗することになる長い文字列を使用したくない場合に役立ちま
す。
• 'x' = 空白を無視します。
引数は複数の文字を含みます。引数の文字が有効でない場合、文字は無視されます。
match_arg が未指定、または NULL、空の場合:
• 大文字と小文字を区別する一致。
• ピリオドは改行文字と一致しません。
• source_string は単一行として扱われます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
1062
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_SUBSTR
呼出し
REGEXP_SUBSTR は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
•
source_string = CHAR、VARCHAR、または CLOB
regexp_string = CHAR または VARCHAR
position_arg = NUMBER
occurrence_arg = NUMBER
match_arg = VARCHAR
source_string 最大サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイズ
は 32000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイ
ズは 64000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、ソースの最大サイズは
16MB です。
regexp_string 最大パターン文字列サイズ:
• パラメータが Latin の CHAR または VARCHAR の場合、最大 regexp_string サイ
ズは 32000 バイトです。
• パラメータが Unicode の CHAR または VARCHAR の場合、最大 regexp_string サ
イズは 32000 バイトです。
• パラメータが Latin の CLOB の場合、最大 regexp_string サイズは 30000 バイト
です。
• パラメータが Unicode の CLOB の場合、最大 regexp_string サイズは 30000 バ
イトです。
最大戻り文字列サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、返される文字列の最
大サイズは 16000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、返される文字列の
最大サイズは 16000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、返される文字列の最大
サイズは 16MB です。
このサイズを越えると、REGEXP_SUBSTR はエラーを返します(match_arg = 'l'が指
定されていない場合。指定されている場合は NULL を返します)。
x 一致オプションは空白を無視します。デフォルトでは、空白はそれ自体に一致し
ます。
SQL 関数、演算子、式および述部
1063
第 24 章 正規表現の関数
REGEXP_SUBSTR
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
REGEXP_SUBSTR は、関数に渡された source_string 入力パラメータに関連付けられ
たデータ型によって戻り値のデータ型が異なるスカラー関数です。
source_string が次の場合:
• CHAR および VARCHAR の場合は、source_string と同じ文字セットで VARCHAR
を返します。
• CLOB の場合は、source_string と同じ文字セットで CLOB を返します。
例
例
以下の問合わせを実行します。
SELECT REGEXP_SUBSTR('mint chocolate chip', 'ch(i|o)p', 1, 1, 'c');
'chip'を返します。
例
以下の問合わせを実行します。
SELECT REGEXP_SUBSTR('mint chocolate chip chop', ' ch(i|o)p', 1, 2,
'i');
これは一致の 2 番目のオカレンスなので、'chop'を返します。
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
1064
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_REPLACE
REGEXP_REPLACE
目的
source_string の regexp_string に一致する部分を replace_string で置換します。
REGEXP_SUBSTR は 2 個、3 個、4 個、5 個または 6 個のパラメータをサポートし
ます。
構文
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字の引数。
source_string が NULL の場合は NULL が返されます。
regexp_string
文字の引数。
regexp_string が NULL の場合、元の文字列が返されます。
replace_string
文字の引数。
replace_string が指定されていないか、NULL または空の文字列の場合は、一致が結
果から削除されます。
replace_string の最大後方参照数は 9(\9 など)です。replace_string の 9 を超える後
方参照は、後方参照とみなされます。
position_arg
数値引数。
position_arg は source_string 内の、検索が開始される位置を指定します(デフォル
トは 1)。
position_arg が入力文字列より長い場合は、なにも置き換えられず、source_string
が返されます。
SQL 関数、演算子、式および述部
1065
第 24 章 正規表現の関数
REGEXP_REPLACE
position_arg が NULL の場合、NULL が使用されます。position_arg が指定されてい
ない場合は、デフォルト(1)が使用されます。
occurrence_arg
数値引数。
occurrence_arg は、オカレンスを指定して、一致が replace_string に置換されるよ
うにします。
• 値 0 を指定すると、すべての発生箇所が置き換えられます。
• 値が 1 を超えると、regexp_string の最初のオカレンスに続く最初の文字から、2
番目のオカレンスの検索が開始します。
occurrence_arg が見つかった一致数より大きい場合は、置換は実行されず、
source_string が返されます。
occurrence_arg が NULL の場合は、NULL の結果が返されます。occurrence_arg を
省略すると、デフォルト値(1)が使用されます。
match_arg
文字の引数。
有効な値は、次のとおりです。
• 'i' =大文字と小文字を区別しない一致。
• 'c' =大文字と小文字を区別する一致。
• 'n' =ピリオド(任意の文字と一致)は改行文字と一致できます。
• 'm' = source_string は単一行ではなく、複数行として扱われます。このオプショ
ンを指定すると、'^'および'$'文字が source_string 全体ではなく、source_string
内の各行に適用されます。
• 'l' = source_string が source_string の現在の最大許可サイズ(現在は 16 MB)を超
えた場合に、エラーではなく NULL を返します。これは長時間実行する問合わせ
で、問合わせが失敗することになる長い文字列を使用したくない場合に役立ちま
す。
• 'x' = 空白を無視します。
引数は複数の文字を含みます。引数の文字が有効でない場合、文字は無視されます。
match_arg が未指定、または NULL、空の場合:
• 大文字と小文字を区別する一致。
• ピリオドは改行文字と一致しません。
• source_string は単一行として扱われます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
REGEXP_REPLACE は埋め込みサービス システム関数です 。
1066
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_REPLACE
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
•
•
source_string = CHAR、VARCHAR、または CLOB
regexp_string = CHAR または VARCHAR
replace_string = CHAR、VARCHAR CLOB
position_arg = NUMBER
occurrence_arg = NUMBER
match_arg = VARCHAR
source_string 最大サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイズ
は 32000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイ
ズは 64000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、ソースの最大サイズは
16MB です。
regexp_string 最大パターン文字列サイズ:
• パラメータが Latin の CHAR または VARCHAR の場合、最大 regexp_string サイ
ズは 16000 バイトです。
• パラメータが Unicode の CHAR または VARCHAR の場合、最大 regexp_string サ
イズは 16000 バイトです。
• パラメータが Latin または Unicode の CLOB の場合、最大 regexp_string サイズ
は 30000 バイトです。
最大置換文字列サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、置換文字列の最大サ
イズは 16000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、置換文字列の最大
サイズは 16000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、置換文字列の最大サイ
ズは 30000 バイトです。
最大戻り文字列サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、返される文字列の最
大サイズは 16000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、返される文字列の
最大サイズは 16000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、返される文字列の最大
サイズは 16MB です。
このサイズを越えると、この関数はエラーを返します(match_arg = 'l'が指定されて
いない場合。指定されている場合は元の文字列を返します)。
position_arg を省略すると、デフォルト値(1)が使用されます。
SQL 関数、演算子、式および述部
1067
第 24 章 正規表現の関数
REGEXP_REPLACE
置換文字列の最大後方参照数は、9(例: \9)です。置換文字列の 9 を超える後方参照
は、後方参照とみなされません。
x 一致オプションは空白を無視します。デフォルトでは、空白はそれ自体に一致しま
す。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
REGEXP_REPLACE は、関数に渡された source_string 入力パラメータに関連付けら
れたデータ型によって戻り値のデータ型が異なるスカラー関数です。
source_string が次の場合:
• CHAR および VARCHAR の場合は、source_string と同じ文字セットで VARCHAR
を返します。
• CLOB の場合は、source_string と同じ文字セットで CLOB を返します。
例
例
以下の問合わせを実行します。
SELECT REGEXP_REPLACE('Hello World World', '(world)$', 'My', 1, 1, 'i');
結果として"Hello World My"を返します。
例
以下の問合わせを実行します。
SELECT REGEXP_REPLACE('Friday is the best day of the week.', 'of the
week', 'EVER', 1, 1, 'c');
結果として'Friday is the best day EVER'を返します。
例
以下の問合わせを実行します。
SELECT REGEXP_REPLACE('Hello Santa says ho ho', 'ho', 'HO!', 1, 2, 'c');
結果として'Hello Santa says ho HO!'を返します。
1068
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_INSTR
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
REGEXP_INSTR
目的
source_string から regexp_string との一致を検索します。
REGEXP_INSTR は 2 個、3 個、4 個、5 個または 6 個のパラメータをサポートしま
す。
構文
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字の引数。
source_string が NULL の場合は NULL が返されます。
regexp_string
文字の引数。
regexp_string が NULL の場合は NULL が返されます。
position_arg
数値引数。
position_arg は source_string 内の、検索が開始される位置を指定します(デフォル
トは 1)。
position_arg が入力文字列より長い場合はゼロが返されます。
SQL 関数、演算子、式および述部
1069
第 24 章 正規表現の関数
REGEXP_INSTR
position_arg が NULL の場合、NULL が使用されます。position_arg が指定されてい
ない場合は、デフォルト(1)が使用されます。
occurrence_arg
数値引数。
返されるオカレンスの数を指定します。例えば、occurrence_arg が 2 の場合、関数
は source_string 内の最初のオカレンスと一致し、次に source_string 内の最初のオ
カレンスに続く文字から、source_string 内の 2 番目のオカレンスの検索を開始しま
す。
occurrence_arg が一致の検出数より大きい場合はゼロが返されます。
occurrence_arg が NULL の場合は、NULL の結果が返されます。occurrence_arg を
省略すると、デフォルト値(1)が使用されます。
return_opt
数値引数。
有効な値は、次のとおりです。
• 0 =関数により、一致の開始位置が返されます(デフォルト)。
• 1 = 関数により、一致の終了位置(オカレンスの後ろの文字)が返されます。
この構文要素が NULL の場合、NULL が返されます。構文要素を省略した場合は、
デフォルト値(0)の値が使用されます。
match_arg
文字の引数。
有効な値は、次のとおりです。
• 'i' =大文字と小文字を区別しない一致。
• 'c' =大文字と小文字を区別する一致。
• 'n' =ピリオド(任意の文字と一致)は改行文字と一致できます。
• 'm' = source_string は単一行ではなく、複数行として扱われます。このオプショ
ンを指定すると、'^'および'$'文字が source_string 全体ではなく、source_string
内の各行に適用されます。
• 'l' = source_string が source_string の現在の最大許可サイズ(現在は 16 MB)を超
えた場合に、エラーではなく NULL を返します。これは長時間実行する問合わせ
で、問合わせが失敗することになる長い文字列を使用したくない場合に役立ちま
す。
• 'x' = 空白を無視します。
引数は複数の文字を含みます。引数の文字が有効でない場合、文字は無視されます。
match_arg が未指定、または NULL、空の場合:
• 大文字と小文字を区別する一致。
• ピリオドは改行文字と一致しません。
• source_string は単一行として扱われます。
match_arg が NULL の場合、NULL が使用されます。match_arg を省略すると、0 が
使用されます。
1070
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_INSTR
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
REGEXP_INSTR は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
•
•
source_string = CHAR、VARCHAR、または CLOB
regexp_string = CHAR または VARCHAR
position_arg = NUMBER
occurrence_arg = NUMBER
return_opt = NUMBER
match_arg = VARCHAR
source_string 最大サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイズ
は 32000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイ
ズは 64000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、ソースの最大サイズは
16MB です。
regexp_string 最大パターン文字列サイズ:
• パラメータが Latin の CHAR または VARCHAR の場合、最大 regexp_string サイ
ズは 32000 バイトです。
• パラメータが Unicode の CHAR または VARCHAR の場合、最大 regexp_string サ
イズは 32000 バイトです。
• パラメータが Latin の CLOB の場合、最大 regexp_string サイズは 30000 バイト
です。
• パラメータが Unicode の CLOB の場合、最大 regexp_string サイズは 60000 バ
イトです。
最大戻り文字列サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、返される文字列の最
大サイズは 16000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、返される文字列の
最大サイズは 16000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、返される文字列の最大
サイズは 16MB です。
SQL 関数、演算子、式および述部
1071
第 24 章 正規表現の関数
REGEXP_INSTR
このサイズを越える場合、match_arg = 'l'が指定されていない限り、この関数はエ
ラーを返します。これが指定されている場合は、エラーの代わりに NULL を返します。
x 一致オプションは空白を無視します。デフォルトでは、空白はそれ自体に一致しま
す。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
REGEXP_INSTR はスカラー関数であり、戻りデータ タイプは次のようになります。
• source_string が CHAR または VARCHAR の場合は、INTEGER
• source_string が CLOB の場合は、BIGINT
例
例
以下の問合わせを実行します。
SELECT REGEXP_INSTR('Hello Santa says ho ho','Hello Santa says ho ho',
1, 1, 1, 'c');
これは、結果として 23 を返します。
例
以下の問合わせを実行します。
SELECT REGEXP_INSTR('Hello Santa says ho ho', 'Hello Santa says ho ho',
1, 1, 0, 'c');
これは、結果として 1 を返します。
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
1072
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_SIMILAR
REGEXP_SIMILAR
目的
source_string を regexp_string と比較して、整数値を返します。
REGEXP_SIMILAR は 2 個または 3 個のパラメータをサポートします。
構文
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字の引数。
source_string が NULL の場合は NULL が返されます。
regexp_string
文字の引数。
regexp_string が NULL の場合は NULL が返されます。
match_arg
文字の引数。
有効な値は、次のとおりです。
• 'i' =大文字と小文字を区別しない一致。
• 'c' =大文字と小文字を区別する一致。
• 'n' =ピリオド(任意の文字と一致)は改行文字と一致できます。
• 'm' = source_string は単一行ではなく、複数行として扱われます。このオプショ
ンを指定すると、'^'および'$'文字が source_string 全体ではなく、source_string
内の各行に適用されます。
• 'l' = source_string が source_string の現在の最大許可サイズ(現在は 16 MB)を超
えた場合に、エラーではなく NULL を返します。これは長時間実行する問合わせ
で、問合わせが失敗することになる長い文字列を使用したくない場合に役立ちま
す。
• 'x' = 空白を無視します。
引数は複数の文字を含みます。引数の文字が有効でない場合、文字は無視されます。
match_arg が未指定、または NULL、空の場合:
• 大文字と小文字を区別する一致。
• ピリオドは改行文字と一致しません。
SQL 関数、演算子、式および述部
1073
第 24 章 正規表現の関数
REGEXP_SIMILAR
• source_string は単一行として扱われます。
match_arg が存在しないか、NULL または空の場合、デフォルトの('c')が使用されま
す。match_arg に無効な文字が含まれている場合にもデフォルトが使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
REGEXP_SIMILAR は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• source_string = CHAR、VARCHAR、CLOB
• regexp_string = CHAR、VARCHAR
• match_arg = VARCHAR
source_string 最大サイズ:
• Latin の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイズ
は 32000 バイトです。
• Unicode の CHAR または VARCHAR であるパラメータの場合、ソースの最大サイ
ズは 64000 バイトです。
• Latin または Unicode の CLOB であるパラメータの場合、ソースの最大サイズは
16MB です。
regexp_string 最大パターン文字列サイズ:
• パラメータが Latin の CHAR または VARCHAR の場合、最大 regexp_string サイ
ズは 32000 バイトです。
• パラメータが Unicode の CHAR または VARCHAR の場合、最大 regexp_string サ
イズは 32000 バイトです。
• パラメータが Latin の CLOB の場合、最大 regexp_string サイズは 30000 バイト
です。
• パラメータが Unicode の CLOB の場合、最大 regexp_string サイズは 60000 バイ
トです。
このサイズを越える場合、match_arg = 'l'が指定されていない限り、この関数はエ
ラーを返します。これが指定されている場合は、エラーの代わりに NULL を返します。
x 一致オプションは空白を無視します。デフォルトでは、空白はそれ自体に一致しま
す。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
1074
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_SPLIT_TO_TABLE
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
REGEXP_SIMILAR はスカラー関数であり、戻りデータ タイプは整数値で、次のよ
うになります。
• 文字列全部が regexp_arg と一致する場合は 1 (真)。
• 文字列全部が regexp_arg と一致しない場合は 0 (偽)。
例
以下の問合わせを実行します。
SELECT name FROM customers WHERE REGEXP_SIMILAR(name, '(Mike B(i|y)rd)|
(Michael B(i|y)rd)', 'c') = 1;
次の名前と一致する名前を customers テーブルから返します。
•
•
•
•
'Mike Bird'
'Mike Byrd'
'Michael Bird'
'Michael Byrd'
一致は大文字と小文字を区別します。
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービ
ス システム関数 」を参照してください。
REGEXP_SPLIT_TO_TABLE
目的
regexp_string を区切り文字として使用し、source_string を文字列のテーブルに分
割します。
構文
SQL 関数、演算子、式および述部
1075
第 24 章 正規表現の関数
REGEXP_SPLIT_TO_TABLE
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
inkey
出力結果セットの source_string を一意に識別する数値または文字列の引数。
inkey が NULL の場合は、空の文字列が返されます。
source_string
文字の引数。
この構文要素が NULL の場合、0 行が返されます。source_string が空の文字列であ
る場合にもゼロ行が返されます。
regexp_string
文字の引数。
この構文要素が NULL の場合、元の source_string が返されます。
match_arg
文字の引数。
有効な値は、次のとおりです。
• 'i' =大文字と小文字を区別しない一致。
• 'c' =大文字と小文字を区別する一致。
• 'n' = ピリオド(任意の文字と一致)は改行文字と一致できます
• 'm' = source_string は単一行ではなく、複数行として扱われます。このオプショ
ンを指定すると、'^'および'$'文字が source_string 全体ではなく、source_string
内の各行に適用されます。
• 'l' = source_string が source_string の現在の最大許可サイズ(現在は 16MB)を超え
た場合に、エラーではなく NULL が返されます。これは長時間実行する問合わせ
で、問合わせが失敗することになる長い文字列を使用したくない場合に役立ちま
す。最大 source_string サイズは 16MB ですが、結果として生成されるトークン
は VARCHAR のみが可能で、最大戻りトークンサイズは 64000 バイトです。
match_arg が指定されていない場合はエラーが返されます。
一致がない場合は、元の source_string が返されます。
outkey
inkey の値。
token_ndx
入力文字列でのトークンの序数位置。
token
文字の引数。
1076
SQL 関数、演算子、式および述部
第 24 章 正規表現の関数
REGEXP_SPLIT_TO_TABLE
入力文字列から得た token は、instring と同じ文字セットになります。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
REGEXP_SPLIT_TO_TABLE は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
inkey = NUMERIC, VARCHAR
source_string = CHAR、VARCHAR、CLOB
regexp_str ing = CHAR, VARCHAR
match_arg = VARCHAR
このサイズを越える場合、または match_arg = 'l'が指定されている場合、この関数
はエラーを返します。
inkey が null の場合は空の文字列が返されます。
x 一致オプションは空白を無視します。デフォルトでは、空白はそれ自体に一致し
ます。
Teradata Database で OREPLACE 呼び出し中に定数が第 2、第 3 パラメータとして
渡されると、第 1 引数の文字型が Unicode として渡され、戻り値の型が VARCHAR
の oreplace_unicode()が Unicode 文字セットで呼び出されます。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
結果の行タイプは以下のようになります。
• outkey = NUMERIC, VARCHAR
• token_ndx = INTEGER
• token = VARCHAR
SQL 関数、演算子、式および述部
1077
第 24 章 正規表現の関数
REGEXP_SPLIT_TO_TABLE
例
SELECT 文の例:
SELECT * from table(regexp_split_to_table
('phonemaker','Apple&Microsoft&Google','&','c')
returns (outkey varchar(30), token_ndx integer, token varchar(100))) as
t1;
次の行があるテーブルを返します。
outkey
token_ndx
------------------------------ ---------------p h o n e
m a k e r
1
p h o n e
m a k e r
2
p h o n e
m a k e r
3
token
----------------------A p p l e
M i c r o s o f t
G o o g l e
結果のタイプ
結果の行タイプは以下のようになります。
• outkey = NUMERIC, VARCHAR
• token_ndx = INTEGER
• token = VARCHAR
1078
SQL 関数、演算子、式および述部
第 25 章
集合演算子
概要
SQL 集合演算子は、各個別問合わせの結果を単一の結果セットに結合することに
よって、2 つ以上の問合わせ結果セットを操作します。
Teradata SQL 集合演算子
Teradata SQL は、次の算術演算子をサポートします。
集合演算子
関数
INTERSECT
個々の SELECT 文により生成された答えのうち共通する結果の行を戻し
ます。
MINUS /
EXCEPT
結果は、最初の SELECT で戻された行から 2 番目の SELECT で戻された
行を引いた行になります。
MINUS は EXCEPT と同じです。
UNION
2 つの SELECT 文の結果を組み合わせします。
集合演算子は問合わせ式の中で使用されます。問合わせ式とは、集合演算子
INTERSECT、MINUS/EXCEPT、UNION によって組み合わせた問合わせの集合を指
します。
query_term の構文
SELECT
statement
(query_expression )
SELECT 文
SELECT 文。
詳細は、< SQL データ操作言語、B035-1146>を参照してください。
query_expression
集合演算子、他の式、および ORDER BY 句を含むまたは含まない式。
SQL 関数、演算子、式および述部
1079
第 25 章 集合演算子
概要
query_factor の構文
query_factor
query_expression
query_factor
UNION
MINUS
ALL
( query_expression )
ordering
EXCEPT
INTERSECT
すべての答えに共通する結果の行を戻す集合演算子。
ALL
任意選択のキーワードであり、重複行が戻されることを許可します。
query_expression の構文
構文
query_factor
query_expression
query_factor
UNION
MINUS
ALL
( query_expression )
ordering
EXCEPT
ordering
,
ORDER BY
expression
ASC
DESC
NULLS FIRST
NULLS LAST
UNION、MINUS、EXCEPT
複数の問合わせまたは副問合わせをどのように組み合わせて、戻す必要のある結果
の行を決定するかを指定する集合演算子。
ALL
重複行を返すことを許可します。
ORDER BY
戻される結果の行を並べ替えるための ORDER BY 句。
expression
結果として戻される行の整列順序を決定するために、ORDER BY 句で使用される式。
ASC
結果が昇順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、昇順で整列します。
デフォルトの順序は ASC です。
1080
SQL 関数、演算子、式および述部
第 25 章 集合演算子
集合演算子のルール
DESC
結果が降順で整列されます。
整列フィールドが文字列の場合、システムは現在のセッションの照合順序の定義に
従って、降順で整列します。
NULLS FIRST
NULL 結果が最初にリストされることを指定します。
NULLS LAST
NULL 結果が最後にリストされることを指定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡
張機能が含まれています。
関連トピック
詳細は、以下を参照してください。
• 詳細は、< SQL データ操作言語、B035-1146>を参照してください。
• 例については、「ALL オプションの使用による重複行の保存」を参照してくださ
い。
集合演算子のルール
重複行
デフォルトでは、重複行は戻されません。
重複行が戻されるようにするには、ALL オプションを指定します。
集合演算子をサポートする操作
集合演算子は、次のような演算の中で使用できます。
• 単純な問合わせ
• 派生テーブル
注: HASH BY 句または LOCAL ORDER BY 句は、集合演算子による派生テーブル
では使用できません。
• SUBQUERY
• INSERT … SELECT 句
SQL 関数、演算子、式および述部
1081
第 25 章 集合演算子
集合演算子のルール
• ビュー定義
集合演算子によって結合された複数の SELECT 文には、SELECT の通常の句オプショ
ンを含めることができます。ただし、WITH 句を除きます。
SELECT AND CONSUME 文
集合演算子は、SELECT AND CONSUME 文には作用しません。
ORDER BY 句のサポート
問合わせ式には、ORDER BY 指定を 1 つだけ、末尾に含めることができます。
集合演算に関与するデータ タイプに対する制限事項
以下の制限事項が、集合演算に関与する CLOB、BLOB、および UDT タイプに対して
適用されます。
データ タ 制約事項
イプ
BLOB
CLOB または BLOB タイプに集合演算子を使用することはできません。
CLOB
UDT
• 集合演算に複数の UDT が関与する場合、それらは同一型でなければなりま
せん。これは、Teradata Database が集合演算に関与する UDT に対して暗黙
型変換を行なわないためです。
この制限事項に対する対処策としては、CREATE CAST を使用して、UDT ど
うしの間でキャストを行なう CAST を定義してから、集合演算内で明示的に
CAST 関数を呼び出します。
• 集合演算に関与する UDT では、順序付けが定義されていなければなりません。
Teradata Database は、ソース タイプが LOB でない DISTINCT 型 UDT の順
序付け機能を生成します。STRUCTURED 型 UDT またはソース タイプが LOB
である DISTINCT 型 UDT の順序付け定義を作成するときや、システム生成の
順序付け機能を置き換えるときは、CREATE ORDERING を使用します。
CREATE CAST と CREATE ORDERING の詳細は、<SQL データ定義言語 - 構文規
則および例、B035-1144>を参照してください。
関連トピック
詳細は、以下を参照してください。
• 例については、「ALL オプションの使用による重複行の保存」を参照してくださ
い。
1082
SQL 関数、演算子、式および述部
第 25 章 集合演算子
集合演算子の優先順位
集合演算子の優先順位
集合演算子の処理の優先順位は、以下のとおりです。
1 INTERSECT
2 UNION および MINUS/EXCEPT
括弧によって別の順序が明示的に指定されていないかぎり、集合演算子は左から右
に評価されます。
例: SELECT 文
次の問合わせについて説明します。
SELECT statement_1
UNION
SELECT statement_2
EXCEPT
SELECT statement_3
INTERSECT
SELECT statement_4;
操作は、次の順序で行なわれます。
1. statement_3 と statement_4 の結果の論理積をとる。
2. statement_1 と statement_2 の結果の論理和をとる。
3. 論理和から、論理積の行を差し引く。
優先順位をカスタマイズするための括弧の使用
優先順位をオーバーライドするには、括弧を使用します。括弧内の操作が最初に実
行されます。
たとえば、次の形式を考えてみましょう。
( ( SELECT statement_1
UNION
SELECT statement_2 )
EXCEPT
( SELECT statement_3
UNION
SELECT statement_4 )
)
EXCEPT
SELECT statement_5
INTERSECT
SELECT statement_6;
SQL 関数、演算子、式および述部
1083
第 25 章 集合演算子
ALL オプションの使用による重複行の保存
上の例の操作上の優先順位を、以下のリストで説明します。
1 SELECT statement_1 と SELECT statement_2 の論理和をとる。
2 SELECT statement_3 と SELECT statement_4 の論理和をとる。
3 2 番目の UNION の結果を、最初の UNION の結果から差し引く。
4 SELECT statement_5 と SELECT statement_6 の論理積をとる。
5 UNION 操作の残りから、INTERSECT の結果を差し引く。
関連トピック
詳細は、以下を参照してください。
• 最初の SELECT 文の文字タイプの長さが、結果セットにどのように影響するかを
示す例については、「集合結果の属性」を参照してください。
• 最初の SELECT 文の数値データ型が、結果セットにどのように影響するかを示す
例については、「例: SELECT 文の順序がデータ型に与える影響」を参照してくだ
さい。
• 例については、「例: SELECT 文の順序がデータ型に及ぼす影響」を参照してくだ
さい。
• 詳細については、「query_expression の構文」を参照してください。
ALL オプションの使用による重複行の保存
ALL オプションを使用しないかぎり、最終結果から重複行が除外されます。ALL オ
プションは、それが適用される結果セットの重複する行を保存します。
例
次の問合わせは、以下を最後として含めて、各結果セットごとに重複行を戻します。
SELECT statement_1
UNION ALL
SELECT statement_2
MINUS ALL
SELECT statement_3
INTERSECT ALL
SELECT statement_4
1084
SQL 関数、演算子、式および述部
第 25 章 集合演算子
集合結果の属性
集合結果の属性
最初の SELECT 文に含まれていたデータ タイプ、標題、書式の句が、最終結果に現
われるデータ タイプ、標題、書式の情報を決定します。
問合わせの中の他のすべての SELECT 文の属性は無視されます。
例
例
SELECT level, param, 'GMKSA' (TITLE 'OWNER')
FROM gmksa
WHERE cycle = '03'
UNION
SELECT level, param, 'GMKSA CONTROL'
FROM gmksa_control
WHERE cycle = '03'
ORDER BY 1, 2;
この問合わせは、次の結果集合を戻します。
***QUERY COMPLETED. 5 ROWS FOUND. 3 COLUMNS RETURNED.
LEVEL PARAM OWNER
----- ----- ----00
A
GMKSA
00
T
GMKSA
85
X
GMKSA
SF
A
GMKSA
SF
T
GMKSA
最初の SELECT は CHAR(5)である GMKSA を指定しているので、そのデータ タイプ
は 2 番目の SELECT でも有効になります。結果として、最初の 5 文字が同じである
ため、GMKSA_CONTROL 登録項は除外されます。
この問合わせは ALL オプションを指定していないので、重複した行は除外されます。
例
次の問合わせでは、SELECT の順序が反対です。
SELECT level, param 'GMKSA CONTROL' (TITLE 'OWNER')
FROM gmksa_control
WHERE cycle = '03'
UNION
SELECT level, param, 'GMKSA'
FROM gmksa
SQL 関数、演算子、式および述部
1085
第 25 章 集合演算子
集合結果の属性
WHERE cycle = '03'
ORDER BY 1, 2;
この問合わせは、次の結果を戻します。
***QUERY COMPLETED.10 ROWS FOUND. 3 COLUMNS RETURNED.
LEVEL
PARAM
OWNER
--------------------00
A
GMKSA
00
A
GMKSA CONTROL
00
T
GMKSA
00
T
GMKSA CONTROL
85
X
GMKSA
85
X
GMKSA CONTROL
SF
A
GMKSA
SF
A
GMKSA CONTROL
SF
T
GMKSA
SF
T
GMKSA CONTROL
この場合、最初の SELECT が'GMKSA CONTROL'を指しているので、行は重複とはみ
なされず、結果集合に組み込まれます。
例
この例は、不完全な形式の問合わせの結果が切り捨てられる可能性を示しています。
SELECT level, param, 'GMKSA
' (TITLE 'OWNER')
FROM gmksa
WHERE cycle = '03'
UNION
SELECT level, param,'GMKSA CONTROL'
FROM gmksa_control
WHERE cycle = '03'
ORDER BY 1, 2;
この問合わせは、次の結果を戻します。
***QUERY COMPLETED.10 ROWS FOUND. 3 COLUMNS RETURNED.
LEVEL
PARAM
OWNER
-------------------00
A
GMKSA
00
A
GMKSA CONTRO
00
T
GMKSA
00
T
GMKSA CONTRO
85
X
GMKSA
85
X
GMKSA CONTRO
SF
A
GMKSA
SF
A
GMKSA CONTRO
1086
SQL 関数、演算子、式および述部
第 25 章 集合演算子
派生テーブルでの集合演算子
SF
SF
T
T
GMKSA
GMKSA CONTRO
この問合わせは、予想したとおりの行を戻しました。ただし、最初の SELECT での
名前の指定方法のために、切り捨てが行なわれています。
問合わせの文字セットを決定する方法の例
最初の SELECT 文に含まれる式の文字セットによって、問合わせ全体の文字セット
が決まります。次の例の場合、<char_expression_1> の文字セットが問合わせ全体
の文字セットとして使用されます。
SELECT <char_expression_1> FROM <table_1>
UNION
SELECT <char_expression_2> FROM <table_2>;
<char_expression_1>の文字セットに含まれていない文字が<char_expression_2> に
含まれている場合は、エラーになることがあります。
例えば、<char_expression_1> が CHARACTER SET LATIN であるのに、
<char_expression_2> が CHARACTER SET UNICODE である場合、
<char_expression_2> を UNICODE から LATIN にコード変換しようとすると、
<char_expression_2>にマルチバイト文字がある場合には、エラーになります。
派生テーブルでの集合演算子
派生テーブルは、次の例で示すように、集合演算子をサポートします。
例
SELECT x1
FROM table_1,
(SELECT x2
FROM table_2
UNION
SELECT x3
FROM table_3
) derived_table;
SELECT x1,y1
FROM table_1,
(SELECT *
FROM table_2) derived_table(column_1, column_2)
WHERE column_2 = 1 ;
SQL 関数、演算子、式および述部
1087
第 25 章 集合演算子
SUBQUERY での集合演算子
制約事項
HASH BY 句または LOCAL ORDER BY 句は、集合演算子による派生テーブルでは使
用できません。次の例はエラーを返します。
例
テーブル関数"add2int"は、入力として 2 つの整数値を取り、それら両方の値と合計
を返します。
CREATE TABLE t1 (a1 INTEGER, b1 INTEGER);
CREATE TABLE t2 (a2 INTEGER, b2 INTEGER);
REPLACE FUNCTION add2int
(a INTEGER,
b INTEGER)
RETURNS TABLE
(addend1 INTEGER,
addend2 INTEGER,
mysum INTEGER)
SPECIFIC add2int
LANGUAGE C
NO SQL
PARAMETER STYLE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL NAME 'CS!add3int!add2int.c';
/* Query Q1 */
WITH dt(a1, b1) AS
( SELECT a1, b1
FROM t1
UNION ALL
SELECT a2, b2
FROM t2
)
SELECT *
FROM TABLE (add2int(dt.a1, dt.b1)
HASH BY b1
LOCAL ORDER BY b1) tf;
SUBQUERY での集合演算子
集合演算子は副問合わせ内で使用することができます。次に、その正しい使い方の
例を示します。
1088
SQL 関数、演算子、式および述部
第 25 章 集合演算子
SUBQUERY での集合演算子
例
例
SELECT x1
FROM table_1
WHERE (x1,y1) IN
(SELECT * FROM table_2
UNION
SELECT * FROM table_3);
例
SELECT *
FROM table_1
WHERE table_1.x1 IN
(SELECT x2
FROM table_2
UNION
(SELECT x3
FROM table_3
UNION
SELECT x4
FROM table_4));
例
SELECT *
FROM table_1
WHERE x1 IN
(SELECT SUM(x2)
FROM table_2
UNION
SELECT x3
FROM table_3);
例
SELECT *
FROM table_1
WHERE x1 IN
(SELECT MAX(x2)
FROM table_2
UNION
SELECT MIN(x3)
FROM table_3);
SQL 関数、演算子、式および述部
1089
第 25 章 集合演算子
INSERT … SELECT 文での集合演算子
例
SELECT *
FROM table_1
WHERE X1 IN
(SELECT x2 FROM table_2
UNION
SELECT x3 FROM table_3
UNION
SELECT x4 FROM table_4);
例
SELECT x1
FROM table_1
WHERE x1 IN ANY
(SELECT x2 FROM table_2
INTERSECT
SELECT x3 FROM table_3
MINUS
SELECT x4 FROM table_4);
例
UPDATE table_1
SET x1=1
WHERE table_1.x1 IN
(SELECT x2
FROM table_2
UNION
SELECT x3
FROM table_3
UNION
SELECT x4
FROM table_4);
INSERT … SELECT 文での集合演算子
集合演算子は INSERT … SELECT 文で許可されています。次に、その正しい使い方
の例を示します。
1090
SQL 関数、演算子、式および述部
第 25 章 集合演算子
ビュー定義における集合演算子
例: 集合演算子を使った単純な INSERT … SELECT
INSERT table1 (x1,y1)
SELECT *
FROM table_2
UNION
SELECT x3,y3
FROM table_3;
例: 集合演算子を使用するビューからの INSERT … SELECT
REPLACE VIEW v AS
SELECT *
FROM table_1
UNION
SELECT *
FROM table_2;
INSERT table_3(x3,y3)
SELECT *
FROM v;
例: 集合演算子を使用する派生テーブルからの INSERT … SELECT
INSERT table_1
SELECT *
FROM
(SELECT x2,y2
FROM table_2
UNION
SELECT *
FROM table_3 DerivedTable
);
ビュー定義における集合演算子
集合演算子をビュー定義の中で使用することができます。
たとえば、次の REPLACE VIEW 文は、ビュー定義の中で UNION を使用しています。
REPLACE VIEW view_1 AS
SELECT x1,y1
FROM table_1
UNION
SQL 関数、演算子、式および述部
1091
第 25 章 集合演算子
ビュー定義における集合演算子
SELECT x2,y2
FROM table_2;
GROUP BY 句のサポート
GROUP BY は、集合演算子と共にビュー内で使用することができます。
制約事項
次の制限は、集合演算子を指定するビュー定義に適用されます。
• UPDATE、DELETE、および INSERT は、適切ではありません。次の例は、成功し
ません。
REPLACE VIEW V AS
SELECT X
FROM TABLE_1
UNION
SELECT Y FROM
TABLE_1;
UPDATE V
SET X=0;
この文のシーケンスを実行しようとすると、次のエラー メッセージが表示されま
す。
***Failure 3823 VIEW 'v' may not be used for Help Index/
Constraint/Statistics, Update, Delete or Insert.
• WITH CHECK OPTION は、適切ではありません。次の例は、成功しません。
REPLACE VIEW ERRV( c ) AS
SELECT *
FROM TABLE_1
UNION
SELECT *
FROM TABLE_2
WHERE TABLE_2.X=2 WITH CHECK OPTION;
この文を実行しようとすると、次のエラー メッセージが表示されます。
***Failure 3847 Illegal use of a WITH clause.
• 列レベルの権限は許可されません。次の例は、成功しません。
GRANT UPDATE ( c ) ON TABLE_VIEW TO USER_NAME;
この文を実行しようとすると、次のエラー メッセージが表示されます。
1092
SQL 関数、演算子、式および述部
第 25 章 集合演算子
ビュー定義における集合演算子
***Failure 3499: GRANT cannot be used on views with set operators.
• 集合演算子を使用するビュー定義では ORDER BY 句を指定できませんが、ビュー
で適用される SELECT 文では ORDER BY を使用できます。
例
例1
REPLACE VIEW v AS
SELECT x1
FROM TABLE_1
UNION
SELECT x2
FROM TABLE_2
UNION;
SELECT x3
FROM TABLE_3;
SELECT * FROM v;
例2
REPLACE VIEW view_2 AS
SELECT *
FROM view_1
UNION
SELECT *
FROM table_3
UNION
SELECT *
FROM table_4;
SELECT *
FROM view_2
ORDER BY 1,2;
例3
REPLACE VIEW v AS
SELECT x1
FROM table_1
WHERE x1 IN
(SELECT x2
FROM table_2
UNION
SELECT x3
SQL 関数、演算子、式および述部
1093
第 25 章 集合演算子
集合演算子によって結合された問合わせ
FROM table_3
);
SELECT * FROM v;
関連トピック
詳細は、以下を参照してください。
• ORDER BY を使用できるビューに適用される SELECT 文については、「GROUP BY
および ORDER BY 句」を参照してください。
• ビュー内で集合演算子と併用できる GROUP BY については、「GROUP BY および
ORDER BY 句」を参照してください。
集合演算子によって結合された問合わせ
集合演算子を含む SELECT 文には、他では適用されない一定の規則と制限が適用さ
れます。
SELECT 文内の式の数
すべての SELECT 文には、同じ数の式がなければなりません。
最初の SELECT 文に式が 3 つある場合、後続のすべての SELECT 文にも式が 3 つな
ければなりません。
存在しない式のためのプレースホルダーとして、SELECT 文の中で NULL の式を使用
することができます。
次の例では、2 番目の式が null です。
SELECT EmpNo, NULL (CHAR(5))
FROM Employee;
WITH 句
WITH 句は、集合演算子によって結合された SELECT 文に使用することはできません。
GROUP BY および ORDER BY 句
GROUP BY 句は、問合わせ式の個々の SELECT 文で使用できますが、その SELECT
文にだけ適用され、結果セットには適用されません。
ORDER BY 句は、問合わせ式の最後の SELECT 文にだけ使用することができ、結果
セットの順序を指定します。
1094
SQL 関数、演算子、式および述部
第 25 章 集合演算子
集合演算子によって結合された問合わせ
ORDER BY 句には、数値リテラルだけを含めることができます。
たとえば、結果セット内の最初の列で順序付けるには、ORDER BY 1 と指定します。
集合演算子を含むビュー定義では GROUP BY を使用できますが、ORDER BY は使用
できません。集合演算子と共にビュー定義に適用された SELECT 文では、GROUP BY
と ORDER BY を使用できます。ビュー定義の中でのこれらの演算子の正しい使い方
を、次の例に示します。
REPLACE VIEW v AS
SELECT x1,y1
FROM table1
UNION
SELECT x2,y2
FROM table2;
SELECT *
FROM v
ORDER BY 1;
SELECT SUM(x1), y1
FROM v
GROUP BY 2;
GROUP BY 演算子を UNION された SELECT にそれぞれ適用することもできます。
次の例は、その方法を示しています。
REPLACE VIEW v(column_1,column_2) AS
SELECT MIN(x1),y1
FROM table_1
GROUP BY 2
UNION ALL
SELECT MIN(x2),y2
FROM table_2
GROUP BY 2
UNION ALL
SELECT x3,y3 FROM table_3;
SELECT SUM(v.column_1) (NAMED sum_c1),column_2
GROUP BY 2
ORDER BY 2;
SELECT *
FROM table_1
WHERE (x1,y1) IN
(SELECT SUM(x2), y2
FROM table_2
SQL 関数、演算子、式および述部
1095
第 25 章 集合演算子
集合演算子によって結合された問合わせ
GROUP BY 2
UNION
SELECT SUM(x3), y3
FROM table_3
GROUP BY 2
);
SELECT 文内のテーブル名
同じテーブルを参照する SELECT 文の場合でも、データを参照するテーブルを各
SELECT 文ごとに指定しなければなりません。
データ タイプの互換性
各 SELECT 文の中の対応するフィールドのデータ型には互換性が必要です。たとえ
ば、最初の SELECT 文の最初のフィールドが文字のデータ型の場合、後続の各 SELECT
文の最初のフィールドも、文字のデータ型でなければなりません。
対応する数値型は同じである必要はありませんが、互換性がなければなりません。
たとえば、1 つの SELECT 文の中のフィールドを INTEGER として定義し、別の
SELECT 文の対応するフィールドを SMALLINT として定義できます。
最初の SELECT 文のデータ タイプによって、結果セットの対応する列のデータ タイ
プが決まります。
以下の表は、データ タイプの互換性の詳細をまとめたものです。
データ タイプ
詳細
文字
最初の SELECT 文の文字型では、結果セットの文字列の長さが決
定されます。そのため、最初の SELECT 文の文字型の長さが後続
の SELECT 文の対応する文字型の長さより短い場合に、結果セッ
トの文字列で切り捨てが行なわれることがあります。
最初の SELECT 文に含まれる式の文字セットによって、問合わせ
全体の文字セットが決まります。
数値
1096
最初の SELECT 文の数値タイプにより、結果セットの数値タイプ
のサイズが決定されます。後続の SELECT 文の対応するすべての
数値フィールドが、最初の SELECT 文の数値データ タイプに変換
されます。このため、最初の SELECT 文の数値タイプのサイズが
後続の SELECT 文の対応する数値タイプのサイズより小さい場合
は、数値のオーバーフロー エラーが発生することがあります。ま
た、後続の文によって返される値は、より小さいデータ タイプに
は適合しません。
SQL 関数、演算子、式および述部
第 25 章 集合演算子
INTERSECT 演算子
データ タイプ
詳細
TIME
TIMESTAMP
PERIOD(TIME)
PERIOD(TIMESTAMP)
最初の SELECT 文の TIME、TIMESTAMP、PERIOD(TIME)、およ
び PERIOD(TIMESTAMP)型により、結果セット内の対応する行の
精度が決定されます。後続の SELECT 文の対応するすべてのフィー
ルドが、最初の SELECT 文のデータ型に暗黙的に変換されます。
対応するフィールドにタイムゾーンがなく 、最初の SELECT 文の
データ型にタイムゾーンがある場合、タイムゾーンは、現在のセッ
ションのタイムゾーンの変位に設定されます。対応するフィール
ドの精度が最初の SELECT 文のデータ型の精度より低い場合は、
必要に応じて小数桁にゼロが追加されます。後続の SELECT 文の
対応するフィールドの精度が、最初の SELECT 文のデータ型の精
度より高い場合は、エラーが報告されます。
関連トピック
詳細は、以下を参照してください。
• 最初の SELECT 文の文字タイプの長さが、結果セットにどのように影響するかを
示す例については、「集合結果の属性」を参照してください。
• 最初の SELECT 文の数値データ型が、結果セットにどのように影響するかを示す
例については、「例 6: SELECT 文の順序がデータ型に与える影響」を参照してく
ださい。
• 最初の SELECT 文に含まれる式の文字セットによって、問合わせ全体の文字セッ
トが決まります。詳細については、「問合わせの文字セットを決定する方法の
例」を参照してください。
INTERSECT 演算子
目的
両方の問合わせの結果に共通する行だけを戻します。
構文
query_expression_1
INTERSECT
query_expression_2
ALL
構文要素
query_expression_1
query_expression_2 と INTERSECT される完全な SELECT 文を指定します。
詳細については、「query_factor の構文」を参照してください。
SQL 関数、演算子、式および述部
1097
第 25 章 集合演算子
INTERSECT 演算子
ALL
重複行を返すことを許可します。
query_expression_2
query_expression_1.と INTERSECT される完全な SELECT 文を指定します。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
INTERSECT の規則
INTERSECT の使用の際に、以下の規則が適用されます。
• 単純な問合わせで INTERSECT を使用する以外に、以下の操作において INTERSECT
を使用できます。
• 派生テーブル
HASH BY 句または LOCAL ORDER BY 句は、集合演算子による派生テーブルで
は使用できません。
• SUBQUERY
• INSERT … SELECT 文
• ビュー定義
• INTERSECT によって結合される各問合わせが実行されて、行の集合から成る 1 つ
の結果が作成されます。INTERSECT 演算では、各 SELECT 文の各テーブルに同数
の列が含まれなければなりません(正式には、同じ程度でなければなりません)。
また、それらの列のデータ タイプに互換性がなければなりません。
• 以下のものの中では INTERSECT を使用できません。
• SELECT AND CONSUME 文
• WITH RECURSIVE 句
• CREATE RECURSIVE VIEW 文
集合結果の属性
論理積における最初の SELECT 文に含まれていたデータ タイプ、標題、書式の句が、
最終結果に現われるデータ タイプ、標題、書式の情報を決定します。
問合わせの中の他のすべての SELECT 文の属性は無視されます。
NULL のデータ タイプ
論理積演算で明示的に NULL を指定した場合、そのデータ タイプは INTEGER にな
ります。UNION 演算子を使用するこの指針の例が、「5: UNION のデータ型に対す
る明示 NULL の影響」に示されています。
1098
SQL 関数、演算子、式および述部
第 25 章 集合演算子
MINUS/EXCEPT 演算子
一方、NULL として定義された列データは、値およびデータ タイプを持たず、スカ
ラー式内の他の NULL と同様に評価されます。
重複行の取り扱い
ALL オプションを使用しないかぎり、最終結果から重複行が除外されます。
ALL オプションを指定した場合、重複行は残されます。ALL オプションは、複文の
問合わせで使用される INTERSECT 演算子の数だけ、指定することができます。
例
たとえば、2 つのテーブルが次の行を含んでいるとします。
SPart テーブル
SLocation テーブル
SuppNo
PartNo
SuppNo
SuppLoc
100
P2
100
London
101
P1
101
London
102
P1
102
Toronto
103
P2
103
Tokyo
次に、PartNo が P1 である部品を供給する業者で、SuppLoc が London である業者
の SuppNo を選択するには、次の要求を使用します。
SELECT SuppNo FROM SLocation
WHERE SuppLoc = 'London'
INTERSECT
SELECT SuppNo FROM SPart
WHERE PartNo = 'P1';
この要求の結果は、次のとおりです。
SuppNo
-----101
MINUS/EXCEPT 演算子
目的
query_expression_1 には表示されるが、query_expression_2 には表示されない結果
行を返します。
SQL 関数、演算子、式および述部
1099
第 25 章 集合演算子
MINUS/EXCEPT 演算子
構文
query_expression_1
MINUS
EXCEPT
query_expression_2
ALL
構文要素
query_expression_1
query_expression_2 によって MINUS される結果テーブルをもつ完全な SELECT 文
を指定します。
ALL
重複行を返すことを許可します。
query_expression_2
query_expression_1 から MINUS する完全な SELECT 文を指定します。
ANSI への準拠
この文は、ANSI SQL:2011 に準拠していますが、非 ANSI の Teradata Database 拡張
機能が含まれています。
使用上の注意
単純な問合わせ以外では、以下の操作において MINUS または EXCEPT を使用するこ
とができます。
• 派生テーブル
注: HASH BY 句または LOCAL ORDER BY 句は、集合演算子による派生テーブル
では使用できません。
• SUBQUERY
• INSERT … SELECT 文
• ビュー定義
以下の操作の中では MINUS および EXCEPT を使用できません。
• SELECT AND CONSUME 文
• WITH RECURSIVE 句
• CREATE RECURSIVE VIEW 文
MINUS または EXCEPT によって結合される各問合わせが実行され、行の集合から成
る 1 つの結果が作成されます。MINUS または EXCEPT 演算では、各 SELECT 文の各
テーブルに同数の列が含まれなければなりません(正式には、同じ程度でなければな
りません)。また、それらの列のデータ タイプに互換性がなければなりません。これ
で、すべての結果セットが単一の結果セットに結合されます。また、その組み合わ
1100
SQL 関数、演算子、式および述部
第 25 章 集合演算子
UNION 演算子
せされた結果セットは、MINUS または EXCEPT 演算の中の最初の SELECT 文に指定
された列のデータ型を持ちます。
MINUS/EXCEPT と NULL
EXCEPT 演算で明示的に NULL を指定した場合、そのデータ タイプは INTEGER に
なります。UNION 演算子を使用するこの指針の例が、「5: UNION のデータ型に対
する明示 NULL の影響」に示されています。
一方、NULL として定義された列データは、値およびデータ タイプを持たず、スカ
ラー式内の他の NULL と同様に評価されます。
重複行
ALL オプションを使用しないかぎり、最終結果から重複行が除外されます。
ALL オプションを指定した場合、重複行は残されます。ALL オプションは、複文の
問合わせで使用される MINUS 演算子の数だけ、指定することができます。
UNION 演算子
目的
2 つ以上の SELECT 結果のテーブルを、単一の結果に組み合わせします。
構文
query_expression_1
UNION
query_expression_2
ALL
構文要素
query_expression_1
query_expression_2 によって MINUS される結果テーブルをもつ完全な SELECT 文
を指定します。
詳細については、「query_expression の構文」を参照してください。
ALL
重複行は保存されます。
query_expression_2
query_expression_1 から MINUS する完全な SELECT 文を指定します。
SQL 関数、演算子、式および述部
1101
第 25 章 集合演算子
UNION 演算子
ANSI への準拠
この文は、ANSI SQL:2011 に準拠しています。
有効な UNION 演算
単純な問合わせ以外では、次の操作において UNION を使用することができます。
• 派生テーブル
注: HASH BY 句または LOCAL ORDER BY 句は、集合演算子による派生テーブル
では使用できません。
• SUBQUERY
• INSERT … SELECT 文
• 非再帰の CREATE VIEW 文
再帰的問合わせを定義する WITH RECURSIVE 句または CREATE RECURSIVE VIEW
文の中で有効な集合演算子は、UNION ALL のみです。
サポートされない演算子
以下のものの中では UNION を使用できません。
• SELECT AND CONSUME 文
• WITH RECURSIVE 句(ALL オプションが指定されていない場合)
• CREATE RECURSIVE VIEW 文(ALL オプションが指定されていない場合)
UNION 演算の説明
UNION によって結合されている各問合わせが実行されて、行の集合から成る 1 つの
結果が作成されます。UNION 演算では、各 SELECT 文の各テーブルに同数の列が含
まれていなければなりません(正式には、同じ程度でなければなりません)。また、そ
れらの列のデータ タイプに互換性がなければなりません。これで、すべての結果セッ
トが単一の結果セットに組み合わせされます。結合後の結果セットのデータ型は、
UNION 中の最初の SELECT 文に指定された列のデータ型になります。
UNION と NULL
UNION 演算で明示的に NULL を指定した場合、そのデータ タイプは INTEGER にな
ります。例については、「例 5: UNION のデータ型に対する明示 NULL の影響」を
参照してください。
一方、NULL として定義された列データは、値およびデータ タイプを持たず、スカ
ラー式内の他の NULL と同様に評価されます。
1102
SQL 関数、演算子、式および述部
第 25 章 集合演算子
UNION 演算子
重複行
ALL オプションを使用しないかぎり、重複行は、各結果セットと最終結果セットか
ら除外されます。
ALL オプションを使用した場合には、適用された結果セットに重複行が残されます。
ALL オプションを問合わせ内の各 UNION 演算子に指定すれば、最終結果にすべて
の重複行を残すことができます。
予期しない行の長さのエラーの理由: UNION での行の整列
Teradata Database では、UNION 演算で重複を検査するために整列操作を実行する
前に、整列キーが作成され、整列する行に付加されます。この一時データ構造の長
さがシステム制限の 64 KB バイトを超えると操作は失敗し、要求元にエラーが戻さ
れます。表示されるメッセージは、状況に応じて以下のいずれかとなります。
• A data row is too long(データ行が長すぎます)。
• Maximum row length exceeded in database_object_name
(database_object_name において行の最大長を超えました)。
これらのメッセージについては、<メッセージ、B035-1096>を参照してください。
例
例1
プロジェクト OE1-0001 に割り当てられた従業員の名前と、そのプロジェクト名、
それに費やされた時間数、プロジェクトに割り当てられていない従業員の名前を選
択するには、次の問合わせを使用します。
SELECT Name, Proj_Id, Hours
FROM Employee,Charges
WHERE Employee.Empno = Charges.Empno
AND Proj_Id IN ('OE1-0001')
UNION
SELECT Name, NULL (CHAR (8)), NULL (DECIMAL (4,2))
FROM Employee
WHERE Empno NOT IN
(SELECT Empno
FROM Charges);
この問合わせは、次の行を戻します。
Name
Project Id
Hours
Aguilar J
?
?
Brandle B
?
?
SQL 関数、演算子、式および述部
1103
第 25 章 集合演算子
UNION 演算子
Name
Project Id
Hours
Chin M
?
Clements D
?
?
Marston A
?
?
Phan A
?
?
Regan R
?
?
Russell S
?
?
Inglis C
0E1-0001
30.0
Inglis C
0E1-001
30.5
Leidner P
0E1-001
10.5
Leidner P
0E1-001
23.0
Moffit H
0E1-001
12.0
Moffit H
0E1-001
35.5
Kemper R
Smith T
Watson L
この例では、2 番目の SELECT 文の列 2 と列 3 で、null の式が使用されています。
この null の式は位置のマーカーとして使用されているので、この問合わせの両方の
SELECT 文が同じ数の式を持つことになります。
例2
部門番号 500 と 600 のすべての従業員の部門番号と名前を知るには、UNION 演算
子を次のように使用します。
SELECT DeptNo,
FROM Employee
WHERE DeptNo =
UNION
SELECT DeptNo,
FROM Employee
WHERE DeptNo =
Name
500
Name
600 ;
この問合わせは、次の行を戻します。
1104
DeptNo
Name
500
Carter J
SQL 関数、演算子、式および述部
第 25 章 集合演算子
UNION 演算子
DeptNo
Name
500
Inglis C
500
Marston A
500
Omura H
500
Reed C
500
Smith T
500
Watson L
600
Aguilar J
600
Kemper R
600
Newman P
600
Regan R
この同じ結果は、次のような単純な問合わせでも生成できますが、
SELECT Name, DeptNo
FROM Employee
WHERE (DeptNo = 500)
OR (DeptNo = 600);
UNION 演算子を使用して問合わせを定式化することの利点として、DeptNo 列が
Employee テーブルの基本索引である場合、UNION 演算子を使用することによって
基本選択が基本キー操作になることが保証される、という点があります。OR 演算
を使用する問合わせが基本索引を使用する保証はありません。
例3
さらに、複数のテーブルから取得した値のリストをまとめる場合も、UNION 演算子
が役に立ちます。
たとえば、部門番号 500 と 600 が独自の Employee テーブルを持つ場合、次の問
合わせを使用して、2 つの異なるテーブルからデータを選択し、そのデータを単一
のリストにまとめることができます。
SELECT Name, DeptNo
FROM Employee_dept_500
UNION
SELECT Name, DeptNo
FROM Employee_dept_600 ;
例4
プロジェクトに携わっている従業員一人当たりの工数を求めると想定します。さら
に、プロジェクトに携わっていない従業員の名前も結果に含めるとします。
SQL 関数、演算子、式および述部
1105
第 25 章 集合演算子
UNION 演算子
そのためには、次の例のような合併の操作を実行しなければなりません。
SELECT Name, Proj_Id, Hours
FROM Employee, Charges
WHERE Employee.EmpNo = Charges.EmpNo
UNION
SELECT Name, Null (CHAR(8)), Null (DECIMAL(4,2)),
FROM Employee
WHERE EmpNo NOT IN
(SELECT EmpNo
FROM Charges
)
UNION
SELECT Null (VARCHAR(12)), Proj_Id, Hours
FROM Charges
WHERE EmpNo NOT IN
(SELECT EmpNo
FROM Employee
);
文の最初の部分で、Employee テーブルと Charges テーブルを EmpNo の列で結合し
ます。2 番目の部分で、Employee テーブルにリストされているが、Charges テーブ
ルにはリストされていない従業員を求めます。3 番目の部分で、Charges テーブルに
はリストされているが、Employee テーブルにはリストされていない従業員を求めま
す。これにより、要求された情報がすべて応答に含まれます。
UNION 演算子と外部結合
「例 4」は、外部結合を示しているわけではありません。この操作は、結合条件で一
致がある結合テーブルのすべての行、および一致のない"左"結合テーブルまたは"右"
結合テーブル、あるいは両方のテーブルからの行を返します。さらに、一致しない
行は NULL で拡張されます。
ただし、内部結合と UNION 演算子を使用して外部結合を実行することができます
が、2 つの内部結合を合併したものは外部結合ではありません。
2 つの内部結合と UNION 演算子を使用して外部結合を実行する例を次に示します。
2 番目の内部結合における NULL 値の使用法に注意する必要があります。
SELECT Offering.CourseNo, Offerings.Location, Enrollment.EmpNo
FROM Offerings, Enrollment
WHERE Offerings.CourseNo = Enrollment.CourseNo
UNION
SELECT Offerings.CourseNo, Offerings.Location, NULL
FROM Offerings, Enrollment
WHERE Offerings.CourseNo <> Enrollment.CourseNo;
1106
SQL 関数、演算子、式および述部
第 25 章 集合演算子
UNION 演算子
上記の UNION 演算は、上に示した左外部結合の例と同じ次のような結果を戻します。
O.CourseNo
O.Location
E.EmpNo
C100
El Segundo
235
C100
El Segundo
668
C200
Dayton
?
C400
El Segundo
?
例 5: UNION のデータ型に対する明示 NULL の影響
集合演算子の結果によって、操作中に最初の SELECT 文で定義される列のデータ型
が評価されます。最初の SELECT 文にある列が明示 NULL として定義される場合、
結果のデータ タイプは直感的には認識されません。
次に、直感的には同一結果を評価すると思われるが、そうではない 2 つの例を示し
ます。
最初に、明示 NULL が列値として選択されます。
SELECT 'p', NULL
FROM TableVM
UNION
SELECT 'q', 145.87
FROM TableVM;
BTEQ は以下の結果を戻します。
'p'
--p
q
Null
----------?
145
Null 列の第 2 行に対する予期値は、予期した値、つまり 10 進値 145.87 とは異な
る可能性があります。
合併の 2 つの SELECT の順序が逆になると、
SELECT 'q', 145.87
FROM TableVM
UNION
SELECT 'p', NULL
FROM TableVM;
BTEQ は以下の結果を戻します。
'q'
---
145.87
-----------
SQL 関数、演算子、式および述部
1107
第 25 章 集合演算子
UNION 演算子
p
q
?
145.87
q の値は、 真のデータ タイプ(DECIMAL)として報告されます。このとき切り捨ては
行なわれません。なぜ、この違いがあるのでしょう。
最初の合併の例では、明示 NULL は最初の SELECT 文の第 2 列に指定されます。第
2SELECT 文の第 2 列は、DECIMAL 数として指定されますが、整数に評価します。
これは、このコンテキスト内で、NULL は値を持ちませんが、データ型 INTEGER を
持ち、その型が合併の結果に保存されるからです。
第 2 の合併の例では、値 145.87 のデータ タイプ(DECIMAL)が結果を指定します。
次の SELECT 文を実行して、NULL および 145.87 の変換されないデータ タイプを
確認することができます。
SELECT TYPE(NULL), TYPE(145.87)
BTEQ は以下の結果を戻します。
Type(Null)
----------------INTEGER
Type(145.87)
---------------------DECIMAL(5,2)
例 6: SELECT 文の順序がデータ型に及ぼす影響
UNION の結果は常に、最初の SELECT の選択値のデータ型を使って表現されます。
これはつまり、SELECT A UNION SELECT B は必ずしも、SELECT B UNION SELECT
A と同じ結果を戻すとは限らないということです。ただし、どちらのケースでも同
じ結果が戻されるよう、明示的に出力データ タイプを変換する場合は別です。
次の複雑な UNION を使った問合わせについて考えてみましょう。
SELECT MIN(X8.i1)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1=X1.i1
AND X8.i1 IN
(SELECT COUNT(*)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1=X1.i1
AND X8.i1 = ANY
(SELECT COUNT(*)
FROM t7 X7
WHERE X7.i1 = ANY
(SELECT AVG(X1.i1)
FROM t1 X1)))
UNION
SELECT AVG(X4.i1)
FROM t4 X4
1108
SQL 関数、演算子、式および述部
第 25 章 集合演算子
UNION 演算子
WHERE X4.i1 = ANY
(SELECT (X8.i1)
FROM t1 X1
RIGHT JOIN t8 X8 ON X8.i1=X1.i1
AND X8.i1 = IN
(SELECT MAX(X8.i1)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1=X1.i1
AND
(SELECT (X4.i1)
FROM t6 X6
RIGHT JOIN t4 X4 ON X6.i1=i1))));
結果は以下のように報告されます。
Minimum(i1)
-----------2
0
直感的には、UNION の両側の問合わせの順序を入れ替えても、同じ結果を生成する
はずだと思えるかもしれません。最初の SELECT の選択値のデータ タイプが異なる
場合があるので、必ずしもそのようにはなりません。同じデータベースにおける次
の問合わせがそのことを例示しています。
SELECT AVG(X4.i1)
FROM t4 X4
WHERE X4.i1 = ANY
(SELECT (X8.i1)
FROM t1 X1
RIGHT JOIN t8 X8 ON X8.i1 = X1.i1
AND X8.i1 = ANY
(SELECT MAX(X8.i1)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1 = X1.i1
AND
(SELECT (X4.i1)
FROM t6 X6
RIGHT JOIN t4 X4 ON X6.i1 = i
)
)
)
UNION
SELECT MIN(X8.i1)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1 = X1.i1
SQL 関数、演算子、式および述部
1109
第 25 章 集合演算子
UNION 演算子
AND X8.i1 IN
(SELECT COUNT(*)
FROM t8 X8
LEFT JOIN t1 X1 ON X8.i1 = X1.i1
AND X8.i1 = ANY
(SELECT COUNT(*)
FROM t7 X7
WHERE X7.i1 = ANY
(SELECT AVG(X1.i1)
FROM t1 X1
)
);
結果は以下のように報告されます。
Average(i1)
-----------2
1
実際の平均は< 0.5 です。UNION の中の SELECT の順序を逆にすると違いが生じる
のはなぜでしょうか?一見矛盾した結果が生じる理由が、次の表に説明されています。
最初の SELECT が指定する関数
結果のデータ タイプ
結果として戻される値
AVG
REAL
1
MIN
INTEGER
0 に切り捨てられる
関連トピック
詳細は、以下を参照してください。
• 例については、「例 6: SELECT 文の順序がデータ型に及ぼす影響」を参照してく
ださい。
1110
SQL 関数、演算子、式および述部
第 26 章
文字列演算子と関数
概要
この章では、文字列演算子と文字列関数について説明します。
文字列関数について
SQL には、文字列に対して変換、連結、および他の操作を行なうための連結演算子
と各種文字列関数があります。
この章で説明されている関数は、主に文字列の処理用に設計されています。その多
くはバイト、数値リテラル、およびリテラルの各データ列も処理できるため、この
章で「文字列」という用語を用いる場合、これら 3 つのデータ型ファミリーも指し
ている場合が少なくありません。
文字列関数の操作対象になるデータ タイプ
次の表は、文字列として処理可能なすべてのデータ タイプを列挙しています。これ
らのすべてのタイプがすべての関数に受け入れられるわけではないことに注意する
必要があります。処理可能なタイプについては、各関数を参照してください。
データ タイプ グループ
文字
バイト
数値
• CHARACTER
• BYTE
• BYTEINT
• VARCHAR
• VARBYTE
• DECIMAL
• CLOB
• BLOB
• FLOAT
• INTEGER
• NUMERIC
• SMALLINT
Teradata SQL 文字列関数に相当する ANSI の文字列関数
Teradata SQL 文字列関数のいくつかは、ANSI SQL:2011 規格の拡張機能です。
ANSI との互換性を維持するために、ANSI の等価関数があれば、Teradata SQL 文字
列関数ではなく、それを使用してください。
SQL 関数、演算子、式および述部
1111
第 26 章 文字列演算子と関数
文字列関数へのサーバー文字セットの影響
変更する Teradata 文字列関数
新規アプリケーションで使用する ANSI 文字列
関数
INDEX
POSITION
MINDEX†
SUBSTR
SUBSTRING
MSUBSTR†
† これらの関数の記述はなくなりました。これらの関数の使用は推奨されません。KANJI1
のサポートが停止された後はサポートされなくなるためです。
以下の Teradata 関数には、ANSI の等価関数がありません。
•
•
•
•
•
CHAR2HEXINT
SOUNDEX
TRANSLATE_CHK
UPPER
VARGRAPHIC
文字列に対して操作を行なうその他の関数
SQL には、この章では取り上げていない文字列関数および演算子があります。
詳細情報
参照資料
文字列に関する記述情報を戻す、次の属性
関数
属性関数の概要。
• BYTE
• CHARACTER_LENGTH/
CHAR_LENGTH
• OCTET_LENGTH
比較演算子
比較演算子と関数の概要
LIKE 述部
論理述部
文字列関数へのサーバー文字セットの影響
文字データに対して実行される文字列関数は、以下に挙げる規則に従います。
LATIN での大文字変換
LATIN サーバー文字セットの場合の大文字への変換方法は、ISO 8859 Latin1 に基づ
きます。
1112
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
文字列関数へのサーバー文字セットの影響
論理文字と物理文字
UNICODE、GRAPHIC、KANJISJIS の各サーバー文字セットの場合、関数は論理文字
ベースで動作します。ただし、ANSI モードと Teradata モードの切り替えに対応し
ている関数は例外です。
KANJISJIS の格納スペースは物理ベースで割り振られ、ANSI との互換性はありませ
んが、このタイプに対する文字列操作はすべて ANSI の仕様の文字ベースで行なわ
れます。
変換不能な KANJI1 文字
注:
Teradata の国際化計画に従って、KANJI1 のサポートはサポート外になりました。
このサポートは、近い将来に廃止される予定です。KANJI1 はデフォルトの文字セッ
トとして許可されません。システムはデフォルトの KANJI1 文字セットを UNICODE
文字セットに変更します。KANJI1 の新規オブジェクトの作成は、高度に制限され
ています。KANJI1 を使用する問合わせやアプリケーションの多くは、従来通り動
作しますが、KANJI1 を使用するサイトはできるだけ早く別の文字セットに変換す
る必要があります。詳細については、<国際文字セットのサポート、B035-1125>の
KANJI1 文字セットを参照してください。
セッションの文字セットが UTF8 または UTF16 の場合、文字列関数は KANJI1 サー
バー文字セットの文字すべてに作用するとは限りません。これは、KANJI1 サーバー
文字セットには、マルチバイト文字と一部の 1 バイト文字に関してあいまいなとこ
ろがあるからです。
推奨事項: KANJI1 サーバー文字セットが必要でない限り、UNICODE サーバー文字
セットを UTF8 および UTF16 セッション文字セットと併用するようにすれば、最良
の結果が得られます。
次に示す KanjiEBCDIC の 1 バイト文字から KANJI1 への変換は、次に示す Unicode
文字名にマップされます。
16 進数値
文字
Unicode 文字名
0x10
¢
CENT SIGN
0x11
£
POUND SIGN
0x12
¬
NOT SIGN
0x13
\
REVERSE SOLIDUS
0x14
~
TILDE
ただし、KanjiSJIS 文字セットでは、これらの 16 進数値は、制御文字にマップされ
ます。
SQL 関数、演算子、式および述部
1113
第 26 章 文字列演算子と関数
連結演算子
サーバー文字セットの暗黙変換
複数の引数で実行される関数では、その引数に異なるサーバー文字セットがある場
合は暗黙変換規則が適用されます。
連結演算子
目的
文字列式を連結します。
構文
string_expression_1
string_expression_2
string_expression_n
構文要素
string_expression_1
バイト、数値、または文字列あるいは文字列式。
ANSI への準拠
感嘆符のペア(!!)は、ANSI SQL:2011 規格の Teradata 拡張機能です。連結演算子と
して感嘆符は使用しないでください。
実線の縦線のペア(||)と点線の縦線のペアは、ANSI SQL:2011 に準拠した連結演算子
です。
引数のタイプと規則
次のタイプの文字列および文字列式に対して連結演算子を使用します。
• バイト
引数のいずれかがバイト タイプの場合は、他の引数もすべてバイト タイプでな
ければなりません。
• 数値
数値のための書式を使用して、数値の引数が文字列に変換されます。数値から文
字データ型への暗黙的変換についての詳細は、「数値から文字への暗黙の変換」
を参照してください。
• 文字
1114
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
連結演算子
引数がどちらも文字タイプであってもサーバー文字セットが異なる場合は、文字
列の暗黙変換が行なわれます。詳細については、「文字から文字への暗黙の変
換」を参照してください。
• 事前定義された文字タイプへの暗黙 CAST を持つ UDT。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS
ASSIGNMENT 節を指定します。CREATE CAST の詳細は、<SQL データ定義言語
- 構文規則および例、B035-1144>を参照してください。
連結演算子を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レコー
ドの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定します。詳細
は、<SQL データ定義言語 - 構文規則および例、B035-1144>を参照してください。
UDT の暗黙的な型の変換の詳細については、「データ型の変換」を参照してくだ
さい。
結果のタイプと属性
連結演算子の結果は、左から右の方向に引数を連結することによって出来上がる文
字列です。
arg1 || arg2 のデフォルトの結果の型と属性は、次のとおりです。
• 引数がバイト列(バイナリ)である場合、結果はバイト列(バイナリ)になります。
• 引数が数値、文字列、または暗黙で文字列にキャストされる UDT である場合、
結果は文字列になります。
いずれかの引数が NULL の場合、結果は NULL になります。
引数のデータ タイプと属性によって、連結演算子の結果タイプが固定長か可変長文
字列かが決まります。結果タイプは次の表に示すようになります。n は、すべての
引数の長さの合計です。
引数
データ タイプまたは属性
結果のデータ タイプま
たは属性
一方
VARBYTE
VARBYTE(n)
VARCHAR
VARCHAR(n)
数値
暗黙で VARCHAR にキャストされる UDT
両方
SQL 関数、演算子、式および述部
CLOB
CLOB(n)
BLOB
BLOB(n)
BYTE
BYTE(n)
CHARACTER (同じサーバー文字セット)
CHARACTER(n)
1115
第 26 章 文字列演算子と関数
連結演算子
引数
データ タイプまたは属性
結果のデータ タイプま
たは属性
暗黙で CHARACTER(同じサーバー文字セット)
にキャストされる UDT
CHARACTER (異なるサーバー文字セット)
VARCHAR(n)
暗黙で CHARACTER(異なるサーバー文字セッ
ト)にキャストされる UDT
数値
いずれかの引数が CASESPECIFIC 属性を指定する文字列の場合、結果も
CASESPECIFIC 属性を指定します。
例
例: 結果を読みやすくするために連結を使用する
結果の見出しを書式設定して読みやすくするために、リテラル、スペース、TITLE
句を演算定義の中に組み込むことができます。
たとえば、以下の定義は、サイド タイトル、均等にスペースを入れた結果文字列、
ブランクの見出しを戻します。
SELECT ('Sex ' || sex ||', Marital Status ' || mstat)(TITLE ' ')
FROM Employee ;
Sex
Sex
Sex
Sex
Sex
Sex
Sex
M,
F,
M,
F,
F,
M,
F,
...
Marital
Marital
Marital
Marital
Marital
Marital
Marital
Status
Status
Status
Status
Status
Status
Status
S
M
M
M
M
M
W
例: 名と姓の連結
names というテーブルに、以下のように VARCHAR として定義したラスト ネーム列
とファースト ネーム列が含まれているとします。
lname
-----------Ryan
Villegas
Kanieski
Brown
1116
fname
-----------Loretta
Arnando
Carol
Alan
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
連結演算子
文字列連結とスペース区切り文字を使って、ファースト ネームとラスト ネームを
組み合わせしてみましょう。
SELECT fname ||' '|| lname
FROM names
ORDER BY lname ;
結果は以下のようになります。
((fname||' ')||lname)
--------------------Alan Brown
Carol Kanieski
Loretta Ryan
Arnando Villegas
例: 姓と名の連結
SELECT と区切り文字を変更して、ラスト ネーム、ファースト ネームの順番で名前
を表示してみましょう。
SELECT lname||', '||fname
FROM names
ORDER BY lname;
結果は以下のようになります。
((lname||', ')||fname)
---------------------Brown, Alan
Kanieski, Carol
Ryan, Loretta
Villegas, Arnando
例 4: バイト文字列の連結
この例では、バイト文字列を連結する方法を示します。次のテーブル定義について
考察してみます。
CREATE TABLE
(column_1
,column_2
,column_3
tsttbla
BYTE(2)
VARBYTE(10)
BLOB(128K) );
テーブル tsttbla に次の値が挿入されます。
INSERT tsttbla ('4142'XB, '7A7B7C'XB, '1A1B1C2B2C'XB);
次の SELECT 文は、column_2 と column_1 と column_3 を連結します。
SQL 関数、演算子、式および述部
1117
第 26 章 文字列演算子と関数
連結演算子
SELECT (column_2 || column_1 || column_3) (FORMAT 'X(20)')
FROM tsttbla ;
結果は以下のようになります。
((column_2||column_1)||column_3)
-------------------------------7A7B7C41421A1B1C2B2C
結果のデータ タイプは BLOB です。
日本語文字セットの例
以下の表は、Teradata Database でサポートされているそれぞれの Kanji 文字セット
について、文字列式の連結結果を示したものです。
以下の例では、文字列式が、< SQL データ型とリテラル、B035-1143>の「SQL デー
タ定義」という章で定義されているルールに準拠していることを前提としています。
例: KanjiEBCDIC
string_expression_1 || string_expression_2
string_expression_1
string_expression_2
結果
< ABC >
< DEF >G
< ABCDEF >G
< ABC >
<>
< ABC >
< ABC >a
< DEF >
< ABC >a< DEF >
例: KanjiEUC
string_expression_1 || string_expression_2
string_expression_1
string_expression_2
結果
ABC m
DEF g
ABC mDEF g
ss3 A ss2 B m
ss3 C
ss3 A ss2 B m ss3 C
例: KanjiShift-JIS
string_expression_1 || string_expression_2
1118
string_expression_1
string_expression_2
結果
mnABC X
B
mnABC X B
mnABC X
g
mnABC X g
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
連結演算子
サーバー文字セットが異なる文字列の連結
CHARACTER SET 属性で異なるサーバー文字セットを指定している文字列の連結の
場合は、特に注意が必要です。
暗黙変換規則が適用されます。
文字列が固定長文字列の場合、結果は可変長になり、その長さは連結される文字列
の長さの合計に等しくなります。
この点は、文字列の長さがバイトで定義されているか文字数で定義されているかに
かかわらず当てはまります。したがって、n バイト固定長 KANJISJIS 文字列と m 文
字固定長 UNICODE 文字列を連結すると、VARCHAR(m+n) CHARACTER SET
UNICODE 結果が生成されます。
次のテーブル定義を考えます。
CREATE TABLE tab1
(cunicode CHARACTER(4)
,clatin
CHARACTER(3)
,csjis
CHARACTER(3)
CHARACTER SET UNICODE
CHARACTER SET LATIN
CHARACTER SET KANJISJIS);
テーブル tab1 に次の値が挿入されます。
INSERT tab1 ('abc', 'abc', 'abc');
以下の表は、こうした連結特性をまとめたものです。
連結
結果
結果のタイプ
cunicode || clatin
'abcΔ abc'
VARCHAR(7) CHARACTER SET UNICODE
clatin || csjis
'abcabc'
VARCHAR(6) CHARACTER SET UNICODE
cunicode || csjis
'abcΔ abc'
VARCHAR(7) CHARACTER SET UNICODE
KanjiEBCDIC を除くすべての KANJI1 文字列の連結は、上記の説明のように動作し
ます。ただし、KanjiEBCDIC の場合は、結果式内の隣接するシフトアウト(<)文字と
シフトイン(>)文字が削除されます。この場合、結果文字列には、必要に応じて<半
角スペース>文字が末尾に埋め込まれます。
関連トピック
暗黙変換規則の詳細については、文字から文字への暗黙変換を参照してください。
SQL 関数、演算子、式および述部
1119
第 26 章 文字列演算子と関数
ASCII
ASCII
目的
string_expr の最初の文字の 10 進数表現を、NUMBER 値として返します。この 10
進数表現は、入力文字列の文字セットを反映します。
構文
ASCII
( string_expr )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string_expr
文字列または文字列式。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
ASCII は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
• CHAR
• VARCHAR
• CLOB
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
1120
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
CHAR2HEXINT
結果のタイプ
結果のデータ タイプは NUMBER です。ASCII は、入力引数の文字セットでの 10 進
数表現を返します。たとえば、この関数に Unicode 文字列を渡すと、その Unicode
文字の 10 進数表現が返されます。
例
以下の問合わせは結果として 121 を返します。
SELECT ASCII('y');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数をアクティブ化して呼び出すには、「埋め込みサービス シ
ステム関数」を参照してください。
CHAR2HEXINT
目的
文字列の 16 進数表現を戻します。
構文
CHAR2HEXINT
( character_string_expression )
構文要素
character_string_expression
16 進数表現を戻す文字列または文字列式。
引数のタイプ
文字列または文字列式に対して CHAR2HEXINT を使用します。
Teradata Database はデフォルトで、UDT と、事前定義文字列タイプの間でキャス
トを行なう暗黙 CAST を持つ UDT 引数に対して、暗黙のタイプ変換を行ないます。
UDT 用の暗黙 CAST を定義するには、CREATE CAST 文を使用し、AS ASSIGNMENT
節を指定します。
SQL 関数、演算子、式および述部
1121
第 26 章 文字列演算子と関数
CHAR2HEXINT
CHAR2HEXINT を含め、システム演算子および関数用の UDT の暗黙タイプ変換は、
ANSI SQL 規格の Teradata 拡張機能です。
CLOB では CHAR2HEXINT はサポートされていません。
結果のタイプと属性
CHAR2HEXINT(character_string_expression)のデフォルトの属性は、次のとおりで
す。
データ タイプ
見出し
CHARACTER
Char2HexInt(character_string_expression)
結果の長さは、character_string_expression の長さの 2 倍になります。
結果のサーバー文字セットは LATIN です。
character_string_expression 引数が NULL の場合、結果は NULL になります。
CHAR2HEXINT とリテラル文字列
CHAR2HEXINT を文字列リテラルに対して適用して、その 16 進数相当の値を判別
することができます。
文字リテラルは VARCHAR(n) CHARACTER SET UNICODE として扱われます。n は定
数の長さです。
次に示す文と結果は、リテラル文字列に対する CHAR2HEXINT の操作を示したもの
です。
SELECT CHAR2HEXINT('123');
Char2HexInt('123')
----------------------003100320033
例
例
sysinit 時にシステムの日本語サポートが使用可能になっていたとします 。
CREATE TABLE tab1
(clatin
,cunicode
,csjis
,cgraphic
,ckanji1
1122
CHAR(3)
CHAR(3)
CHAR(3)
CHAR(3)
CHAR(3)
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
SET
SET
SET
SET
SET
LATIN
UNICODE
KANJISJIS
GRAPHIC
KANJI1);
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
CHAR2HEXINT
INSERT INTO tab1('abc','abc','abc',_GRAPHIC 'ABC
','abc');
この例にある太字の大文字 LATIN 文字は、全角の LATIN 文字を表わします。
CHAR2HEXINT は、tab1 に挿入された文字列について、次の結果を戻します。
関数
返す結果
CHAR2HEXINT(clatin)
616263
CHAR2HEXINT(cunicode)
006100620063'
CHAR2HEXINT(csjis)
616263
CHAR2HEXINT(cgraphic)
FF41FF42FF43
CHAR2HEXINT(ckanji1)
616263
例
すべてのテーブル名の内部 16 進数表現を調べる場合は、CHAR2HEXINT を使用し
て次の SELECT 文を実行します。
SELECT CHAR2HEXINT(TRIM(t.tablename))(FORMAT 'X(30)')
(TITLE 'Internal Hex Representation of TableName')
,t.tablename (TITLE 'TableName')
FROM dbc.tables T
WHERE t.tablekind = 'T'
ORDER BY t.tablename;
この SELECT 文の部分的な結果は、以下のレポートのようになります。
Internal Hex Representation of TableName
---------------------------------------416363657373526967687473
4163634C6F6752756C6554626C
4163634C6F6754626C
4163636F756E7473
4163637467
416C6C
436F70496E666F54626C
TableName
---------------AccessRights
AccLogRuleTbl
AccLogTbl
Accounts
Acctg
All
CopInfoTbl
関連トピック
• CREATE CAST の詳細は、<SQL データ定義言語 - 構文規則および例、B035-1144>
を参照してください。
• CHAR2HEXINT 拡張機能を無効にする方法については、<ユーティリティ 、
B035-1102>を参照してください。
SQL 関数、演算子、式および述部
1123
第 26 章 文字列演算子と関数
CHR
• UDT の暗黙的な型の変換の詳細については、「データ型の変換」を参照してくだ
さい。
CHR
目的
指定された数値コード値の Latin ASCII 文字を返します。
構文
CHR
( numeric_expr )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
numeric_expr
numeric_expr はゼロ以上でなければなりません。numeric_expr が 255 よりも大き
い場合は、0 から 255 の値を返す numeric_expr mod 256 の演算が実行されます。
この構文要素が NULL の場合、NULL が返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
CHR は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、NUMBER データ タイプを持っている必要があります。
UDF に適用される暗黙のデータ タイプ変換規則を使用して NUMBER に変換できる、
BYTEINT、SMALLINT、INTEGER、または BIGINT などのデータ タイプの引数も渡
すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
1124
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
CSV
結果のタイプ
結果のデータ タイプは CHAR(1) CHARACTER SET LATIN です。
例
以下の問合わせは結果として'B'を返します。
SELECT CHR(66);
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数をアクティブ化して呼び出すには、「埋め込みサービス シ
ステム関数」を参照してください。
CSV
目的
CSV (カンマ区切り値データのアンローディング)は、ユーザー定義の区切り文字で
分離した入力行の列値をテキスト形式で返します。
構文
CSV ( NEW VARIANT_TYPE (
, 8
value
) , delimit_string_value , quote_string_value )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
NEW VARIANT_TYPEvalue
数値または文字式。
NEW VARIANT_TYPE は最大 8 行の列値をサポートします。
各行の列値には、サポートされるデータ タイプの列が最大 128 列保持されている
可能性があります。
SQL 関数、演算子、式および述部
1125
第 26 章 文字列演算子と関数
CSV
delimit_string_value
文字式。
カンマはデフォルトの区切り文字です。
quote_string_value
文字式。
'"'というように引用符文字を指定した場合、文字列データ型として定義されている
列は、引用符に囲まれて返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
CSV は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
• NEW VARIANT_TYPE value = BYTEINT、SMALLINT、BIGINT、INTEGER、
DECIMAL、FLOAT、DATE、TIME、TIME WITH TIME ZONE、TIMESTAMP、
TIMESTAMP WITH TIME ZONE、INTERVAL、CHAR、VARCHAR
注: value は CLOB または GRAPHIC にはなりません。
• delimit_string_value = VARCHAR
• quote_string_value = VARCHAR
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
CSV は、データ タイプが VARCHAR の値を、LATIN または UNICODE のどちらかの
文字セットで返すテーブル関数です。
1126
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
CSVLD
例
例
以下の問合わせを実行します。
SELECT * FROM TABLE(CSV(NEW VARIANT_TYPE(dt.c1, dt.c2, dt.c3), ',', '"')
RETURNS (op varchar(64000) character set LATIN)) as t1;
CSV は、列値をカンマで分離し、文字列データ タイプの列を引用符で囲んだ文字列
を返します。
SELECT * FROM TABLE (CSV(NEW VARIANT_TYPE(dt.c1, dt.c2, dt.c3), ',', '')
RETURNS (op varchar(32000) character set UNICODE)) as t1;
CSV は列値をカンマで分離し、文字列データ タイプの列を引用符文字で囲んでいな
い文字列を返します。
例
以下の問合わせを実行します。
SELECT * FROM TABLE (CSV(NEW VARIANT_TYPE(dt.c1, dt.c2, dt.c3), ',', '')
RETURNS (op varchar(32000) character set UNICODE)) as t1;
CSV は列値をカンマで分離し、文字列データ タイプの列を引用符文字で囲んでいな
い文字列を返します。
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数をアクティブ化して呼び出すには、「埋め込みサービス シ
ステム関数」を参照してください。
CSVLD
目的
CSVLD (カンマ区切り値データのローディング)は、CSV テーブル関数で生成された
カンマ区切りの文字列を受け取り、その文字列を構文解析して VARCHAR 列を返し
ます。
構文
CSVLD ( data_string_value, delim_string_value, quote_string_value )
TD_SYSFNLIB.
SQL 関数、演算子、式および述部
1127
第 26 章 文字列演算子と関数
CSVLD
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
data_string_value
文字列の引数。
delim_string_value
文字式。
カンマはデフォルトの区切り文字です。
quote_string_value
文字式。
'"'というように引用符文字を指定した場合、文字列データ型として定義されている
列は、引用符に囲まれて返されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
CSVLD は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、NUMBER データ タイプが含まれている必要があります。
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
CSVLD は、最大 1024 の VARCHAR 列を LATIN または UNICODE のどちらかの文字
セットで返すテーブル関数です。
この関数で指定される出力列の数は、入力文字列のカンマで区切られた値の数と必
ず一致します。
1128
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
EDITDISTANCE
例
以下の問合わせを実行します。
SELECT * FROM TABLE (CSVLD(load_date.data, ',', '"')
RETURNS (p1 varchar(100), p2 varchar(100))) as T1;
CSVLD はカンマ区切りの文字列を構文解析し、2 つの VARCHAR 列を返します。
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数をアクティブ化して呼び出すには、「埋め込みサービス シ
ステム関数」を参照してください。
EDITDISTANCE
目的
string1 を string2 に変換するために必要な編集操作(挿入、削除、置換および転置)
の最小回数を返します。
構文
EDITDISTANCE
( string1, string2
TD_SYSFNLIB.
)
, ci, cd, cs, ct
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
string1
文字列または文字列式。
string2
文字列または文字列式。
ci
この構文要素を負の値にすることはできません。
指定しなかった場合、デフォルト値の 1 が使用されます。
SQL 関数、演算子、式および述部
1129
第 26 章 文字列演算子と関数
EDITDISTANCE
cd
この構文要素を負の値にすることはできません。
指定しなかった場合、デフォルト値の 1 が使用されます。
cs
この構文要素を負の値にすることはできません。
指定しなかった場合、デフォルト値の 1 が使用されます。
ct
この構文要素を負の値にすることはできません。
指定しなかった場合、デフォルト値の 1 が使用されます。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
EDITDISTANCE は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
•
•
string1 = CHAR、VARCHAR、または CLOB
string2 = CHAR、VARCHAR、または CLOB
ci = INTEGER
cd = INTEGER
cs = INTEGER
ct = INTEGER
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
結果のデータ タイプは INTEGER です。
1130
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
EDITDISTANCE
使用上の注意
EDITDISTANCE は、2 つの文字列間の類似性を測定します。削除、挿入、置換また
は転置の回数が少ないということは、類似性が高いということを意味します。挿入
回数、削除回数、置換回数および転置回数は、見積もり演算用に変更を加えた
Damerau-Levenshtein 距離アルゴリズムに基づいたものになります。
string1 または string2 のどちらかが NULL の場合、この関数は NULL を返します。
例
例
以下の問合わせは結果として 9 を返します。
SELECT EDITDISTANCE('Jim D. Swain', 'John Smith');
以下の問合わせは結果として 0 を返します。これは、文字列が同じだからです。
SELECT EDITDISTANCE('John Smith', 'John Smith');
以下の問合わせは結果として 9 を返します。
SELECT EDITDISTANCE('Jim D. Swain', 'John Smith', 2, 1, 1, 2);
以下の問合わせは結果として 11 を返します。
SELECT EDITDISTANCE('John Smith', 'Jim D. Swain', 2, 1, 1, 2);
例
以下の問合わせは結果として 0 を返します。これは、文字列が同じだからです。
SELECT EDITDISTANCE('John Smith', 'John Smith');
例
以下の問合わせは結果として 9 を返します。
SELECT EDITDISTANCE('Jim D. Swain', 'John Smith', 2, 1, 1, 2);
例
以下の問合わせは結果として 11 を返します。
SELECT EDITDISTANCE('John Smith', 'Jim D. Swain', 2, 1, 1, 2);
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
1131
第 26 章 文字列演算子と関数
INDEX
INDEX
目的
string_expression_1 内で string_expression_2 が始まる位置を戻します。
構文
INDEX
( string_expression_1 ,string_expression_2 )
構文要素
string_expression_1
検索対象の完全文字列。
string_expression_2
完全文字列内での位置を検索する副文字列。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
ANSI SQL:2011 に準拠させるには、INDEX の代わりに POSITION を使用します。
引数のタイプと規則
INDEX は、次のタイプの引数に対して実行します。
• 文字
• バイト
一方の文字列式のタイプが BYTE である場合、両方の文字列式ともタイプが BYTE
でなければなりません。
• 数値
いずれかの文字列式が数値の場合、その式は CHARACTER タイプに暗黙変換され
ます。
• UDT と以下のいずれかの事前定義タイプの間でキャストを行なう暗黙 CAST を持
つ UDT
• 数値
• 文字
• DATE
• バイト
UDT 用の暗黙 CAST を定義するには、CREATE CAST を使用し、AS
ASSIGNMENT を指定します。CREATE CAST の詳細は、<SQL データ定義言語
- 構文規則および例、B035-1144>を参照してください。
1132
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INDEX
INDEX を含め、システム演算子および関数用の UDT の暗黙の型変換は、ANSI
SQL 規格の Teradata 拡張機能です。この拡張を無効にするには、DBS 制御レ
コードの DisableUDTImplCastForSysFuncOp フィールドを TRUE に設定しま
す。詳細は、<ユーティリティ 、B035-1102>を参照してください。
INDEX は、CLOB および BLOB をサポートしません。
結果のタイプと属性
INDEX(arg1, arg2)のデフォルトの結果の型と属性は、次のとおりです。
データ タイプ
見出し
INTEGER
Index(arg1, arg2)
期待値
INDEX が戻す値には、次の規則が適用されます。
• string_expression_2 が string_expression_1 で検出されない場合、結果はゼロに
なります。
• string_expression_2 が null の場合、結果は null になります。
• 引数が文字タイプの場合は、引数のサーバー文字セットが KANJI1 でセッショ
ン クライアント文字セットが KanjiEBCDIC のとき以外は、INDEX はバイト位置
ではなく論理文字位置を戻します。
文字タイプの引数の規則
引数が文字タイプの場合、照合は論理文字に対して行なわれます。1 バイト文字は
1 バイト文字と照合され、マルチバイト文字はマルチバイト文字と照合されます。
照合を実行するには、両方の式の論理文字表現が同じでなければなりません。
引数のサーバー文字セットが同じものでない場合、INDEX は暗黙文字変換を行ない
ます。
CASESPECIFIC 属性は、文字が一致するものとしてみなせるかどうかを左右します。
セッション
モード
文字列およびリテラルの大文字小文字の区別のデフォルト
ANSI
CASESPECIFIC
TERADATA
NOT CASESPECIFIC
例外は GRAPHIC 型の文字データで、この場合は必ず CASESPECIFIC になり
ます。
大文字小文字の区別のデフォルトをオーバーライドするには、CREATE TABLE また
は ALTER TABLE の中で文字の列に対して CASESPECIFIC または NOT CASESPECIFIC
句を適用することができます。
SQL 関数、演算子、式および述部
1133
第 26 章 文字列演算子と関数
INDEX
あるいは、CASESPECIFIC または NOT CASESPECIFIC 句を INDEX 文字列引数に適用
することができます。
条件
結果
どちらかの引数の属 シンプルな Latin 文字は、文字が同じで、大文字小文字の区別も同じ
性が CASESPECIFIC 場合にのみ、一致しているとみなされます。
の場合(デフォルトま
たは明示指定によっ
て)
両方の引数の属性が
NOT CASESPECIFIC
の場合(デフォルトま
たは明示指定によっ
て)
操作を開始する前に、一部の文字が大文字に変換されます。
文字が小文字のシンプルな Latin 文字である場合は、操作が始まる前
に、大文字に変換されます。
文字が Latin 以外の 1 バイト文字、マルチバイト文字、または 1 バ
イト文字データとマルチバイト文字データとの間の移行を示すバイ
トである場合は、大文字に変換されません。
文字タイプ引数を使用している場合、INDEX による文字の照合を大文字小文字を区
別して行なうには、最低 1 つの引数に CASESPECIFIC 句を指定します。たとえば、
SELECT Name
FROM Employee
WHERE INDEX(Name, 'X' (CASESPECIFIC)) = 1;
INDEX による文字の照合を大文字小文字の区別を無視して行なうには、両方の引数
に NOT CASESPECIFIC 句を指定します。
KANJI1 サーバー文字セットの規則
注:
Teradata の国際化計画に従って、KANJI1 のサポートはサポート外になりました。こ
のサポートは、近い将来に廃止される予定です。KANJI1 はデフォルトの文字セット
として許可されません。システムはデフォルトの KANJI1 文字セットを UNICODE 文
字セットに変更します。KANJI1 の新規オブジェクトの作成は、高度に制限されてい
ます。KANJI1 を使用する問合わせやアプリケーションの多くは、従来通り動作しま
すが、KANJI1 を使用するサイトはできるだけ早く別の文字セットに変換する必要が
あります。詳細については、<国際文字セットのサポート、B035-1125>の KANJI1
文字セットを参照してください。
サーバー文字セットが KANJI1 でクライアント文字セットが KanjiEBCDIC の場合、
オフセット カウントにシフトアウト/シフトイン文字が含まれていますが、照合の対
象にはなりません。それらは、1 バイト文字とマルチバイト文字の間の移行を示す
文字としてのみ処理されます。
ゼロでない場合の結果の位置は、以下のように出力されます。
1134
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INDEX
文字セット
結果
KanjiEBCDIC
string_expression_1 内での論理文字オフセット(オフセット カウ
ント内の シフトイン/シフトアウトを含む)の最初のバイトの位置。
KanjiEBCDIC 以外
string_expression_1 内の論理文字オフセット。
INDEX と POSITION の関係
INDEX と POSITION の動作は同一ですが、クライアント文字セットが KanjiEBCDIC
でサーバー文字セットが KANJI1 であり、かつ引数にマルチバイト文字が含まれる
場合の文字タイプ引数に対しては例外です。
例
例: 単純な INDEX 式の使用
以下の表は、シンプルな INDEX 式とそれぞれの結果をまとめたものです。
式
結果
INDEX('catalog','log')
5
INDEX('catalog','dog')
0
INDEX('41424344'XB,'43'XB)
3
次の例は、string_1 のサーバー文字セットと string_2 のサーバー文字セットが異な
る場合の INDEX(string_1, string_2)の動作を示したものです。この場合は両方の引
数が UNICODE に変換され(必要な場合)、文字は論理的に照合されます。
string_1
結果
string_2
文字セット
データ
文字セット
データ
UNICODE
92
abc
LATIN
abc
4
UNICODE
abc
UNICODE
c
3
KANJISJIS
92
04
UNICODE
0
4
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiEBCDIC の場合の、INDEX(string_1, string_2)の動作を示したものです。
KanjiEBCDIC の場合、結果は物理単位として戻されるので、その環境の INDEX DB2
に準拠するようになります。
SQL 関数、演算子、式および述部
1135
第 26 章 文字列演算子と関数
INDEX
string_1 の内容
string_2 の内容
結果
MN<AB >
<B >
6
MN<AB >
<A >
4
MN<AB >P
P
9
MX N<AB >P
<B >
7
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiEUC の場合の、INDEX(string_1, string_2)の動作を示したものです。
string_1 の内容
string_2 の内容
結果
a b ss3 A
ss3 A
3
a b ss2 B
ss2 B
3
CS1_DATA
A
6
a b ss2 D ss3 E ss2 F
ss2 F
5
a b C ss2 D ss3 E ss2 F
ss2 F
6
CS1_D mATA
A
7
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiShift-JIS の場合の、INDEX(string_1, string_2)の動作を示したものです。
string_1 の内容
string_2 の内容
結果
mnABC X
B
4
mnABC X
X
6
この例では、Employee テーブルの Name 列に入っている文字列値内の' ' (スペース
文字)に INDEX を適用します。
SELECT name
FROM employee
WHERE INDEX(name, ' ') > 6 ;
INDEX は Name フィールドを調べて、6 番目を超えた文字位置(7 番目以降の位置)に
スペースが存在するすべての名前を戻します。
以下の例では、プロジェクト説明の中に Batch という語が入っているプロジェクト
のリストを表示し、その語の開始位置をリストアップします。
SELECT proj_id, INDEX(description, 'Batch')
FROM project
WHERE INDEX(description, 'Batch') > 0 ;
システムは以下の報告を戻します 。
1136
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INDEX
proj_id
Index (description, 'Batch')
------------- ---------------------------OE2-0003
5
AP2-0003
13
OE1-0003
5
AP1-0003
13
AR1-0003
10
AR2-0003
10
連結、SUBSTRING、および INDEX を使った、もう少し複雑な構造の文も有益でしょ
う。Employee テーブルに次の値が入っているとします。
empno
---------10021
10007
10018
10011
10019
name
----------Smith T
Aguilar J
Russell S
Chin M
Newman P
以下の問合わせを使用して、employee テーブルから選択した name 列の名前の形式
を変更し、報告の中の句読点の表記を変更できます。
SELECT empno,
SUBSTRING(name FROM INDEX(name,' ')+1 FOR 1)||
'. '||
SUBSTRING(name FROM 1 FOR INDEX(name, ' ')-1)
(TITLE 'Emp Name')
FROM employee ;
システムは以下の報告を戻します 。
empno
---------10021
10007
10018
10011
10019
Emp Name
-------------T. Smith
J. Aguilar
S. Russell
M. Chin
P. Newman
例
次の例は、string_1 のサーバー文字セットと string_2 のサーバー文字セットが異な
る場合の INDEX(string_1, string_2)の動作を示したものです。この場合は両方の引
数が UNICODE に変換され(必要な場合)、文字は論理的に照合されます。
string_1
文字セット
SQL 関数、演算子、式および述部
結果
string_2
データ
文字セット
データ
1137
第 26 章 文字列演算子と関数
INDEX
string_1
結果
string_2
UNICODE
92 abc
LATIN
abc
4
UNICODE
abc
UNICODE
c
3
KANJISJIS
92
UNICODE
0
4
04
例: INDEX と KANJI1 および KanjiEBCDIC の併用
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiEBCDIC の場合の、INDEX(string_1, string_2)の動作を示したものです。
KanjiEBCDIC の場合、結果は物理単位として戻されるので、その環境の INDEX DB2
に準拠するようになります。
string_1 の内容
string_2 の内容
結果
MN<AB>
<B>
6
MN<AB>
<A>
4
MN<AB>P
P
9
MX N<AB>P
<B>
7
例: INDEX と KANJI1 および KanjiEUC の併用
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiEUC の場合の、INDEX(string_1, string_2)の動作を示したものです。
string_1 の内容
string_2 の内容
結果
a b ss3 A
ss3 A
3
a b ss2 B
ss2 B
3
CS1_DATA
A
6
a b ss2 D ss3 E ss2 F
ss2 F
5
a b C ss2 D ss3 E ss2 F
ss2 F
6
CS1_D mATA
A
7
例: INDEX と KANJI1 および KanjiShift-JIS の併用
次の例は、両方の引数のサーバー文字セットが KANJI1 でクライアント文字セット
が KanjiShift-JIS の場合の、INDEX(string_1, string_2)の動作を示したものです。
1138
string_1 の内容
string_2 の内容
結果
mnABC X
B
4
mnABC X
X
6
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INDEX
例: SPACE 文字への INDEX の適用
この例では、Employee テーブルの Name 列に入っている文字列値内の' ' (スペース
文字)に INDEX を適用します。
SELECT name
FROM employee
WHERE INDEX(name, ' ') > 6 ;
INDEX は Name フィールドを調べて、6 番目を超えた文字位置(7 番目以降の位置)
にスペースが存在するすべての名前を戻します。
例: プロジェクトの説明での"Batch"の使用
以下の例では、プロジェクト説明の中に Batch という語が入っているプロジェクト
のリストを表示し、その語の開始位置をリストアップします。
SELECT proj_id, INDEX(description, 'Batch')
FROM project
WHERE INDEX(description, 'Batch') > 0 ;
システムは以下の報告を戻します 。
proj_id
Index (description, 'Batch')
------------- ---------------------------OE2-0003
5
AP2-0003
13
OE1-0003
5
AP1-0003
13
AR1-0003
10
AR2-0003
10
例: 連結、SUBSTRING、および INDEX の使用
連結、SUBSTRING、および INDEX を使った、もう少し複雑な構造の文も有益でしょ
う。Employee テーブルに次の値が入っているとします。
empno
---------10021
10007
10018
10011
10019
name
----------Smith T
Aguilar J
Russell S
Chin M
Newman P
以下の問合わせを使用して、employee テーブルから選択した name 列の名前の形式
を変更し、報告の中の句読点の表記を変更できます。
SELECT empno,
SUBSTRING(name FROM INDEX(name,' ')+1 FOR 1)||
SQL 関数、演算子、式および述部
1139
第 26 章 文字列演算子と関数
INITCAP
'. '||
SUBSTRING(name FROM 1 FOR INDEX(name, ' ')-1)
(TITLE 'Emp Name')
FROM employee ;
システムは以下の報告を戻します 。
empno
---------10021
10007
10018
10011
10019
Emp Name
-------------T. Smith
J. Aguilar
S. Russell
M. Chin
P. Newman
関連トピック
• 暗黙の型変換の詳細については、「データ型の変換」を参照してください。
• これらの 2 つの関数が同じデータに対して異なる結果を返す例については、
「POSITION と INDEX の相違点」を参照してください。
• 詳細については、「KANJI1 サーバー文字セットのルール」を参照してください。
• 暗黙的な文字変換のルールの説明については、「文字から文字への暗黙変換」を
参照してください。
INITCAP
目的
文字列引数を変更して、各単語の最初の文字が大文字、残りの文字が小文字の文字
列を返します。各単語は、空白または英数字以外の文字で区切られます。
構文
INITCAP
( string )
TD_SYSFNLIB.
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
「文字列」
文字列または列式
この構文要素が NULL の場合、NULL が返されます。
1140
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INITCAP
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
INITCAP は埋め込みサービス システム関数です 。
引数のタイプと規則
この関数に渡される式には、次のいずれかのデータ タイプが含まれている必要があ
ります。
CHAR、VARCHAR、または CLOB
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
結果のタイプ
結果のデータ タイプと文字セットは、入力文字列のものと同じです。たとえば、入
力文字列のデータ タイプが VARCHAR CHARACTER SET UNICODE の場合、結果の
データ タイプは VARCHAR CHARACTER SET UNICODE になります。
例
以下の問合わせは結果として'Hello World'を返します。
SELECT INITCAP('hello WORLD');
関連トピック
詳細は、以下を参照してください。
• <SQL 外部ルーチン プログラミング、B035-1147>の「互換データ型」。
• 埋め込みサービス関数をアクティブ化して呼び出すには、「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
1141
第 26 章 文字列演算子と関数
INSTR
INSTR
目的
source_string 引数から search_string の出現位置を検索します。
構文
INSTR
( source_string, search_string
TD_SYSFNLIB.
)
, position
, occurence
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字列または文字列式。
search_string
この関数で source_string から検索する文字列。
position
source_string のこの位置から検索が開始されるように指定します。
position が指定されていない場合、検索は source_string の最初から開始されます。
position が負の場合、この関数は source_string の終端から逆方向にカウントと検索
を実行します。position の値を 0 にすることはできません。
occurrence
source_string から見つける search_string の出現位置を指定します。
occurrence が指定されていない場合、この関数は最初の出現位置を検索します。
occurrence が 1 より大きい場合、この関数は直前の出現位置の 2 番目の文字から始
めて追加の出現位置を検索します。occurrence の値をゼロ以下にすることはできま
せん。
ANSI への準拠
この文は、ANSI SQL:2011 規格に対する Teradata 拡張機能です。
呼出し
INSTR は埋め込みサービス システム関数です 。
1142
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
INSTR
引数のタイプと規則
この関数に渡された式は、次のデータ タイプを持っている必要があります。
•
•
•
•
source_string = CHAR、VARCHAR、または CLOB
search_string = CHAR、VARCHAR、または CLOB
position = INTEGER、BIGINT、または NUMBER
occurrence = INTEGER、BIGINT、または NUMBER
UDF に適用される暗黙のデータ タイプ変換規則を使用して上記のタイプに変換でき
る、データ タイプの引数も渡すことができます。
注: UDF の暗黙の型変換規則は、Teradata Database で通常使用される暗黙の型変換
規則よりも制限されています。UDF の暗黙の変換規則に従って、必要なデータ タイ
プに変換できない引数は、明示的にキャストする必要があります。
詳細については、<SQL 外部ルーチン プログラミング 、B035-1147>の「互換デー
タ型」を参照してください。
一致が見つかると、この関数は source_string 内での一致位置(1 から始まる)を返し
ます。一致が見つからない場合は、0 を返します。いずれかの入力引数が NULL の
場合、この関数は NULL を返します。
結果のタイプ
結果のデータ タイプは NUMBER です。
例
例
次の問合わせは、'chip'に含まれる'ch'の位置を示す 20 を結果として返します。こ
れは、検索対象文字列の 2 番目の文字から検索を始めて、2 番目の'ch'の出現位置に
なります。
SELECT INSTR('choose a chocolate chip cookie','ch',2,2);
例
次の問合わせは、結果として 2 を返します。この結果は、検索対象文字列の先頭か
ら検索を開始して、最初に出現した'N'の位置を示します。
SELECT INSTR('INSTR FUNCTION','N');
関連トピック
埋め込みサービス関数の有効化と呼び出しについて、詳細は「埋め込みサービス シ
ステム関数」を参照してください。
SQL 関数、演算子、式および述部
1143
第 26 章 文字列演算子と関数
LEFT
LEFT
目的
入力文字列を指定の文字数に切り捨てます。
LEFT 関数は、'LEFT'または'TD_LEFT'の別名で呼び出すことができます。
引数には、2 つのパラメータが含まれます。
• 第 1 パラメータ
副文字列が作成される入力文字列。CHAR、VARCHAR、および CLOB はサポート
されますが、他の型を明示的にキャストする必要があります。入力は、NULL ま
たは空の文字列にすることができます。
• 第 2 パラメータ
文字列の左側から必要な文字数を指定する正の整数。文字数が元の文字列の文字
数を超えた場合、元の文字列が返されます。
構文
LEFT
(source_string, length)
TD_SYSFNLIB.
サポートされている文字セット
以下の文字セットが LEFT 関数でサポートされます。
• Unicode
• Latin
• Kanji SJIS
• Graphic
構文要素
TD_SYSFNLIB
関数が格納されているデータベースの名前。
source_string
文字列または文字列式。
この構文要素が NULL の場合、NULL が返されます。
length
返される文字の長さを指定する整数。
1144
SQL 関数、演算子、式および述部
第 26 章 文字列演算子と関数
LENGTH
使用上の注意
ODBC を使用するクライアントで関数 LEFT を使用して問合わせを実行するときは、
ODBC 解析を無効にします。無効にしない場合、問合わせが ODBC によって SUBSTR
関数呼び出しに変更される場合があります。
結果のタイプ
副文字列が返されます。戻りタイプは CHAR を除く入力タイプに設定されます。
CHAR 入力は、VARCHAR の結果タイプです。
結果の文字セットは、Unicode および Latin の source_string 文字セットと同じで
す。結果の文字セッ