2015-05-12 3 views

ответ

3

Вы можете использовать substr с instr, но вы должны изменить второй аргумент substr в зависимости от того, имеет ли значение тир на все, что вы можете сделать с сазом:

select substr(value, 1, 
    case 
    when instr(value, '-') > 0 then instr(value, '-') - 1 
    else length(value) 
    end) 
from <your table>; 

instr(value, '-') дает ваше положение первого - в значении, или ноль, если оно вообще не отображается. Если он равен нулю, вам нужна полная строка, поэтому вы можете использовать длину; иначе вы хотите до символа до -. Или вы можете сделать только подстроку вообще, если есть - и использовать необработанное значение в противном случае, что может быть немного аккуратнее:

select case 
    when instr(value, '-') > 0 then substr(value, 1, instr(value, '-') - 1) 
    else value 
    end 
from <your table>; 

Быстрый демо с вашими значениями выборок:

with t (value) as (
    select '2345' from dual 
    union all select '2532-1' from dual 
    union all select '2593-R2' from dual 
    union all select '2380' from dual 
    union all select '2013-E1' from dual 
) 
select value, 
    case 
    when instr(value, '-') > 0 then substr(value, 1, instr(value, '-') - 1) 
    else value 
    end 
from t; 

VALUE CASEWHE 
------- ------- 
2345 2345 
2532-1 2532 
2593-R2 2593 
2380 2380 
2013-E1 2013 

Вы Можно даже использовать регулярное выражение, которое соответствует всем до первого -:

select regexp_substr(value, '[^-]*') 
from <your table> 

... но это может быть медленнее, хотя код короче.

+0

Будет ли использование NVL работать или это имеет какие-либо последствия? Я действительно пытался сделать NVL (SUBSTR (значение, 1, (INSTR (значение, '-')) - 1), значение), и он сработал. Спасибо за идею «-1». –

+1

@MikeSanchez - Я не думаю, что у него есть какие-то последствия, хотя кто-то, пришедший позже, чтобы посмотреть на код, может оказаться труднее понять. (Худший случай: ваша колонка не является нулевой, а кто-то предполагает недоразумения, поэтому NVL является избыточным и удаляет его - нарушая функциональность). Плюсы и минусы всего, хотя * 8-) –

0

Сначала вы находите положение тире через INSTR. Затем используйте SUBSTR, чтобы перейти от позиции 1 к тире.

SELECT SUBSTR(value, 1, INSTR(value,'-')) FROM table; 
+1

Это, похоже, не возвращает записи, в которых нет дефиса. –

Смежные вопросы