Oracle
 sql >> база данни >  >> RDS >> Oracle

REGEXP_INSTR() Функция в Oracle

В Oracle, REGEXP_INSTR() функцията търси низ за модел на регулярен израз. Връща цяло число, указващо началната или крайната позиция на съвпадащия подниз (което от тях посочите).

Той разширява функционалността на INSTR() функция, като ни позволява да използваме модели на регулярни изрази.

Синтаксис

Синтаксисът е така:

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, match_param
                           [, subexpr ]
                        ]
                     ]
                  ]
               ]
             )

Къде:

  • source_char е символен израз, който служи като стойност за търсене.
  • pattern е регулярният израз.
  • position е положително цяло число, което указва къде да започне търсенето. По подразбиране е 1 , което означава, започнете търсенето от първия знак.
  • occurrence е положително цяло число, което определя кое събитие да се търси. По подразбиране е 1 , което означава търсене за първото срещане.
  • return_opt указва дали Oracle трябва да върне началната или крайната позиция на съвпадащия подниз. Използвайте 0 за началото и 1 за края. Стойността по подразбиране е 0 .
  • match_param ви позволява да промените поведението на съвпадение по подразбиране на функцията. Например, той ви позволява да зададете чувствителност към малки и големи букви, как се обработват множество редове и интервали и т.н. Този аргумент работи по същия начин, както когато се използва с REGEXP_COUNT() функция. Вижте документацията на Oracle за тази функция за повече информация.
  • За pattern с подизрази, subexpr е неотрицателно цяло число от 0 до 9, което показва кой подизраз в pattern трябва да бъде върната от функцията. Този аргумент работи по същия начин, както когато се използва с REGEXP_INSTR() функция. Вижте документацията на Oracle за повече информация за тази функция.

Пример

Ето един основен пример за използване на REGEXP_INSTR() в Oracle:

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;

Резултат:

4

В този случай има съвпадение и началната позиция на подниз се връща.

Регулярните изрази могат да бъдат много мощни и този пример използва много прост пример. За да използвате REGEXP_INSTR() ефективно, ще трябва да знаете правилния модел, който да използвате за желания резултат.

Няма съвпадение

Ето пример, където няма съвпадение:

SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;

Резултат:

0

Няма съвпадение, така че 0 се връща.

Множество съвпадения

Ето пример с множество съвпадения:

SELECT 
    REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;

Резултат:

4

Върна позицията на първото появяване.

Можете обаче да посочите кое събитие да замените:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Резултат:

14

Имайте предвид, че добавих два аргумента тук; 1 и 2 . 1 определя местонахождението в низа, за да започне търсенето (в този случай на първия знак). 2 е това, което определя кое събитие да се търси. В този случай се търси второто появяване.

Ето какво се случва, ако започна търсенето след първото срещане:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Резултат:

0

В този случай няма съвпадение, защото има само още едно събитие след началната позиция.

Ако променя последния аргумент на 1 , тогава получаваме съвпадение (тъй като това е първото срещане след посочената начална позиция):

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Резултат:

14

Върнете крайната позиция

Можете да подадете пети аргумент от 0 или 1 за да укажете дали функцията трябва да връща началната или крайната позиция на подниза.

Стойността по подразбиране е 0 (за начална позиция). Ето какво се случва, ако посочим 1 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;

Резултат:

7

Само за да е ясно, ето го отново в сравнение с 0 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;

Резултат:

   Start    End 
________ ______ 
       4      7

Чувствителност на регистрите

REGEXP_INSTR() функцията следва правилата за определяне и извеждане на съпоставяне на Oracle, които дефинират съпоставянето, което да се използва при съпоставяне на низа с шаблона.

Въпреки това, можете изрично да посочите чувствителност към малки и малки букви с незадължителния шести аргумент. Когато направите това, той отменя всяка чувствителност към малки и големи букви или чувствителност към акцента на определеното съпоставяне.

Можете да посочите i за съвпадение без значение на главни и c за съвпадение, чувствително към главни букви.

Ето един пример:

SELECT 
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Резултат:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
         0                   4                 0

Моето съпоставяне изглежда е чувствително към малки и големи букви въз основа на тези резултати. Другите два низа бяха принудени към съвпадение, независимо от главни и малки букви, съответно.

Подизрази

Ето пример за използване на шестия аргумент за връщане на конкретен модел на подизрази:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 1
    )
FROM DUAL;

Резултат:

1

В този случай върнах първия подизраз.

Ето какво се случва, ако посоча третия подизраз:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 3
    )
FROM DUAL;

Резултат:

7

Нулеви аргументи

С изключение на 6-ия аргумент, предоставящ null за аргумент води до null :

SET NULL 'null';
SELECT 
    REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
    REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
    REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
    REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;

Резултат:

      1       2       3       4       5    6       7 
_______ _______ _______ _______ _______ ____ _______ 
   null    null    null    null    null    0    null 

По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null възниква в резултат на SQL SELECT изявление.

Можете обаче да използвате SET NULL за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null трябва да бъдат върнати.

Грешен брой аргументи

Предаването на никакви аргументи на функцията или твърде малко води до грешка:

SELECT REGEXP_INSTR()
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Същото важи и когато предадем твърде много аргументи:

SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

Повече информация

REGEXP_INSTR() функцията (както и другата реализация на регулярни изрази на Oracle) съответства на стандарта за регулярни изрази на интерфейса на IEEE Portable Operating System Interface (POSIX) и на Указанията за регулярни изрази на Unicode на Unicode Consortium.

Вижте документацията на Oracle за повече информация и примери за REGEXP_INSTR() функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. оракул varchar към номер

  2. Архиваторът прекъсна поради СЪВМЕСТИМИЯ ORA-16484

  3. Урок за Oracle sql:Ограничаване на набора от данни

  4. Грешка в DYLD_LIBRARY_PATH в моменталния клиент на Oracle

  5. Забавление със съобщения