Подтвердить что ты не робот

Как выбрать подстроку в Oracle SQL до определенного символа?

Скажем, у меня есть столбец таблицы, который имеет такие результаты, как:

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

Я хотел бы написать запрос, который выбирает этот столбец из указанной таблицы, но возвращает только подстроку до символа Underscore (_). Например:

ABC
DEFGH
IJKLMNOP

Функция SUBSTRING, похоже, не соответствует задаче, потому что она позиционируется и положение подчеркивания меняется.

Я думал о функции TRIM (функция RTRIM):

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

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

4b9b3361

Ответ 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