Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja SUBSTR() w Oracle

W Oracle SUBSTR() funkcja zwraca podciąg z podanego ciągu.

SUBSTR() wymaga co najmniej dwóch argumentów; ciąg i pozycję, z której należy wyodrębnić podciąg. Akceptuje również opcjonalny trzeci argument, który pozwala określić, jak długi powinien być podciąg.

SUBSTR() można również traktować jako grupę funkcji. Istnieje pięć oddzielnych funkcji; SUBSTR() , SUBSTRB() , SUBSTRC() , SUBSTR2() i SUBSTR4() . Każda funkcja oblicza długość w inny sposób.

Składnia

Składnia wygląda tak:

{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])

Gdzie char jest ciągiem, position jest pozycją początkową podciągu, a substring_length to długość znaków do wyodrębnienia.

Funkcje obliczają długości w następujący sposób:

Funkcja Oblicza długość za pomocą…
SUBSTR() Znaki zdefiniowane przez zestaw znaków wejściowych
SUBSTRB() Bajtów
SUBSTRC() Kompletne znaki Unicode
SUBSTR2() Punkty kodowe UCS2
SUBSTR4() Punkty kodowe UCS4

Przykład

Oto podstawowy przykład:

SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;

Wynik:

fat cat

W porównaniu z SUBSTRB()

Ten przykład pokazuje, jak wyniki mogą się różnić w zależności od konkretnej funkcji, której używasz, oraz od użytego zestawu znaków.

W tym przypadku porównujemy SUBSTR() z 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;

Wynik:

          SUBSTR           SUBSTRB 
________________ _________________ 
k yağlı pişik    ük yağlı pişik   

Widzimy, że te dwie funkcje zwróciły dwa różne wyniki. Dzieje się tak, ponieważ niektóre znaki w tym ciągu używają dwóch bajtów.

SUBSTR() funkcja zwraca długość w cznakach, zgodnie z definicją zestawu znaków wejściowych, podczas gdy SUBSTRB() funkcja zwraca długość w bajtach .

Jeśli wrócimy do oryginalnego ciągu, wyniki obu funkcji są takie same:

SELECT 
    SUBSTR('Big fat cat', 5) AS SUBSTR,
    SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;

Wynik:

    SUBSTR    SUBSTRB 
__________ __________ 
fat cat    fat cat   

Dzieje się tak, ponieważ ten ciąg używa tylko jednego bajtu na znak, więc długość w bajtach jest taka sama jak liczba znaków.

Długość podciągu

Oto przykład określający długość podciągu do wyodrębnienia:

SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;

Wynik:

fat

A oto porównanie między SUBSTR() i SUBSTRB() przy określaniu długości znaków wielobajtowych:

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;

Wynik:

      SUBSTR    SUBSTRB 
____________ __________ 
k yağlı p    ük yağl    

Pozycja zerowa

Jednym z dziwactw tej funkcji jest to, że przekazywanie pozycji 0 daje taki sam wynik jak przekazanie 1 :

SELECT 
    SUBSTR('Big fat cat', 0, 3) AS "0",
    SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;

Wynik:

     0      1 
______ ______ 
Big    Big   

Pozycja ujemna

Określenie ujemnej wartości pozycji powoduje, że pozycja początkowa jest liczona wstecz od końca ciągu:

SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;

Wynik:

cat

Każda określona długość jest liczona od tej pozycji do przodu:

SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;

Wynik:

fat

Argumenty zerowe

Jeśli którykolwiek (lub wszystkie) argumenty są null , wynik to 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;

Wynik:

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

Domyślnie SQLcl i SQL*Plus zwracają spację, gdy null występuje w wyniku polecenia SQL SELECT oświadczenie.

Możesz jednak użyć SET NULL aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null należy zwrócić.

Nieprawidłowa liczba argumentów

Wywołanie SUBSTR() bez przekazania żadnych argumentów powoduje błąd:

SELECT SUBSTR()
FROM DUAL;

Wynik:

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:

Przekazywanie zbyt wielu argumentów również skutkuje błędem:

SELECT SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;

Wynik:

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:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12519 TNS:nie znaleziono odpowiedniej obsługi serwisowej

  2. java.sql.SQLException:wyczerpany zestaw wyników

  3. Jak zmienić strukturę tabeli w Oracle?

  4. Dlaczego Oracle używa DBMS_STATS.GATHER_TABLE_STATS?

  5. Jak mogę ograniczyć liczbę wierszy zwracanych przez zapytanie Oracle po złożeniu zamówienia?