Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помощь с запросом / 4 сообщений из 4, страница 1 из 1
25.04.2020, 15:42
    #39951354
User904
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом
Здравствуйте, помогите, пожалуйста с запросом.

В столбце num содержатся числовые значения (положительные, отрицательные, дробные).
Требуется оставить первые 2 цифры, а остальные заменить на 0, если число 5-значное и меньше (53046 -> 53000)
первые 3 цифры, если число от 6-значного до 19-значного (839593954.87 -> 839000000.00)
и первые 8 цифр, если число 20-значное и больше (-435763857636583756478356 -> -435763850000000000000000)

У меня получилось написать такой запрос на Oracle с помощью regexp_relace, которая принимает 6 параметров и где я смог указать с какого символа начать замену. Но мне нужно сделать это на Hive/Impala, где принимаются только 3 первых параметра. Какие функции мне нужно использовать дополнительно?

SELECT case
when data.num BETWEEN 1 AND 99999
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '3', '0', 'c')
when data.num BETWEEN 100000 AND 9999999999999999999
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '4', '0', 'c')
when data.num > 9999999999999999999
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '9', '0', 'c')
when data.num BETWEEN -99999 AND 0
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '3', '0', 'c')
when data.num BETWEEN -9999999999999999999 AND -100000
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '4', '0', 'c')
when data.num < -9999999999999999999
then regexp_replace (data.num, '1|2|3|4|5|6|7|8|9' , '0', '9', '0', 'c')
FROM data
WHERE data.num IS NOT NULL
...
Рейтинг: 0 / 0
25.04.2020, 16:11
    #39951363
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом
Горе от ума.


1.

FROM data

Нет у нас ваших данных.

2. Проще подходите. Самое примитивное - самое действенное. Как добить нулями, сходу не сообразил, коллеги подскажут.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t (N) as (
select '1990' from dual union all
select '1234' from dual union all
select '2003941' from dual union all
select '29385764635635354' from dual union all
select '958567847476586629385764635635354' from dual union all
select '19404850847508475456O96598695869586' from dual
)

select n,
       case
         when length (n) < 6 then
            substr(n, 1, 2) || '_case1'
         when length (n) < 19 then 
            substr(n, 1, 3) || '_case2'
         else
            substr(n, 1, 8) || '_case3'
       end shit
from t
...
Рейтинг: 0 / 0
25.04.2020, 16:35
    #39951374
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом
User904
числовые значения
Допиливай
Код: plsql
1.
2.
3.
select n,
       trunc(n, case when p < 6 then 2 - p when p < 20 then 5 - p else 8 - p end) x
  from (select n, trunc(log(10, n) + 1) p from t)
...
Рейтинг: 0 / 0
25.04.2020, 16:36
    #39951376
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помощь с запросом / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]