17.10 - 使用上の注意 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - データ タイプおよびリテラル

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1143-171K-JPN
Language
日本語 (日本)

ケースの基準と問題

次の表に、英大文字/英小文字の区別の基準および問題を要約します。

大文字小文字の区別の指定 THEN …
CASESPECIFIC (CS) ソートまたは比較では、英小文字は英大文字に変換されず、同じ文字の英大文字とは等しくなりません。
  • 列がCASESPECIFICと定義されている場合に、「aaa」と入力された文字は、固有インデックスに使用されると「AAA」と等しくなりません。
  • ANSIに準拠したアプリケーションでは、ANSIモードで列を定義して実行し、UPPER関数を使用して、強制的に英大文字/英小文字を指定しない比較を実行する必要があります。
NOT CASESPECIFIC (NOT CS) ソートまたは比較においては、英小文字は英大文字に変換されます。「aaa」は「AAA」と同じです。

「AAA」、「aaa」、「AaA」、および「aAA」は固有インデックスとしてすべて等しくなります。

CASESPECIFICまたはNOT CASESPECIFICのどちらも指定されない場合 デフォルトで割り当てられる属性は、セッション モードによって異なります。
  • ANSIモードでは、CASESPECIFICが設定されます。
  • Teradataモード(CHARまたはVARCHAR CHARACTER SET GRAPHICデータを除く)では、NOT CASESPECIFICが設定されます。

ルール:すべてのモード

ANSIモードの場合もTeradataモードの場合も、CASESPECIFICとNOT CASESPECIFICには次のルールが適用されます。
  • CASESPECIFICは、比較がケース指定であることを指定します。
  • NOT CASESPECIFICは、比較がケース指定でないことを指定します。
  • 列定義の一部としてCASESPECIFICもNOT CASESPECIFICも指定されていない場合、SQLリクエストの中でオプションを指定することによって、文の動作を指定できます。明示的なCASESPECIFIC(またはCS)修飾子をSQL文に含めることにより、列に対する英大文字/英小文字の指定をオーバーライドします。
  • 文字列の比較では、比較される文字列のどちらかがCASESPECIFICであれば、比較は常にCASESPECIFICで実行されます。
  • CHARまたはVARCHAR CHARACTER SET GRAPHICタイプとして指定される列は、作成時にデフォルトでCASESPECIFICに設定されます。
  • 非CASESPECIFIC CHARまたはVARCHAR CHARACTER SET GRAPHIC列を作成するためには、列定義にNOT CASESPECIFIC句を指定する必要があります。また、比較の述部でNOT CASESPECIFICを使用することもできます。
  • KANJI1データは、A~Zの範囲の文字についてのみNOT CASESPECIFICを処理します。他のすべてのサーバー文字セットでは、すべてのデータが正しく処理されます。
  • 以下に示すデータ型はCASESPECIFICまたはNOT CASESPECIFICをサポートしません。
    • CLOB
    • UDT
  • UPPERCASE句が指定されない限り、文字データが入力されたとおりに格納されます。UPPERCASE句を参照してください。

ビュー、マクロ、およびCHECKテーブル制約のパフォーマンスには、クエリー内の文字列リテラルの通常の処理以外に、実行時の文字列リテラルの解析処理も関与します。

詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>のSELECTを参照してください。

ルール:Teradataモード

Teradataモードでは、CASESPECIFICとNOT CASESPECIFICに次のルールが適用されます。
  • CHARまたはVARCHAR CHARACTER SET GRAPHIC以外のすべての文字型では、NOT CASESPECIFICがデフォルトです。

    そのデフォルトは、比較対象のCHARACTERデータの直後に(CASESPECIFIC)を指定することによって上書きできます。

    例えば、Teradataモードの場合、次のクエリーでは大文字小文字が無視されます。

    SELECT DataBaseName
    FROM DBC.Databases
    WHERE DataBaseName = 'dbc';

    これを大文字小文字の区別ありにするには、次のように述部を(CASESPECIFIC)で修飾します。

    SELECT DataBaseName
    FROM DBC.Databases
    WHERE DataBaseName = 'dbc' (CASESPECIFIC);

    最初の例では1行返されますが、第2の例では行は返されません。

  • CASESPECIFICは、ISO 10646レパートリーのすべての文字をサポートします。UPPERCASE句も参照してください。

ルール:ANSIモード

ANSIモードでは、CASESPECIFICとNOT CASESPECIFICに次のルールが適用されます。
  • どの文字データでもデフォルトはCASESPECIFICです。
  • ANSI SQL:2011の構文を使って、大文字小文字を指定しない比較を行なうには、Latin英小文字を使用している可能性があるすべての文字列値に対してUPPER関数を適用する必要があります。
  • Teradataの構文を使って、大文字小文字を指定しない比較を行なうには、該当する文字列に対してNOT CASESPECIFICの指定を適用できます。UPPER関数はANSI SQL:2011規格に準拠しているので、このほうが望ましい関数です。NOT CASESPECIFICは、この標準に対するTeradata拡張です。

    UPPERの詳細は、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。

  • CASESPECIFICは、ISO 10646レパートリーのすべての文字をサポートします。

    文字の列をNOT CASESPECIFICに宣言し、‘ά’(ギリシャ文字のアルファの小文字に気息記号の付いたもの)と入力した場合、その文字は‘ά’として格納されますが、比較の際には‘Ά’(ギリシャ文字のアルファの大文字に気息記号が付いたもの)に等しいとみなされます。

    同じことが、SQLの述部の(NOT SPECIFIC)修飾子にも適用されます。

    次のSQLの述語の評価結果はTRUEになります。
    'ά' (NOT CASESPECIFIC) = 'Ά'

    もし(NOT CASESPECIFIC)の修飾子がない場合、この述語の評価結果はFALSEになります。