CASESPECIFIC句 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/zsn1556242031050.ditamap
dita:ditavalPath
ja-JP/zsn1556242031050.ditaval
dita:id
B035-1143
Product Category
Software
Teradata Vantage

文字データの比較および照合の英大文字/英小文字を指定します。

構文

[ NOT ] { CASESPECIFIC | CS }

ANSI準拠

CASESPECIFICは、ANSI SQL:2011規格に対するTeradataの拡張機能です。

ルール:すべてのモード

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になります。

使用ルール

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

大文字小文字の区別の指定 结果
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が設定されます。

例: CASESPECIFIC句

次のクエリーは、英大文字/英小文字の区別のある比較でリテラル「Leidner P」に一致するデータが見つかった場合にだけ、結果を返します。

SELECT Name
FROM Employee
WHERE Name(CS) = 'Leidner P' ;

リテラル「Leidner P」のデフォルトは現在のモードに応じてCSまたはNOT CSですが、比較のタイプ修飾子がCSなので、セッション モードとは関係なく、大文字小文字を区別して比較が実行されます。

セッション モードとは関係なく大文字小文字を指定しない比較を実行するには、次のようにクエリーを指定します。

SELECT Name
FROM Employee
WHERE Name (NOT CS) = 'Leidner P' (NOT CS) ;

あるいは、次に示すように、ANSI互換の構文を使用したクエリーも指定できます。

SELECT Name
FROM Employee
WHERE UPPER (Name) = 'LEIDNER P' ;

例: 英大文字と英小文字が混在したデータでのCASESPECIFIC比較および照合

英大文字と英小文字が混在したデータでCASESPECIFIC比較および照合を実行すると、予想外の結果になることがあります。

SELECT Last_Name
FROM SalesReps
ORDER BY Last_Name(CS) ;

返されるソート済みリストは、そのセッションで使用している照合に応じて、次のようになります。

EBCDIC ASCII MULTINATIONAL
bart ACME ACME
fernandez ALBERT Albert
hill Albert ALBERT
Albert FARRAH bart
ACME Kimble FARRAH
ALBERT bart fernandez
FARRAH fernandez hill
Kimble hill Kimble