Как получить ближайшее значение от oracle - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть таблица, как показано ниже, и тип данных столбца A Varchar2, и, предположим, если я введу 8200.11 в качестве ввода, я должен получить 8200.13, что является ближайшим значением. Как я получу его в oracle?

A
8200.13
7300.46
8100.98
8200.01

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

В Oracle 12 C вы должны сделать:

select a
from t
where a is not null
order by abs(to_number(a) - 8200.11)
fetch first 1 row only;

Хотя синтаксис keep в порядке, в более ранних версиях это, вероятно, записывалось с подзапросом:

select t.*
from (select a
      from t
      where a is not null
      order by abs(to_number(a) - 8200.11)
     ) t
where rownum = 1;

Вы не должны хранить числовые значения c в виде строк.

1 голос
/ 19 апреля 2020

Демонстрационная настройка:

create table demo (a) as 
select column_value
from   table(sys.ora_mining_number_nt(8200.13, 7300.46, 8100.98, 8200.01));

Тест:

select min(a)
       keep (dense_rank first
             order by abs(a - 8200.11)) as closest
from   demo;

   CLOSEST
----------
   8200.13

1 row selected.

SQL Скрипка

Функция first возвращает первое значение x в порядке y . (Существует также соответствующая функция last.) Подробнее

Если столбец является varchar2 (почему?), То неявное преобразование в число должно работать, если столбец не содержит неожиданные значения. Начиная с 12.2 вы можете избежать ошибок преобразования:

select min(a)
       keep (dense_rank first
             order by abs(to_number(a default null on conversion error) - 8200.11)) as closest
from   demo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...