文字データの比較および照合の英大文字/英小文字を指定します。
構文
[ NOT ] { CASESPECIFIC | CS }
ANSI準拠
CASESPECIFICは、ANSI SQL:2011規格に対するTeradataの拡張機能です。
ルール:すべてのモード
- 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モード
- 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モード
- どの文字データでもデフォルトは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) | ソートまたは比較では、英小文字は英大文字に変換されず、同じ文字の英大文字とは等しくなりません。
|
NOT CASESPECIFIC (NOT CS) | ソートまたは比較においては、英小文字は英大文字に変換されます。「aaa」は「AAA」と同じです。 「AAA」、「aaa」、「AaA」、および「aAA」は固有インデックスとしてすべて等しくなります。 |
CASESPECIFICまたは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 |