Oracle SQL のテキストのみの選択出力をフォーマットする方法
-
02-07-2019 - |
質問
Oracle SQL (SQLDeveloper で使用しているため、COLUMN などの SQLPLUS コマンドにアクセスできません) を使用して、次のようなクエリを実行しています。
select assigner_staff_id as staff_id, active_flag, assign_date,
complete_date, mod_date
from work where assigner_staff_id = '2096';
結果は次のようになります。
STAFF_ID ACTIVE_FLAG ASSIGN_DATE COMPLETE_DATE MOD_DATE ---------------------- ----------- ------------------------- ------------------------- ------------------------- 2096 F 25-SEP-08 27-SEP-08 27-SEP-08 02.27.30.642959000 PM 2096 F 25-SEP-08 25-SEP-08 25-SEP-08 01.41.02.517321000 AM 2 rows selected
これにより、結果を電子メールや問題レポートなどに適切にフォーマットされた簡単なテキスト ブロックとして貼り付けようとすると、非常に広範囲で扱いにくいテキスト レポートが簡単に作成されてしまう可能性があります。プレーンバニラの Oracle SQL だけを使用している場合に、出力列の余分な空白をすべて削除する最善の方法は何ですか?これまでのところ、Web 検索結果はすべて、SQLPLUS の COLUMN などの書式設定コマンド (私は持っていません) を使用して行う方法を示しているため、あまりヒットしませんでした。
解決
結果を得るために何を使用していますか?貼り付けた出力は SQL*PLUS からのもののように見えます。結果の生成に使用しているツールには、出力を変更する何らかの方法がある可能性があります。
デフォルトでは、Oracle はタイトルの幅または列データの幅の広い方に基づいて列を出力します。
列を小さくしたい場合は、列の名前を変更するか、テキストに変換して substr() を使用してデフォルトを小さくする必要があります。
select substr(assigner_staff_id, 8) as staff_id,
active_flag as Flag,
to_char(assign_date, 'DD/MM/YY'),
to_char(complete_date, 'DD/MM/YY'),
mod_date
from work where assigner_staff_id = '2096';
他のヒント
ステートメントでは、探している出力のタイプを指定できます。
select /*csv*/ col1, col2 from table;
select /*Delimited*/ col1, col2 from table;
xml、html、テキスト、ローダーなどの他の形式も利用できます。
これらの特定のオプションの書式設定は、[ツール] > [環境設定] > [データベース] > [ユーティリティ] > [エクスポート] で変更できます。
必ず「ステートメントの実行」ではなく「スクリプトの実行」を選択してください。
* これは Oracle SQL Developer v3.2 用です
SQL でできることはツールによって制限されます。SQL Plus には列をフォーマットするコマンドがありますが、実際には使いやすいものではありません。
簡単な方法の 1 つは、出力を Excel に貼り付けてそこで書式設定するか、スプレッドシートを添付することです。一部のツールでは、出力をスプレッドシートとして直接保存します。
いい質問ですね。本当に考えなければなりませんでした。
できることの 1 つは、使用可能な最も狭い列のみを返すように SQL を変更することです。
例えば(私は oracle 構文についてはあまり詳しくありませんが、同様のものが機能するはずです):
select substring( convert(varchar(4), assigner_staff_id), 1, 4 ) as id,
active_flag as act, -- use shorter column name
-- etc.
from work where assigner_staff_id = '2096';
それは理にかなっていますか?
これを unix/linux で実行している場合は、コマンドラインから実行し、awk スクリプトを介してパイプ処理することをお勧めします。
私が理解を誤っていた場合は、質問を更新してください。もう一度質問します:)
返される行がそれほど多くない場合は、よく使用します トム・カイツ print_table 関数。
SQL> set serveroutput on
SQL> execute print_table('select * from all_objects where rownum < 3');
OWNER : SYS
OBJECT_NAME : /1005bd30_LnkdConstant
SUBOBJECT_NAME :
OBJECT_ID : 27574
DATA_OBJECT_ID :
OBJECT_TYPE : JAVA CLASS
CREATED : 22-may-2008 11:41:13
LAST_DDL_TIME : 22-may-2008 11:41:13
TIMESTAMP : 2008-05-22:11:41:13
STATUS : VALID
TEMPORARY : N
GENERATED : N
SECONDARY : N
-----------------
OWNER : SYS
OBJECT_NAME : /10076b23_OraCustomDatumClosur
SUBOBJECT_NAME :
OBJECT_ID : 22390
DATA_OBJECT_ID :
OBJECT_TYPE : JAVA CLASS
CREATED : 22-may-2008 11:38:34
LAST_DDL_TIME : 22-may-2008 11:38:34
TIMESTAMP : 2008-05-22:11:38:34
STATUS : VALID
TEMPORARY : N
GENERATED : N
SECONDARY : N
-----------------
PL/SQL procedure successfully completed.
SQL>
行が多い場合は、SQL Developerでクエリを実行し、xlsとして保存します。ビジネスタイプは、何らかの理由でExcelを好みます。
「キャスト」機能を使ってみてはいかがでしょうか?
select
(cast(assigner_staff_id as VARCHAR2(4)) AS STAFF_ID,
(cast(active_flag as VARCHAR2(1))) AS A,
(cast(assign_date as VARCHAR2(10))) AS ASSIGN_DATE,
(cast(COMPLETE_date as VARCHAR2(10))) AS COMPLETE_DATE,
(cast(mod_date as VARCHAR2(10))) AS MOD_DATE
from work where assigner_staff_id = '2096';