Я использую Oracle SQL (в SQLDeveloper, поэтому у меня нет доступа к командам SQLPLUS, таким как COLUMN) для выполнения запроса, который выглядит примерно так:
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? До сих пор все мои поисковые запросы в Интернете не появлялись особо, поскольку все результаты веб-поиска показывают мне, как это сделать, используя команды форматирования, такие как COLUMN в SQLPLUS (которых у меня нет).


Что вы используете для получения результатов? Вставленный вами вывод выглядит так, как будто он поступает из 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';
Хороший вопрос. Мне действительно пришлось подумать об этом.
Вы можете изменить свой SQL так, чтобы он возвращал только самые узкие используемые столбцы.
например (Я не очень разбираюсь в синтаксисе оракула, но что-то подобное должно работать):
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.
Если я что-то не понял, обновите свой вопрос, и я попробую еще раз :)
Я попытался вставить часть вашего ответа в SQLDeveloper, но Oracle, похоже, задыхается от преобразования. Я думаю, что Oracle convert работает иначе. Однако использование подстроки (substr) полезно.
Возможности sql ограничены вашим инструментом. В SQL Plus есть команды для форматирования столбцов, но они не очень просты в использовании.
Один из быстрых подходов - вставить результат в Excel и отформатировать его там или просто прикрепить электронную таблицу. Некоторые инструменты сохраняют результат прямо в виде электронной таблицы.
Хорошо, это неплохой вариант. Я только что проверил, и у SQL Developer есть возможность экспортировать результаты в виде файла CVS или XLS.
Если у вас не было возвращено много строк, я часто использую функцию Том Кайтс 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, деловые люди по какой-то причине любят превосходство.
В своем заявлении вы можете указать тип вывода, который вы ищете:
select /*csv*/ col1, col2 from table;
select /*Delimited*/ col1, col2 from table;
доступны другие форматы, такие как xml, html, text, loader и т. д.
Вы можете изменить форматирование этих конкретных параметров в разделе инструменты> настройки> База данных> Утилиты> Экспорт.
Обязательно выберите «Выполнить сценарий», а не «Выполнить оператор».
* это для Oracle SQL Developer v3.2
Почему бы просто не использовать функцию "cast"?
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';
Как уже упоминалось, я использую Oracle SQLDeveloper (бесплатный инструмент - я дешевый!). Он может использовать команды SQLPLUS, но он не позволяет мне использовать команду COLUMN или большинство других SQLPLUS. Хотя использование substr (col, width) - это то, что мне нужно - это помогает! Большой!