В 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: