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

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

В Oracle, INSTR() функцията търси подниз в даден низ и връща цяло число, указващо позицията на първия знак от този подниз. Ако поднизът не бъде намерен, функцията връща 0 .

INSTR() изисква поне два аргумента; низът и поднизът. Той също така приема незадължителен трети и четвърти аргумент, който ви позволява да посочите началната позиция за търсене и кое събитие да търсите.

INSTR() може да се разглежда и като група от функции. Има пет отделни функции; INSTR() , INSTRB() , INSTRC() , INSTR2() и INSTR4() . Всяка функция изчислява дължината по различен начин.

Синтаксис

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

{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])

Където string е низът за търсене, substring е поднизът за намиране, position е началната позиция на подниза и occurrence е кое събитие да намерите.

Функциите изчисляват дължините, както следва:

Функция Изчислява дължината с помощта на…
INSTR() Символи, както са дефинирани от входния набор от знаци, като първият знак от низ има позиция 1.
INSTRB() Байтове
INSTRC() Пълни символи в Unicode
INSTR2() Кодови точки UCS2
INSTR4() Кодови точки UCS4

Пример

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

SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;

Резултат:

5

В сравнение с INSTRB()

Този пример показва как резултатите могат да се различават в зависимост от това коя конкретна функция използвате и от набора от символи.

В този случай сравняваме INSTR() с INSTRB() :

SELECT 
    INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR,
    INSTRB('Böyük yağlı pişik', 'yağlı') AS INSTRB
FROM DUAL;

Резултат:

   INSTR    INSTRB 
________ _________ 
       7         9

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

INSTR() функцията връща позицията, както е дефинирана от входния набор от знаци, докато INSTRB() функцията връща позицията в байтове .

Ако се върнем към оригиналния низ, резултатите са еднакви между двете функции:

SELECT 
    INSTR('Big fat cat', 'fat') AS INSTR,
    INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;

Резултат:

   INSTR    INSTRB 
________ _________ 
       5         5 

Това е така, защото този низ използва само един байт на знак и така дължината в байтове е същата като броя на знаците.

Начална позиция

Ето пример, който определя позицията, за която да започне търсенето:

SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;

Резултат:

11

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

Посочете кое възникване

Ето пример за уточняване кое събитие да се намери:

SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;

Резултат:

7

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

Ето го отново, но този път сравняваме три различни стойности за occurrence аргумент:

SELECT 
    INSTR('That fat cat', 'at', 1, 1) AS "o1",
    INSTR('That fat cat', 'at', 1, 2) AS "o2",
    INSTR('That fat cat', 'at', 1, 3) AS "o3"
FROM DUAL;

Резултат:

   o1    o2    o3 
_____ _____ _____ 
    3     7    11

Но ето какво се случва, ако увеличим position аргумент:

SELECT 
    INSTR('That fat cat', 'at', 5, 1) AS "o1",
    INSTR('That fat cat', 'at', 5, 2) AS "o2",
    INSTR('That fat cat', 'at', 5, 3) AS "o3"
FROM DUAL;

Резултат:

   o1    o2    o3 
_____ _____ _____ 
    7    11     0 

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

Отрицателна позиция

Посочването на отрицателна стойност за позицията кара началната позиция да се брои назад от края на низа и Oracle да търси назад от тази позиция:

SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;

Резултат:

7

И всяко посочено събитие се брои назад от тази позиция:

SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;

Резултат:

3

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

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

SET NULL 'null';
SELECT 
    INSTR(null, 'f', 1, 1) AS r1,
    INSTR('Coffee', null, 1, 1) AS r2,
    INSTR('Coffee', 'f', null, 1) AS r3,
    INSTR('Coffee', 'f', 1, null) AS r4
FROM DUAL;

Резултат:

     R1      R2      R3      R4 
_______ _______ _______ _______ 
   null    null    null    null

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

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

Неправилен брой аргументи

Извикване на INSTR() без подаване на аргументи води до грешка:

SELECT INSTR()
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT 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 INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL
Error at Command Line : 1 Column : 38
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталиране на Oracle 9i Developer Suite 2.0 на Windows

  2. Как да получите максималната възможна дата в Oracle?

  3. Как да архивирате файл в PL/SQL?

  4. Как да създадете PL/SQL слаб референтен курсор в базата данни на Oracle

  5. Как да разберете дали дадена стойност съществува в рамките на VARRAY