Условный формат столбца в SQL * Plus - PullRequest
0 голосов
/ 13 сентября 2018

Мне нужно отформатировать сообщение в SQL * Plus, основываясь на длине возвращаемых значений и длине имени столбца (в моем случае это «главная_резона »).

Результат оператора select:

head_results
**********************************************************
value_1 
value_11
value_222222222
value_99999999999999999999999999999999999999999999999999999999999999

Мне нужно отформатировать длину столбца "head_results" на основе самых больших значений длины, возвращаемых в любой строке (в данном случае length('value_99999999999999999999999999999999999999999999999999999999999999')). В случае, если не возвращено значение или если наибольшее возвращенное значение длины меньше length ('head_results'), отформатируйте длину column_name к его длине.

Возможно ли это в SQL * Plus?

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете использовать переменную подстановки и синтаксис SQL * Plus column ... new_value ..., чтобы определить ее значение из запроса:

column col_width new_value col_width noprint

select greatest(nvl(max(length(head_results)), 0), length('head_results')) as col_width
from your_table;

column head_results format "a&col_width"

Запрос:

  • находит самое длинное значение в таблице с max(length(head_results));
  • по умолчанию это ноль, если есть только нули (или нет данных) с nvl(..., 0);
  • находит большее из этого значения и фиксированной строки с помощью greatest(..., length('head_results')), хотя вы можете использовать фиксированное значение 12, если хотите,
  • и дает результат этого выражения псевдоним col_width.

Тогда column col_width new_value col_width noprint позволяет использовать col_width в качестве переменной подстановки, которая наследует значение из запроса.

Затем column head_results format "a&col_width" устанавливает ширину столбца на количество символов, возвращаемых запросом, используя эту переменную подстановки - a&col_width переводится в a12, или a15, или a68, или что-то еще.

Когда вы выполняете фактический запрос, этот столбец будет отображаться с такой шириной.


Демонстрация с фиктивной таблицей, изначально с одним коротким значением, ширина заголовка составляет 12 символов:

create table your_table (head_results varchar2(80));
insert into your_table (head_results)
values ('value_1');

1 row inserted.

set termout off
column col_width new_value col_width noprint
select greatest(nvl(max(length(head_results)), 0),
  length('head_results')) as col_width
from your_table;
column head_results format "a&col_width"
set termout on

select head_results from your_table;

HEAD_RESULTS
------------
value_1

При увеличении добавленной стоимости он становится немного шире:

insert into your_table (head_results)
values ('value_222222222');

1 row inserted.

set termout off
column col_width new_value col_width noprint
select greatest(nvl(max(length(head_results)), 0), length('head_results')) as col_width
from your_table;
column head_results format "a&col_width"
set termout on

select head_results from your_table;

HEAD_RESULTS   
---------------
value_1
value_222222222

И с вашим самым длинным значением он все еще достаточно широк:

insert into your_table (head_results)
values ('value_99999999999999999999999999999999999999999999999999999999999999');

1 row inserted.

set termout off
column col_width new_value col_width noprint
select greatest(nvl(max(length(head_results)), 0), length('head_results')) as col_width
from your_table;
column head_results format "a&col_width"
set termout on

select head_results from your_table;

HEAD_RESULTS                                                        
--------------------------------------------------------------------
value_1
value_222222222
value_99999999999999999999999999999999999999999999999999999999999999
...