Получить строку до символа Oracle SQL

#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;