Допустим, моя база данных имеет несколько записейУдалить все направо, начиная с определенного символа
2345
2532-1
2593-R2
2380
2013-E1
Как я обрезать все справа от тире «-» в том числе самого тире сохраняя при этом все числа до?
Допустим, моя база данных имеет несколько записейУдалить все направо, начиная с определенного символа
2345
2532-1
2593-R2
2380
2013-E1
Как я обрезать все справа от тире «-» в том числе самого тире сохраняя при этом все числа до?
Вы можете использовать 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>
... но это может быть медленнее, хотя код короче.
Сначала вы находите положение тире через INSTR. Затем используйте SUBSTR, чтобы перейти от позиции 1 к тире.
SELECT SUBSTR(value, 1, INSTR(value,'-')) FROM table;
Это, похоже, не возвращает записи, в которых нет дефиса. –
Будет ли использование NVL работать или это имеет какие-либо последствия? Я действительно пытался сделать NVL (SUBSTR (значение, 1, (INSTR (значение, '-')) - 1), значение), и он сработал. Спасибо за идею «-1». –
@MikeSanchez - Я не думаю, что у него есть какие-то последствия, хотя кто-то, пришедший позже, чтобы посмотреть на код, может оказаться труднее понять. (Худший случай: ваша колонка не является нулевой, а кто-то предполагает недоразумения, поэтому NVL является избыточным и удаляет его - нарушая функциональность). Плюсы и минусы всего, хотя * 8-) –