インデックスの対象カラムを調べる際、dba_ind_columnsを参照しますよね。この時たまに”SYS_XXX”っていうカラム名が出てきて気になりませんか?
select t.INDEX_NAME,t.TABLE_OWNER,t.TABLE_NAME,t.COLUMN_NAME,t.COLUMN_POSITION,t.COLUMN_LENGTH,t.CHAR_LENGTH,t.DESCEND from dba_ind_columns t where t.TABLE_NAME ='MST_ADDRESS' order by t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.COLUMN_POSITION ;
これら3つのINDEXは以下のように作成しています。ファンクションインデックスを使ったり、逆順ソートが指定された場合このように見えるようです。マニュアルを見ると『列の名前、またはオブジェクト型列の属性』となっていまた。ファンクションインデックスは納得ですが、逆順ソートの指定でもこのようになるってちょっと納得いかないです、、、
create index IDX_MST_ADDRESS_01 on MST_ADDRESS (CITY_NAME asc);
create index IDX_MST_ADDRESS_02 on MST_ADDRESS (OAZA_TOWN_CHOME_NAME desc);
create index IDX_MST_ADDRESS_03 on MST_ADDRESS (to_char(LATITUDE) asc,to_char(LONGITUDE) asc,PREFECTURES_NAME);
DBA_IND_EXPRESSIONSを参照したら解決します
select t.INDEX_OWNER,t.INDEX_NAME,t.COLUMN_POSITION,t.COLUMN_NAME, i.COLUMN_EXPRESSION,t.DESCEND from dba_ind_columns t left join dba_ind_expressions i on i.index_owner = t.index_owner and i.index_name = t.index_name and i.column_position = t.column_position where t.TABLE_NAME = 'MST_ADDRESS' and t.TABLE_OWNER ='SOONI' --and t.INDEX_NAME ='IDX_TEST_TABLE1' order by t.TABLE_NAME,t.INDEX_NAME,t.COLUMN_POSITION,t.COLUMN_NAME ;
実はこれで『本当の解決』にはなっていないのです、、
実は上記の表示はちょっと不本意なのです。本当はcase文や、decode文を使いcolumn_nameカラムとcolumn_expression列を同一列にまとめたかったんですが、これができないのです。。。。column_expression列があの「忌まわしき」LONG型であるため挫折してしまいました。これを解決するにはPL/SQLを使うしかないような、、、少し考えます。LONG型といったら、Oracle11g時代のマニュアルに以下のように書いてあるにもかかわらず12cになっても内部ではLONG使っているなんて納得いかないです、、(19c使ってみましたが同じくLONG使っていました。これ直す気ないんですかね、、)
LONG列を含む表は、作成しないことをお薦めします。LONG列は、下位互換性のためにのみサポートされています。かわりにLOB列(BLOB、BFILE、CLOB、NCLOB)を使用してください。LOB列は、LONG列より制限が少なく、現在でも機能が拡張されています。
https://docs.oracle.com/cd/E16338_01/server.112/b56314/ch_twelve040.htm
2021/09/21いまいちですが、とりあえず代替案考えてやってみたのが以下です。