Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Replace / 25 сообщений из 52, страница 1 из 3
06.02.2017, 17:37
    #39399466
Lary Denis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Задачка с собеседования. Как используя только один replace (не regexp_replace), обрезать строки до первого символа x.
То есть на входном наборе
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (
select 'abcdefxzw4242'   str from dual union all
select '123x343'         str from dual union all
select '00f03xe12x'      str from dual union all
select '0123456789'      str from dual
)
select str
from t


Получить

strabcdef12300f030123456789
...
Рейтинг: 0 / 0
06.02.2017, 17:45
    #39399479
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Lary DenisКак используя только один replace (не regexp_replace), обрезать строки до первого символа x.Нельзя. Но для всяких гуёв видимость создать можно.
Код: plsql
1.
2.
chr(0)
chr(10)

...
Рейтинг: 0 / 0
06.02.2017, 17:59
    #39399494
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Lary Denis,

Можно один replace и один rtrim.

Слабо верится, что кто-то может такое спросить на собеседовании.
...
Рейтинг: 0 / 0
06.02.2017, 18:03
    #39399500
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
dbms_photoshopLary Denis,

Можно один replace и один rtrim.

Слабо верится, что кто-то может такое спросить на собеседовании.А, еще недокументированный reverse. :)
...
Рейтинг: 0 / 0
06.02.2017, 18:05
    #39399504
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
dbms_photoshopМожно один replace и один rtrim.Икс останется.
...
Рейтинг: 0 / 0
06.02.2017, 18:13
    #39399515
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Elic,

Код: plaintext
replace(str, ltrim(str, '1234567890abcdefghijklmnopqrstuvwyz'))
...
Рейтинг: 0 / 0
06.02.2017, 18:18
    #39399525
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
dbms_photoshop
Код: plaintext
'1234567890abcdefghijklmnopqrstuvwyz'
Магия исходных данных. При том, что задача сформулирована в общем виде.
...
Рейтинг: 0 / 0
06.02.2017, 18:20
    #39399528
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Elic,

Насколько серьезная сама задача, настолько серьезное решение.
...
Рейтинг: 0 / 0
06.02.2017, 18:27
    #39399537
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
dbms_photoshopНасколько серьезная сама задача, настолько серьезное решение.Условия всё равно ж не выполнены.
...
Рейтинг: 0 / 0
06.02.2017, 18:32
    #39399543
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
ElicУсловия всё равно ж не выполнены.

А условия из серии "казнить нельзя помиловать". Значит ли "один replace" replace и только replace или replace может использоваться только один раз.

SY.
...
Рейтинг: 0 / 0
06.02.2017, 18:37
    #39399549
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
SYЗначит ли "один replace" replace и только replace или replace может использоваться только один раз.Сам об этом задумывался. Но на "решаемость" такое трактование не влияет.
...
Рейтинг: 0 / 0
06.02.2017, 18:46
    #39399554
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (
select 'abcdefxzw4242'   str from dual union all
select '123x343'         str from dual union all
select '00f03xe12x'      str from dual union all
select '0123456789'      str from dual
)
select replace(str,'x',rpad('x',4000)) from t;
...
Рейтинг: 0 / 0
06.02.2017, 18:51
    #39399559
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
orawish
Код: plsql
1.
rpad('x',4000)

Тут не "только один replace". И тоже лишь видимость :)
...
Рейтинг: 0 / 0
06.02.2017, 18:52
    #39399560
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
ElicСам об этом задумывался. Но на "решаемость" такое трактование не влияет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t as (
           select 'abcdefxzw4242'   str from dual union all
           select '123x343'         str from dual union all
           select '00f03xe12x'      str from dual union all
           select '0123456789'      str from dual
          )
select  str,
        replace(str,substr(str,nullif(instr(str,'x'),0))) new_str
  from  t
/

STR           NEW_STR
------------- -------------
abcdefxzw4242 abcdef
123x343       123
00f03xe12x    00f03
0123456789    0123456789

SQL> 



Хотя replace тут как попу гармонь.

SY.
...
Рейтинг: 0 / 0
06.02.2017, 18:54
    #39399563
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
SYХотя replace тут как попу гармонь.Ага.
...
Рейтинг: 0 / 0
06.02.2017, 19:04
    #39399572
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
бл*, что за олдфаги с детскими психотравмами дают такие задачи на собесах??
...
Рейтинг: 0 / 0
06.02.2017, 19:05
    #39399573
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
ok, ok без pad-ов:

нажать на пробел и держать достаточно долго
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (
select 'abcdefxzw4242'   str from dual union all
select '123x343'         str from dual union all
select '00f03xe12x'      str from dual union all
select '0123456789'      str from dual
)
select replace(str,'x','x    ') from t;



