REGEXP_SUBSTR () выбрать перед строкой - PullRequest
0 голосов
/ 27 ноября 2018

Я выбрал строку в верхнем регистре КРАСНЫЙ, и это хорошо работает

SQL> WITH DATA AS
  2   ( SELECT 'we saw a RED apple on the big tree' str FROM dual)
  3  SELECT str,
  4  REGEXP_SUBSTR(str, '[^(RED]+') before_str
  5  FROM data;
STR                                BEFORE_STR
---------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------
we saw a RED apple on the big tree we saw a

Но когда я выбрал в нижнем регистре, я не получаю результаты, которые я хочу

SQL> WITH DATA AS
  2  ( SELECT 'we saw a red apple on the big tree' str FROM dual)
  3  SELECT str,
  4  REGEXP_SUBSTR(str, '[^(red]+') before_str
  5  FROM data;

STR                                BEFORE_STR
---------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------
we saw a red apple on the big tree w

Как я могу получитьрезультаты, которые я не буду использовать заглавными буквами?

Если бы я хотел использовать функцию для некоторых строк в таблице, я бы не получил желаемых результатов

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Обязательно добавьте пробел до и после ключевого слова, в противном случае вы получите BEFORE_STR, где это только ЧАСТЬ слова.Здесь группа захвата используется для получения первой части, где за всеми символами следует ключевое слово без учета регистра, заключенное в пробелы.Примечание REGEXP_SUBSTR возвращает NULL, если совпадение не найдено.

SQL> WITH DATA(str) AS(
       SELECT 'we saw a red apple on the big tree' FROM dual UNION ALL
       SELECT 'we saw a RED apple on the big tree' FROM dual UNION ALL
       SELECT 'we saw something'                   FROM dual UNION ALL
       SELECT 'we saw a redbird on the big tree'   FROM dual
   )
   SELECT str, REGEXP_SUBSTR(str, '^(.*?)( RED )', 1, 1, 'i', 1) before_str
   FROM data;

STR                                BEFORE_STR
---------------------------------- ----------------------------------
we saw a red apple on the big tree we saw a
we saw a RED apple on the big tree we saw a
we saw something
we saw a redbird on the big tree

SQL>
0 голосов
/ 27 ноября 2018

Вам необходимо указать 'i' для сопоставления без учета регистра.Тем не менее, ваш REGEXP неверен ... [^(RED]+ будет соответствовать всем символам, пока не будет найден один из (, R, E, D.

Вы можете использовать REGEXP_INSTR для определения положения совпадения и SUBSTR для извлечения подстроки:

WITH DATA AS( 
    SELECT 'we saw a red apple on the big tree' str FROM dual UNION ALL
    SELECT 'we saw a RED apple on the big tree' str FROM dual UNION ALL
    SELECT 'we saw something' str FROM dual
)
SELECT str, SUBSTR(str, 1, REGEXP_INSTR(str, 'RED', 1, 1, 0, 'i') - 1) before_str
FROM data;

Результат:

| STR                                | BEFORE_STR |
|------------------------------------|------------|
| we saw a red apple on the big tree | we saw a   |
| we saw a RED apple on the big tree | we saw a   |
| we saw something                   | NULL       |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...