В Oracle, SUBSTR()
функцията връща подниз от даден низ.
SUBSTR()
изисква поне два аргумента; низа и позицията, от която да се извлече поднизът. Той също така приема незадължителен трети аргумент, който ви позволява да укажете колко дълъг трябва да бъде поднизът.
SUBSTR()
може да се разглежда и като група от функции. Има пет отделни функции; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
и SUBSTR4()
. Всяка функция изчислява дължината по различен начин.
Синтаксис
Синтаксисът е така:
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Където char
е низът, position
е началната позиция на подниза и substring_length
е дължината на знаците за извличане.
Функциите изчисляват дължините, както следва:
Функция | Изчислява дължината с помощта на… |
---|---|
SUBSTR() | Символи, както са дефинирани от набора от входни знаци |
SUBSTRB() | Байтове |
SUBSTRC() | Пълни символи в Unicode |
SUBSTR2() | Кодови точки UCS2 |
SUBSTR4() | Кодови точки UCS4 |
Пример
Ето един основен пример:
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Резултат:
fat cat
В сравнение с SUBSTRB()
Този пример показва как резултатите могат да се различават в зависимост от това коя конкретна функция използвате и от набора от символи.
В този случай сравняваме SUBSTR()
с SUBSTRB()
:
SELECT
SUBSTR('Böyük yağlı pişik', 5) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5) AS SUBSTRB
FROM DUAL;
Резултат:
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
Можем да видим, че двете функции са върнали два различни резултата. Това е така, защото някои знаци в този низ използват два байта.
SUBSTR()
функцията връща дължината в cсимволи, както е дефинирана от входния набор от знаци, докато SUBSTRB()
функцията връща дължината в байтове .
Ако се върнем към оригиналния низ, резултатите са еднакви между двете функции:
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Резултат:
SUBSTR SUBSTRB __________ __________ fat cat fat cat
Това е така, защото този низ използва само един байт на знак и така дължината в байтове е същата като броя на знаците.
Дължина на подниз
Ето пример, който определя дължината на подниз за извличане:
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Резултат:
fat
И ето сравнение между SUBSTR()
и SUBSTRB()
когато указвате дължината на многобайтови знаци:
SELECT
SUBSTR('Böyük yağlı pişik', 5, 9) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5, 9) AS SUBSTRB
FROM DUAL;
Резултат:
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Нулева позиция
Една странност на тази функция е, че подаване на позиция 0
дава същия резултат като предаването на 1
:
SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Резултат:
0 1 ______ ______ Big Big
Отрицателна позиция
Посочването на отрицателна стойност за позицията кара началната позиция да се брои назад от края на низа:
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Резултат:
cat
И всяка посочена дължина се брои от тази позиция напред:
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Резултат:
fat
Нулеви аргументи
Ако някой (или всички) от аргументите са null
, резултатът е null
:
SET NULL 'null';
SELECT
SUBSTR(null, 3, 3) AS r1,
SUBSTR('Coffee', null, 3) AS r2,
SUBSTR('Coffee', 3, null) AS r3,
SUBSTR(null, null, null) AS r4
FROM DUAL;
Резултат:
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null
възниква в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
Неправилен брой аргументи
Извикване на SUBSTR()
без подаване на аргументи води до грешка:
SELECT SUBSTR()
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT SUBSTR() 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 SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT SUBSTR('Big fat cat', 3, 2, 1) FROM DUAL Error at Command Line : 1 Column : 36 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: