#sql #oracle
#sql #Oracle
Вопрос:
Как получить строку до символа?
Мне нужно получить строку раньше ;
в Oracle SQL.
Например:
147739 - Blablabla ; Blublublu
Необходимый вывод:
147739 - Blablabla
Мой код до сих пор:
SELECT
UPPER(CONVERT(REGEXP_REPLACE(SUBSTR(HISTORICO, INSTR(HISTORICO, 'Doc') 4), 'S/A', 'SA'), 'US7ASCII'))
FROM
GEQ_GL_CONC_CONTABIL_FRETES_V
WHERE
periodo = '$Periodo$' AND livro = 'ESMALTEC_FISCAL'
Я хочу, чтобы вся строка до ;
Ответ №1:
SUBSTR
Для достижения этой цели мы можем использовать комбинацию INSTR
и;
SELECT SUBSTR(FIELD_NAME,1,INSTR(FIELD_NAME,';', 1, 1)-1) FROM TABLE_NAME;
Первый аргумент SUBSTR — это позиция в значении поля, с которой мы хотим начать (1 = в начале), второй аргумент — это длина подстроки, которую мы хотим прочитать, здесь это синоним позиции ‘;’ -1 .
Третий и четвертый аргументы INSTR — это с чего начать поиск ‘;’ и количество, которое нас интересует. В нашем примере это с начала (1) и первого появления (снова 1).
Ответ №2:
Вы могли бы попробовать использовать substr() и instr()
select SUBSTR(my_col, 0, INSTR(my_col, ';')-1)
from my_table
select SUBSTR(' Blablabla ; Blublublu', 0, INSTR('A Blablabla ; Blublublu', ';')-1)
from dual
Ответ №3:
Несколько альтернатив с использованием регулярного выражения Результат каждого решения зависит от того, насколько однородны ваши данные
WITH tbl
AS (
SELECT '147739 - Blablabla ; Blublublu' str
FROM DUAL
)
SELECT TRIM(REGEXP_SUBSTR(str, '([[:alnum:]]|-| )*')) AS SOLUTION_1
, REGEXP_SUBSTR(str, '[[:digit:]]*( )?(-)?( )?[[:alpha:]]*') AS SOLUTION_2
, REGEXP_SUBSTR(str, '[[:digit:]]*( |-)*[[:alpha:]]*') AS SOLUTION_3
FROM tbl;