Скажем, у меня есть столбец таблицы с такими результатами:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Я хотел бы иметь возможность написать запрос, который выбирает этот столбец из указанной таблицы, но возвращает только подстроку до символа подчеркивания (_). Например:
ABC
DEFGH
IJKLMNOP
Функция SUBSTRING, похоже, не подходит для этой задачи, потому что она основана на позиции, а положение подчеркивания меняется.
Я подумал о функции TRIM (конкретно о функции RTRIM):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Но я не уверен, как мне заставить это работать, поскольку кажется, что он удаляет только определенный список / набор символов, и я действительно только после символов, ведущих к символу подчеркивания.
instr
возвращает 0, если у вас естьINSTR('ABC/D', '_')
. В итоге у вас есть подстрока от 0 до (0-1), которая имеет значение NULL. Не хорошо.Это легко сделать с помощью REGEXP_SUBSTR .
Пожалуйста, используйте
где STRING_EXAMPLE - ваша строка.
Пытаться:
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
Это решит вашу проблему.
источник
INSTR
решение работает примерно так же быстро, как иREGEXP
решение.Вам нужно получить позицию первого символа подчеркивания (используя 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
источник
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
это правильный ответ, как написал user1717270
Если вы используете
INSTR
, он предоставит вам позицию для строки, которая предполагает, что она содержит "_". А если нет? Ответом будет 0. Следовательно, когда вы хотите напечатать строку, она напечатаетNULL
. Пример: Если вы хотите удалить домен из "host.domain". В некоторых случаях у вас будет только короткое имя, то есть «хост». Скорее всего, вы хотите вывести «хост». Что ж, сINSTR
егоNULL
помощьюREGEXP_SUBSTR
вы получите ответ, потому что он не нашел ни одного символа ".", Т.е. он будет печатать от 0 до 0. С его помощью вы получите правильный ответ во всех случаях:SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1) from dual;
ВЕДУЩИЙ
и
SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1) from dual;
ВЕДУЩИЙ
источник
Другой вариант - использование REGEXP_SUBSTR.
источник
Помните об этом, если все ваши строки в столбце не имеют подчеркивания (... или если на выходе будет нулевое значение):
SELECT COALESCE (SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), "STRING_COLUMN") AS OUTPUT FROM DUAL
источник
Чтобы найти любую подстроку из большой строки:
Затем , чтобы найти строку
'Ple'
изString_value
мы можем сделать , как:select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
Вы найдете результат:
Ple
источник
В случае, если позиция String не зафиксирована, то с помощью оператора Select ниже мы можем получить ожидаемый результат.
ID структуры таблицы VARCHAR2 (100 BYTE) CLIENT VARCHAR2 (4000 BYTE)
Data- ID CLIENT
1001 {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"}
1002 {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"}
Требование - Найдите строку «ClientId» в столбце «КЛИЕНТ» и верните соответствующее значение. Как From "clientId": "con-bjp" -> con-bjp (Ожидаемый результат)
выберите КЛИЕНТ, substr (substr (CLIENT, instr (CLIENT, '"clientId": "') + length ('" clientId ":"')), 1, instr (substr (CLIENT, instr (CLIENT, '"clientId" : "') + length ('" clientId ":" ')),' "', 1) -1) cut_str из TEST_SC;
КЛИЕНТ cut_str ------------------------------------------------ ----------- ---------- {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"} con- bjp {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"} Test-Cust
источник