powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Побитовая конвертация
10 сообщений из 10, страница 1 из 1
Побитовая конвертация
    #39936030
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Пытаюсь решить задачку, как можно из строки с числом к примеру 234 получить результат '01110'. Значение 2, 3 и 4 это позиция в строке '00000'. Т.е 2 это единичка на втором бите. 3-ка в третьем бите. Это все можно сделать в Select'е ?
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936034
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача какая-то сферично вакуумная

Сдвиг и побитовый OR

Поскольку по формулировке битов быть может не больше 9 штук (1..9), захордкодить 9-ть substr'ов в SELECT'е проблем быть не должно.

https://docs.oracle.com/cd/E22583_01/DR/help/Bit_Binary_Functions.html#DALc02a_2726006080_257082
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936046
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Dr_Grizzly,

Код: plsql
1.
2.
3.
4.
5.
6.
       reverse(
         translate(
           translate('123456789',s,'---------'),
           '-123456789',
           '1000000000'
          )) as res


пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t(s) as (
  select * from table(sys.odcivarchar2list('234' ,'19','7','62'))
)
select s,
       reverse(
         translate(
           translate('123456789',s,'---------'),
           '-123456789',
           '1000000000'
          )) as res
from t

...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936047
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
протупил - реверс не нужен:
Код: plsql
1.
2.
3.
4.
5.
         translate(
           translate('987654321',s,'---------'),
           '-123456789',
           '1000000000'
          ) as res

пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t(s) as (
  select * from table(sys.odcivarchar2list('234' ,'19','7','62'))
)
select s,
         translate(
           translate('987654321',s,'---------'),
           '-123456789',
           '1000000000'
          ) as res
from t

...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936049
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with data as (select 234 num from dual)
select  lpad(sum(power(10,digit)),5,'0') res
  from  data,
        lateral(select substr(num,level,1) - 1 digit from dual connect by level <= length(num))
/

RES
--------------------
01110

SQL>



SY.
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936056
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Dr_Grizzly
Т.е 2 это единичка на втором бите
палиндром в качестве примера, конечно, фееричен ты биты откуда считаешь? справа или слева?
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936183
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
Dr_Grizzly
Т.е 2 это единичка на втором бите
палиндром в качестве примера, конечно, фееричен ты биты откуда считаешь? справа или слева?
в нормальном виде справа налево, а моем варианте наоборот как раз нужно :))

Я попробовал функциешку нарисовать
loop
exit when v_cnt > length(p_val);
v_num := substr(p_val, v_cnt, 1);
v_res1 := utl_raw.bit_or(v_res1,rpad(lpad('1',v_num,'0'),6,'0')); --Догоняем нулями до 6 знаков, чтобы было четное количество, для преобразования в байт
v_cnt := v_cnt + 1;
end loop;
return v_res1;
которую в селект запихнул, впринципе работает )) но вот в самом селекте было б интересней ))
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936192
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with data as (select 234 num from dual)
select  lpad(sum(power(10,digit)),5,'0') res
  from  data,
        lateral(select substr(num,level,1) - 1 digit from dual connect by level <= length(num))
/

RES
--------------------
01110

SQL>



SY.


Изящное решение! Жаль что у меня 11 оракл (( а он не знает lateral
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936207
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> l
  1  with t as (
  2    select '234' s from dual union all
  3    select '15' s from dual)
  4  ,b as (select level l from dual connect by level<=5)
  5  select s,listagg(case when instr(s,to_char(l))>0 then '1' else '0' end,'') within group(order by l) code
  6  from t,b
  7* group by s
SQL> /

S   CODE
--- ----------
15  10001
234 01110



....
stax
...
Рейтинг: 0 / 0
Побитовая конвертация
    #39936218
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly
Изящное решение!
Это больше трюкачество. Да, на подобное можно любоваться, как на выставке.
А на практике процедурный подход сопровождаемей и повторно используемей.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Побитовая конвертация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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