ケースの基準と問題
次の表に、英大文字/英小文字の区別の基準および問題を要約します。
| 大文字小文字の区別の指定 | THEN … |
|---|---|
| CASESPECIFIC (CS) | ソートまたは比較では、英小文字は英大文字に変換されず、同じ文字の英大文字とは等しくなりません。
|
| NOT CASESPECIFIC (NOT CS) | ソートまたは比較においては、英小文字は英大文字に変換されます。「aaa」は「AAA」と同じです。 「AAA」、「aaa」、「AaA」、および「aAA」は固有インデックスとしてすべて等しくなります。 |
| CASESPECIFICまたは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になります。