REGEXP_LIKE, oracle, sql, запрос, понимание - PullRequest
1 голос
/ 29 января 2020

Пожалуйста, помогите мне понять запрос ниже. Я новичок в REGEXP_LIKE в oracle sql. Я знаю ^ AZ означает, что начинается с AZ или az, это правильно? Остальное я не понимаю, как - \ ''. Я понятия не имею, что именно это делает. Я был бы признателен за помощь, чтобы помочь мне понять, что это делает. Спасибо за вашу помощь.

Моя попытка понять: [^ a-zA-Z] означает любой символ, который НЕ ЯЗ ИЛИ АЗ

   SELECT d,name_type,effdt,name, name1, name2, name3
    FROM table1
    WHERE REGEXP_LIKE(name3, '[^A-Za-z, -\'']')
    or REGEXP_LIKE(name1, '[^A-Za-z, -\'']')
    or REGEXP_LIKE(name2, '[^A-Za-z, -\'']')

Ответы [ 2 ]

2 голосов
/ 29 января 2020

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

В скобках знак минус обозначает диапазон символов, поэтому в вашем текущем запросе довольно неясно, какой диапазон вы пытаетесь указать.
Кроме того, кажется, что в диалекте Oracle знак минуса должен быть либо последним, либо первым символом в скобках (я не знал, прежде чем ответить на этот вопрос, чтобы быть честным).

^ Означает начало строки, если это первый символ в регулярном выражении, но это означает «все символы, кроме:», когда он находится в квадратных скобках.

Квадратные скобки указывают наборы символов, которые разрешены или, если им предшествует ^, которые не допускаются.

После исправления синтаксической ошибки, упомянутой выше, мы получаем следующее регулярное выражение:

with ex as (
   select 'AAA' x from dual union all
   select 'AA''A' x from dual union all
   select 'AA A' x from dual union all
   select 'AA''A' x from dual union all
   select 'AA A' from dual union all
   select 'A1AA' from dual union all
   select 'AA\A' from dual union all
   select 'A-AA' from dual union all
   select '123fojq3t' from dual
)
select ex.x
  from ex 
 where REGEXP_LIKE(ex.x, '[^A-Za-z \''-]')

Итак, чтобы понять скобки:

[^
A-Za-z   any character between a-z or A-Z  
,        comma 
         (space)
\        backslash. Backslash is not treated as escape character here, as single quote does not need escaping
''       single quote. We use double quote, so that the Oracle does not think that this is the end of the regexp
-        hyphen. It apparently is important that it is the last character here
]

Итак, это некоторый набор символов. Теперь, поскольку есть '^', регулярное выражение как будет означать:
Найдите мне первый символ, который НЕ в наборе выше.

Это легче понять, когда вы используете regexp_instr вместо regexp_like:

with ex as (
   select 'AAA' x from dual union all
   select 'AA''A' x from dual union all
   select 'AA A' x from dual union all
   select 'AA''A' x from dual union all
   select 'AA A' from dual union all
   select 'A1AA' from dual union all
   select 'AA\A' from dual union all
   select 'A-AA' from dual union all
   select '123fojq3t' from dual
)
select ex.x,
       REGEXP_instr(ex.x, '[^A-Za-z \''-]')
  from ex 
    • Я использую 11.2.0.4.0
0 голосов
/ 29 января 2020

Насколько я могу догадаться -

[] - Brackets are used to define a class. Anything inside brackets will be matched with the column values of name1, name2 and name3
^ - Starting of the characters but negation when inside brackets.
A-Z or a-z or , or space or - or \ or " - Starting characters of the columns name1, name2, name3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...