Как выбрать подстроку в Oracle SQL с точностью до конкретного символа? - PullRequest
70 голосов
/ 08 декабря 2010

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

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

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

ABC
DEFGH
IJKLMNOP

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

Я думал о функции TRIM (в частности, о функции RTRIM):

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

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

Ответы [ 7 ]

128 голосов
/ 08 декабря 2010

Использование комбинации 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 +, вы можете использовать регулярные выражения через REGEXP_SUBSTR .

36 голосов
/ 29 октября 2013

Это можно легко сделать с помощью REGEXP_SUBSTR .

Пожалуйста, используйте

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 

где STRING_EXAMPLE - ваша строка.

Попробуйте:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual

Это решит вашу проблему.

7 голосов
/ 08 декабря 2010

Вам нужно получить позицию первого подчеркивания (используя INSTR), а затем получить часть строки от 1-го символа до (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

6 голосов
/ 24 мая 2015
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual

- правильный ответ, отправленный пользователем1717270

Если вы используете INSTR, он даст вам позицию для строки, которая предполагает, что в ней содержится «_».Что если это не так?Ну, ответ будет 0. Поэтому, когда вы хотите напечатать строку, она напечатает NULL.Пример: если вы хотите удалить домен из «host.domain».В некоторых случаях у вас будет только короткое имя, то есть «хост».Скорее всего, вы хотели бы напечатать «хост».Ну, с INSTR он даст вам NULL, потому что он не нашел ".", То есть будет печатать от 0 до 0. С REGEXP_SUBSTR вы получите правильный ответ во всех случаях:

SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1)  from dual;

ХОСТ

и

SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1)  from dual;

ХОСТ

2 голосов
/ 08 декабря 2010

Другой возможностью было бы использование REGEXP_SUBSTR.

0 голосов
/ 28 сентября 2017

Чтобы найти любую подстроку из большой строки:

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

0 голосов
/ 29 мая 2016

Помните об этом, если все ваши строки в столбце не имеют подчеркивания (... или если выходное значение будет нулевым):

SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), 
"STRING_COLUMN") 
AS OUTPUT FROM DUAL
...