Substr дает неправильный вывод в sql в oracle - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица ot.plan:

с

NAME                                                                            
--------------------------------------------------------------------------------
EXISTS(SELECT 1 from zzz_temp b where SUBSTR(a.hehrircal,1,4)=b.acc_num         
EXISTS(SELECT 1 from zzz_temp b where SUBSTR(a.clinet,1,4)=b.acc_num  

Мой ожидаемый результат:

 NAME                                                                            
    --------------------------------------------------------------------------------
    zzz_temp
    zzz_temp

Я пытался:

select SUBSTR(name,INSTR(name,'from')+5,INSTR(name,'b')) from ot.plan;

Это дает мне вывод:

zzz_temp b where SUBSTR(a.hehri
zzz_temp b where SUBSTR(a.cline

Как я могу решить это?

Ответы [ 3 ]

4 голосов
/ 17 марта 2020

Вы можете достичь желаемого результата, используя regexp_substr следующим образом:

Select regexp_substr(name, 'from (.+) b',1,1,null,1)
  From ot.plan;

Cheers !!

1 голос
/ 17 марта 2020

выберите SUBSTR (имя, INSTR (имя, 'из') + 5, INSTR (имя, 'b') - INSTR (имя, 'из') + 5) из ot.plan; все еще не работает

Вы пытаетесь вычесть одно число из другого, но как часть этого у вас есть дополнение. Вам нужно либо заключить вторую часть в скобки:

select SUBSTR(name,INSTR(name,'from')+5,INSTR(name,' b')-(INSTR(name,'from')+5)) from ot.plan;

SUBSTR(NAME,INSTR(NAME,'FROM')+5,INSTR(NAME,'B')-(INSTR(NAME,'FROM')+5)
-----------------------------------------------------------------------
zzz_temp
zzz_temp

или изменить плюс на минус:

select SUBSTR(name,INSTR(name,'from')+5,INSTR(name,' b')-INSTR(name,'from')-5) from ot.plan;

SUBSTR(NAME,INSTR(NAME,'FROM')+5,INSTR(NAME,'B')-INSTR(NAME,'FROM')-5) 
-----------------------------------------------------------------------
zzz_temp
zzz_temp

Вы можете посмотреть на отдельные числа, чтобы понять, что он делает :

select
  INSTR(name,'from') as start_from,
  INSTR(name,'from')+5 as start_table,
  INSTR(name,' b') as b,
  INSTR(name,' b')-(INSTR(name,'from')+5) as length_a,
  INSTR(name,' b')-INSTR(name,'from')-5 as length_b
from ot.plan;

START_FROM START_TABLE          B   LENGTH_A   LENGTH_B
---------- ----------- ---------- ---------- ----------
        17          22         30          8          8
        17          22         30          8          8

Первые три - это позиции символов, которые вы ищете; длины - это две вариации вычитания, поэтому в целом показано, что вы ищете 8 символов, начиная с позиции 22.

Однако, учитывая хрупкость этого, как упомянуто в комментариях, вам, вероятно, лучше в любом случае с использованием регулярных выражений.

1 голос
/ 17 марта 2020

Вы, кажется, думаете, что последний параметр - это позиция, на которой стоит остановиться. На самом деле это количество символов, которое нужно включить в результат.

Попробуйте вычесть начальную позицию из конечной позиции, чтобы определить длину.

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