а вообще, имхо (про вопрос) - дурь причем, вялая
...
Рейтинг: 0 / 0
07.02.2017, 09:35
    #39399803
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
with t as (
select 'abcdefxzw4242' str from dual union all
select '123x343' str from dual union all
select '00f03xe12x' str from dual union all
select '0123456789' str from dual
)
select regexp_replace (str,'x.*','')
from t
...
Рейтинг: 0 / 0
07.02.2017, 10:20
    #39399826
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
fortnetregexp_replaceГлаза разул?
Lary Denis(не regexp_replace)
...
Рейтинг: 0 / 0
07.02.2017, 11:27
    #39399887
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Lary Denis,

А в чём сложность?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with t as (
select 'abcdefxzw4242'   str from dual union all
select '123x343'         str from dual union all
select '00f03xe12x'      str from dual union all
select '0123456789'      str from dual
)
select replаce(str,'x',chr(19)||chr(27)) s from t;


S                                                                              
-----------------
abcdef                                                                          
123                                                                             
00f03                                                                           
0123456789   

 



Код: plsql
1.
2.
3.
4.
5.
6.
create or replace function replаce(i_str varchar2, i_ser varchar2, i_rep varchar2 := chr(18)) return varchar2
is
begin
 return nvl(substr(i_str,1,instr(i_str,i_ser,1)-1),i_str);
end;
/



з.ы. где вы такие собеседования находите-то? О_о
...
Рейтинг: 0 / 0
07.02.2017, 11:45
    #39399907
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Lary Denis,

Один replace, говорите?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (
select 'abcdefxzw4242'   str from dual union all
select '123x343'         str from dual union all
select '00f03xe12x'      str from dual union all
select '0123456789'      str from dual
)
select str, xmlquery('for $i in /s return replace($i,"(x).*","")' passing xmltype('<s>'||str||'</s>') returning content).GetStringVal() s
from t;
...
Рейтинг: 0 / 0
07.02.2017, 11:49
    #39399912
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Elic,

да,да, конечно технически это regexp_replace, но формально....
...
Рейтинг: 0 / 0
07.02.2017, 11:55
    #39399915
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
envда,да, конечно технически это regexp_replace, но формально....Технически это XQuery.
...
Рейтинг: 0 / 0
07.02.2017, 11:59
    #39399917
Replace
env,

To: Referent

Subj: URGENT REPLACE

Replace all strings in document by its substring to first letter x.

Very urgent.

Big Boss.
...
Рейтинг: 0 / 0
07.02.2017, 12:12
    #39399928
Glays
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Смотря что за вакансияenv,

To: Referent

Subj: URGENT REPLACE

Replace all strings in document by its substring to first letter x.

Very urgent.

Big Boss.

LENGTH можно тоже заменить на 4000, только считаться будет долго. Ну и MOD не придумал как заменить.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
WITH t
     AS (SELECT 'abcdefxzw4242' str FROM DUAL
         UNION ALL
         SELECT '123x343' str FROM DUAL
         UNION ALL
         SELECT '00f03xe12x' str FROM DUAL
         UNION ALL
         SELECT '0123456789' str FROM DUAL),
     asdf
     AS (    SELECT 'x' || CHR (LEVEL + 96) AS mask, 'xx' AS r_mask, LEVEL AS cnt
               FROM DUAL
         CONNECT BY LEVEL <= 23
         UNION ALL
         SELECT 'xy' AS mask, 'xx' AS r_mask, 24 AS cnt FROM DUAL
         UNION ALL
         SELECT 'xz' AS mask, 'xx' AS r_mask, 25 AS cnt FROM DUAL
         UNION ALL
             SELECT 'x' || TO_CHAR (LEVEL - 1) AS mask,
                    'xx' AS r_mask,
                    LEVEL + 25 AS cnt
               FROM DUAL
         CONNECT BY LEVEL <= 10
         UNION ALL
         SELECT 'xx' AS mask, 'x' AS r_mask, 36 AS cnt FROM DUAL
         UNION ALL
         SELECT 'x' AS mask, NULL AS r_mask, -1 AS cnt
           FROM DUAL),
     repl (str,
           mask,
           r_mask,
           cnt)
     AS (SELECT str AS str,
                mask,
                r_mask,
                LENGTH (str) * 36 AS cnt
           FROM t, asdf
          WHERE asdf.cnt = 1
         UNION ALL
         SELECT REPLACE (str, asdf.mask, asdf.r_mask) AS str,
                asdf.mask,
                asdf.r_mask,
                repl.cnt - 1 AS cnt
           FROM repl, asdf
          WHERE    asdf.cnt = MOD (repl.cnt, 36) + 1 AND repl.cnt - 1 >= 0
                OR (repl.cnt = 0 AND asdf.cnt = -1))
SELECT *
  FROM repl
 WHERE cnt = -1


Я принят?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Replace / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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