Как выбрать подстроку в Oracle SQL до определенного символа?
Скажем, у меня есть столбец таблицы, который имеет такие результаты, как:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Я хотел бы написать запрос, который выбирает этот столбец из указанной таблицы, но возвращает только подстроку до символа Underscore (_). Например:
ABC
DEFGH
IJKLMNOP
Функция SUBSTRING, похоже, не соответствует задаче, потому что она позиционируется и положение подчеркивания меняется.
Я думал о функции TRIM (функция RTRIM):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Но я не уверен, как бы я мог заставить это работать, поскольку только кажется, что он удаляет определенный список/набор символов, и я действительно только после символов, ведущих к символу Underscore.
Ответы
Ответ 1
Использование комбинации SUBSTR, INSTR и NVL (для строк без подчеркивания) вернет то, что вы хотите:
SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
FROM DUAL
Результат:
output
------
ABC
Использование:
SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
FROM YOUR_TABLE t
Справка:
Добавление
Если вы используете Oracle10g +, вы можете использовать regex через REGEXP_SUBSTR.
Ответ 2
Это можно сделать с помощью REGEXP_SUBSTR.
Пожалуйста, используйте
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
где STRING_EXAMPLE - ваша строка.
Try:
SELECT
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
from dual
Это решит вашу проблему.
Ответ 3
Вам нужно получить позицию первого подчеркивания (используя INSTR), а затем получить часть строки с 1-го charecter до (pos-1) с помощью substr.
1 select 'ABC_blahblahblah' test_string,
2 instr('ABC_blahblahblah','_',1,1) position_underscore,
3 substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
4* from dual
SQL> /
TEST_STRING POSITION_UNDERSCORE RES
---------------- ------------------ ---
ABC_blahblahblah 4 ABC
Документация Instr
Документация Susbtr
Ответ 4
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
- правильный ответ, как опубликовал пользователь1717270
Если вы используете INSTR
, он даст вам позицию для строки, которая предполагает, что она содержит в ней "_". Что, если это не так? Ну, ответ будет равен 0. Поэтому, когда вы хотите напечатать строку, она напечатает a NULL
.
Пример. Если вы хотите удалить домен из "host.domain". В некоторых случаях у вас будет только короткое имя, то есть "хост". Скорее всего, вы хотите напечатать "host". Ну, с INSTR
он даст вам NULL
, потому что он не нашел никакого ".", То есть он будет печатать от 0 до 0. С помощью REGEXP_SUBSTR
вы получите правильный ответ во всех случаях:
SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1) from dual;
HOST
и
SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1) from dual;
HOST
Ответ 5
Другой возможностью может быть использование REGEXP_SUBSTR.
Ответ 6
Помните об этом, если все ваши строки в столбце не имеют подчеркивания
(... или иначе, если нулевым значением будет вывод):
SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1),
"STRING_COLUMN")
AS OUTPUT FROM DUAL
Ответ 7
Чтобы найти любую подстроку из большой строки:
string_value:=('This is String,Please search string 'Ple');
Затем, чтобы найти строку 'Ple'
из String_value
, мы можем сделать так:
select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
Вы найдете результат: Ple