Oracle sqlplus tips

SQLPlusの覚え書き

出力時の1ページの行数を変更する
"set pages"を使用する。

例)set pages 300



長い文字列データを表示できない
"set long"を使用する。最大で1000文字表示したい場合は次の通り。

例)set long 1000



sqlplusで長い文字列データを入力できない
sqlplusで入力できるコマンド行の長さが2500文字を超えるとエラーになる。文字列結合演算子"||"を使用する。


unixコマンドの実行
先頭に"!"をつけてコマンドを打つ。"!"だけだと、一時的にsqlplusを抜ける。コマンドラインでexitを打つと再びsqlplusに戻る。

例) !ps



Oracle SQLの覚え書き

重複するレコードを削除する
総ての列で同じデータを持つレコードが複数ある場合、ユニークなROWIDを利用して重複レコードを削除する。

例)SELECTでROWIDを調べてから、該当するROWIDのデータを削除する。

SELECT ROWID FROM usertable WHERE col1 = 1;

ROWID
------------------
AAANGiAAEAAAC93AAA

DELETE FROM usertable WHERE ROWID = 'AAANGiAAEAAAC93AAA';



CASE式 (ある条件下での出力値の加工)
主にSELECT文中で使う。IF...THEN...ELSEの構文に対応する。



例)codeが10ならvalの値をcol3として返し、codeが20なら(100-val)をcol3として返す。

SELECT
    col1,
    col2,
    CASE code
        WHEN 10 THEN val
        WHEN 20 THEN 100 - val
    END AS col3
FROM datatable;



MERGE (insertとupdateの使い分け)
KEY(またはあるデータ)があればupdate、なければinsert処理を行うようなときに使用する。

MERGE INTO 表名A
USING 表名B  
ON ( 条件 )
WHEN MATCHED THEN 
    UPDATE SET 列名1 = 値1 ...
WHEN NOT MATCHED THEN 
    INSERT (列名1,...) VALUES ( 値1,... ) 

例)codeが10のデータがあればupdateし、なければinsert処理を行う。

MERGE INTO datatable t1 
USING (SELECT 10 AS code FROM DUAL) t2
ON (t1.code = t2.code )
WHEN MATCHED THEN
    UPDATE SET name = 'code10' WHERE code = 10
WHEN NOT MATCHED THEN
    INSERT (code,name) VALUES (10,'code10');



ダミー表 (dual)
システム情報を取得したり、組み込み関数による演算のみを行う際に使用する。

例)

SQL> SELECT SUBSTR('moshimoshikameyokamesannyo',5,10) FROM DUAL;

SUBSTR('MO
----------
imoshikame

SQL> SELECT sysdate FROM DUAL;

SYSDATE
---------
18-AUG-06



ソート時のNULL値の扱い
ソートを行う場合、NULL値はデフォルトでは最大値として扱われる。このためASCではNULLの項目が最後、DESCではNULLの項目が最初に表示される。このNULLの評価を逆にしたい(最小値として取り扱う)場合は、ASCではNULLS FIRST、DESCではNULLS LASTを併用する。

例)NULL値の項目を最後に表示する

SELECT * FROM datatable ORDER BY val DESC NULLS LAST;



辞書順ソートNLSSORT()で、大文字、小文字、半角、全角を同値とする
Oracle 10g から"NLS_SORT=JAPANESE_M_CI"と"CI(Case Ignore)"キーワードが追加されている。"CI"を追加すると大文字、小文字、全角、半角、ひらがな、カタカナにおいて、同じコードポイントを戻す。

以下は等価。

NLSSORT('a','NLS_SORT=JAPANESE_M_CI')
NLSSORT('A','NLS_SORT=JAPANESE_M_CI')
NLSSORT('A','NLS_SORT=JAPANESE_M_CI')

以下は等価。

NLSSORT('ア','NLS_SORT=JAPANESE_M_CI')
NLSSORT('ア','NLS_SORT=JAPANESE_M_CI')
NLSSORT('あ','NLS_SORT=JAPANESE_M_CI')



LIKE検索の条件の文字列に"%"や"_"を指定する方法
検索文字の"%"や"_"の前にエスケープ文字を付け、ESCAPEの後にそのエスケープ文字を指定する。

例)WHERE a LIKE '%CONT\%_' ESCAPE '\'