17.10 - POSITIONとINDEXの相違点 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL関数、式、および述部

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

INDEXとPOSITIONの動作は同一ですが、セッション クライアント文字セットがKanjiEBCDICでサーバー文字セットがKANJI1であり、かつ親文字列にマルチバイト文字が含まれる場合は例外です。

これは、同一のデータに対してこれらの2つの関数を実行した結果が異なる唯一の場合です。

次のテーブルを作成するとします。

   CREATE TABLE iptest (
    column_1 VARCHAR(30) CHARACTER SET Kanji1
    column_2 VARCHAR(30) CHARACTER SET Kanji1);

次に、以下の列値セットを挿入します。

column_1 column_2
MN<AC> <C>
MN<AC>P <A>
MN<AB>P P
MN<AB>P <B>

クライアント セッションの文字セットはKanjiEBCDIC5026_0Iです。ここで、この条件下でINDEXとPOSITIONがどのように異なる結果を戻すかを示す問合わせを実行します。

   SELECT column_1, column_2, INDEX(column_1,column_2)
   FROM iptest;

この問合わせの結果は、以下のようになります。

   column_1     column_2        Index(column_1,column_2)
   -----------  -----------     ------------------------
   MN<AC
>       <C
>                                    6
   MN<AC
>P      <A
>                                    4
   MN<AB
>P      P                                      9
   MN<AB
>P      <B
>                                    6

同じセッション特性を有効にした上で、INDEXの代わりにPOSITIONを使用して、テーブルに対してセマンティクス上同一の問合わせを実行します。

   SELECT column_1, column_2, POSITION(column_2 IN column_1)
   FROM iptest;

この問合わせの結果は、以下のようになります。

   column_1     column_2     Position(column_2 in column_1)
   -----------  -----------  ------------------------------
   MN<AC
>       <C
>                                       4
   MN<AC
>P      <A
>                                       3
   MN<AB
>P      P                                         5
   MN<AB
>P      <B
>                                       4
結果が異なることは、以下に示す、この特定のケースにおけるINDEXとPOSITIONの動作方法の相違によって説明がつきます。
  • INDEXはシフトアウト文字とシフトイン文字をカウントするが、POSITIONはカウントしない。
  • INDEXはバイトをカウントするが、POSITIONは論理文字をカウントする。結果として、例えばAはINDEXでは2バイト(2つの物理文字)としてカウントされますが、POSITIONではただ1つの論理文字としてカウントされます。