POSITIONとINDEXの相違点 - Teradata Database - Teradata Vantage NewSQL Engine - 文字列演算子、POSITION関数、POSITIONとINDEXの相違点。

Teradata Vantage™ SQL関数、演算子、式および述部

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/xzf1512079057909.ditamap
dita:ditavalPath
ja-JP/xzf1512079057909.ditaval
dita:id
B035-1145
Product Category
Software
Teradata Vantage

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つの論理文字としてカウントされます。