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 文字セットと同じで す。結果の文字セッ
© Copyright 2024 Paperzz