Как правильно достать 10 мест струны в оракуле - PullRequest
24 голосов
/ 08 октября 2010

Я пытаюсь получить идентификатор из таблицы оракула.Это что-то вроде TN0001234567890345.То, что я хочу, это отсортировать значения по наиболее правым 10 позициям (например, 4567890345).Я использую Oracle 11g.Есть ли какая-нибудь функция для вырезания самых правых 10 мест в Oracle SQL?

Заранее спасибо

tismon

Ответы [ 4 ]

41 голосов
/ 08 октября 2010

Вы можете использовать функцию SUBSTR как:

select substr('TN0001234567890345',-10) from dual;

Выход:

4567890345
4 голосов
/ 29 марта 2018

Решение codaddict работает, если известно, что ваша строка имеет длину, равную ее длине. Однако, если у вас могут быть более короткие строки (например, обрезка до последних 10 символов и одна из строк для обрезки - «abc»), это возвращает ноль, что, вероятно, не то, что вы хотите.

Таким образом, вот слегка измененная версия, которая будет принимать самые правые 10 символов независимо от длины, пока они присутствуют:

select substr(colName, -least(length(colName), 10)) from tableName;
1 голос
/ 04 апреля 2014

Еще один способ сделать это, хотя и более утомительно. Используйте функции REVERSE и SUBSTR, как указано ниже:

SELECT REVERSE(SUBSTR(REVERSE('TN0001234567890345'), 1, 10)) FROM DUAL;

Первая функция REVERSE вернет строку 5430987654321000NT.

Функция SUBSTR будет читать нашу новую строку 5430987654321000NT от первого символа до десятого символа, который вернет 5430987654.

Последняя функция REVERSE вернет нашу исходную строку минус первые 8 символов, т.е. 4567890345

0 голосов
/ 19 апреля 2017

Да, это старый пост, но он появился в списке из-за того, что кто-то по какой-то причине его редактировал, и я был потрясен, что решение для регулярных выражений не включено! Итак, вот решение с использованием regex_substr в порядке упорядочения только для бесполезного упражнения. Регулярное выражение просматривает последние 10 символов в строке:

with tbl(str) as (
  select 'TN0001239567890345' from dual union
  select 'TN0001234567890345' from dual
)
select str
from tbl
order by to_number(regexp_substr(str, '.{10}$'));

Предполагается, что часть идентификатора строки содержит не менее 10 цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...