Korzystanie z funkcji konwersji
Oprócz funkcji narzędziowych SQL, wbudowana biblioteka funkcji Oracle zawiera funkcje konwersji typów. Mogą istnieć scenariusze, w których zapytanie oczekuje danych wejściowych w określonym typie danych, ale otrzymuje je w innym typie danych. W takich przypadkach Oracle niejawnie próbuje przekonwertować nieoczekiwaną wartość na zgodny typ danych, który można zastąpić w miejscu, a ciągłość aplikacji nie jest zagrożona. Konwersja typów może być wykonana niejawnie przez firmę Oracle lub jawnie przez programistę.
Niejawna konwersja typu danych działa w oparciu o macierz, która przedstawia obsługę Oracle dla wewnętrznego rzutowania typu. Oprócz tych reguł firma Oracle oferuje funkcje konwersji typów, których można używać w zapytaniach do jawnej konwersji i formatowania. W rzeczywistości zaleca się wykonanie jawnej konwersji zamiast polegania na inteligencji oprogramowania. Chociaż niejawna konwersja działa dobrze, ale w celu wyeliminowania prawdopodobieństwa pochylenia, w których złe dane wejściowe mogą być trudne do wewnętrznego typowania.
Niejawna konwersja typu danych
Wartość VARCHAR2 lub CHAR może zostać niejawnie przekonwertowana na wartość typu NUMBER lub DATE przez Oracle. Podobnie wartość typu NUMBER lub DATA może być automatycznie konwertowana na dane znakowe przez serwer Oracle. Należy zauważyć, że niejawna konwersja międzykonwersyjna ma miejsce tylko wtedy, gdy znak reprezentuje odpowiednio prawidłową liczbę lub wartość typu daty.
Na przykład przeanalizuj poniższe zapytania SELECT. Oba zapytania dadzą ten sam wynik, ponieważ Oracle wewnętrznie traktuje 15000 i „15000” jako takie same.
Zapytanie-1
SELECT employee_id,first_name,salary
FROM employees
WHERE salary > 15000;
Zapytanie-2
SELECT employee_id,first_name,salary
FROM employees
WHERE salary > '15000';
Jawna konwersja typu danych
Funkcje konwersji SQL to funkcje jednowierszowe, które mogą rzutować na typ wartość kolumny, literał lub wyrażenie. TO_CHAR, TO_NUMBER i TO_DATE to trzy funkcje, które wykonują krzyżową modyfikację typów danych.
Funkcja TO_CHAR
Funkcja TO_CHAR służy do rzutowania wartości numerycznej lub daty na typ znakowy za pomocą modelu formatu (opcjonalnie).
Składnia
TO_CHAR(number1, [format], [nls_parameter])
W przypadku konwersji liczb na znaki parametry nls mogą służyć do określania znaków dziesiętnych, separatora grup, modelu waluty lokalnej lub modelu waluty międzynarodowej. Jest to specyfikacja opcjonalna - jeśli nie jest dostępna, zostaną użyte ustawienia nls na poziomie sesji. W przypadku konwersji daty na znaki parametr nls może służyć do określania odpowiednio nazw dni i miesięcy.
Daty można formatować w wielu formatach po konwersji na typy znaków za pomocą funkcji TO_CHAR. Funkcja TO_CHAR służy do wyświetlania dat w Oracle 11g w określonym formacie. Modele formatu uwzględniają wielkość liter i muszą być ujęte w pojedyncze cudzysłowy.
Rozważ poniższe zapytanie SELECT. Kwerenda formatuje kolumny HIRE_DATE i SALARY tabeli EMPLOYEES za pomocą funkcji TO_CHAR.
SELECT first_name,
TO_CHAR (hire_date, 'MONTH DD, YYYY') HIRE_DATE,
TO_CHAR (salary, '$99999.99') Salary FROM employees WHERE rownum < 5; FIRST_NAME HIRE_DATE SALARY -------------------- ------------------ ---------- Steven JUNE 17, 2003 $24000.00
Neena SEPTEMBER 21, 2005 $17000.00 Lex JANUARY 13, 2001 $17000.00
Alexander JANUARY 03, 2006 $9000.00
Pierwszy TO_CHAR służy do konwersji daty wynajmu na format daty MIESIĄC DD, RRRR, tj. Miesiąc zapisany i dopełniony spacjami, następnie dwucyfrowy dzień miesiąca, a następnie czterocyfrowy rok. Jeśli wolisz wyświetlać nazwę miesiąca w postaci znaków mieszanych (czyli „grudzień”), po prostu użyj tego przypadku w argumencie formatu: („Miesiąc DD, RRRR”).
Druga funkcja TO_CHAR na rysunku 10-39 służy do formatowania WYNAGRODZENIA w celu wyświetlenia znaku waluty i dwóch miejsc dziesiętnych.
Oracle oferuje kompleksowy zestaw modeli formatów. Poniższa tabela przedstawia listę modeli formatów, których można użyć do zapisywania dat i wartości liczbowych jako znak przy użyciu TO_CHAR.
Formatuj model | Opis |
---|---|
,(przecinek) | Zwraca przecinek w określonej pozycji. W modelu formatu liczbowego można określić wiele przecinków. Ograniczenia: element przecinka nie może rozpoczynać modelu formatu liczb. Przecinek nie może pojawić się po prawej stronie znaku dziesiętnego lub kropki w modelu formatu liczb. |
.(Kropka) | Zwraca przecinek dziesiętny będący kropką (.) W określonej pozycji. Ograniczenie: w modelu formatu liczbowego można określić tylko jeden okres |
$ | Zwraca wartość z początkowym znakiem dolara |
0 | Zwraca wiodące zera. Zwraca zera końcowe. |
9 | Zwraca wartość z określoną liczbą cyfr ze spacją wiodącą, jeśli jest dodatnia, lub z wiodącym minusem, jeśli jest ujemna. Zera wiodące są puste, z wyjątkiem wartości zerowej, która zwraca zero dla części całkowitej liczby stałoprzecinkowej. |
b | Zwraca puste miejsca dla części całkowitej liczby stałoprzecinkowej, gdy część całkowita jest równa zero (niezależnie od „0” sw modelu formatu). |
do | Zwraca w określonej pozycji symbol waluty ISO (bieżącą wartość parametru NLS_ISO_CURRENCY). |
re | Zwraca na określonej pozycji znak dziesiętny, który jest bieżącą wartością parametru NLS_NUMERIC_CHARACTER. Wartość domyślna to kropka (.). Ograniczenie: w modelu formatu liczbowego można określić tylko jeden znak dziesiętny. |
EEE | Zwraca wartość używaną w notacji naukowej. |
FM | Zwraca wartość bez wiodących lub końcowych spacji. |
sol | Zwraca w określonej pozycji separator grupy (bieżąca wartość parametru NLS_NUMERIC_CHARACTER). W modelu formatu liczbowego można określić wiele separatorów grup. Ograniczenie: Separator grupy nie może pojawić się po prawej stronie znaku dziesiętnego lub kropki w modelu formatu liczb |
L | Zwraca w określonej pozycji symbol waluty lokalnej (bieżącą wartość parametru NLS_CURRENCY). |
MI | Zwraca wartość ujemną z końcowym znakiem minus (-). Zwraca wartość dodatnią z końcową spacją. Ograniczenie: element formatu MI może pojawić się tylko na ostatniej pozycji modelu formatu liczb. |
PR | Zwraca wartość ujemną w. Może pojawić się tylko na końcu modelu formatu liczbowego. |
RN, rm | Zwraca wartość jako cyfry rzymskie zapisane wielkimi literami. Zwraca wartość w postaci cyfr rzymskich zapisanych małymi literami. Wartość może być liczbą całkowitą z przedziału od 1 do 3999. |
S | Zwraca wartość ujemną z początkowym lub końcowym znakiem minus (-). Zwraca wartość dodatnią z początkowym lub końcowym znakiem plus (+). Ograniczenie: element formatu S może pojawić się tylko na pierwszej lub ostatniej pozycji modelu formatu liczb. |
TM | „Minimum tekstu”. Zwraca (w postaci dziesiętnej) najmniejszą możliwą liczbę znaków. W tym elemencie wielkość liter nie jest rozróżniana. |
U | Zwraca w określonej pozycji symbol podwójnej waluty „Euro” (lub inny) (bieżąca wartość parametru NLS_DUAL_CURRENCY). |
V | Zwraca wartość pomnożoną przez 10n (i jeśli to konieczne, zaokrągla ją w górę), gdzie n to liczba 9 po „V”. |
X | Zwraca wartość szesnastkową określonej liczby cyfr. |
TO_NUMBER, funkcja
Funkcja TO_NUMBER konwertuje wartość znakową na numeryczny typ danych. Jeśli konwertowany ciąg zawiera znaki nieliczbowe, funkcja zwraca błąd.
Składnia
TO_NUMBER (string1, [format], [nls_parameter])
Poniższa tabela przedstawia listę modeli formatów, których można użyć do typowania wartości znaków jako liczby przy użyciu TO_NUMBER.
Formatuj model | Opis |
---|---|
CC | Stulecie |
SCC | Wiek pne z prefiksem - |
RRRR | Rok z 4 liczbami |
SYYY | Rok pne poprzedzony ciągiem - |
IYYY | Rok ISO z 4 liczbami |
YY | Rok z 2 liczbami |
RR | Rok z 2 numerami z kompatybilnością z Y2k |
ROK | Rok w postaciach |
SYEAR | Rok w znakach, BC z prefiksem - |
pne | Wskaźnik BC / AD |
Q | Kwartał w liczbach (1,2,3,4) |
MM | Miesiąc roku 01, 02 ... 12 |
MIESIĄC | Miesiąc w znakach (np. Styczeń) |
PON | JAN, LUT |
W W | Numer tygodnia (tj. 1) |
W. | Numer tygodnia miesiąca (tj. 5) |
IW | Numer tygodnia w roku w standardzie ISO. |
DDD | Dzień roku w liczbach (tj. 365) |
DD | Dzień miesiąca w liczbach (tj. 28) |
re | Dzień tygodnia w liczbach (np. 7) |
DZIEŃ | Dzień tygodnia w znakach (np. Poniedziałek) |
FMDAY | Dzień tygodnia w znakach (np. Poniedziałek) |
DY | Dzień tygodnia w krótkim opisie postaci (np. SŁOŃCE) |
jot | Dzień juliański (liczba dni od 1 stycznia 4713 pne, gdzie 1 stycznia 4713 pne to 1 w Oracle) |
HH, H12 | Numer godziny dnia (1-12) |
HH24 | Numer godziny dnia z zapisem 24-godzinnym (0-23) |
AM, PM | Rano lub wieczorem |
TĘSKNIĆ | Liczba minut i sekund (tj. 59), |
SSSSS | Liczba sekund tego dnia. |
DS | Format daty krótkiej. Zależy od ustawień NLS. Używaj tylko z sygnaturą czasową. |
DL | Format daty długiej. Zależy od ustawień NLS. Używaj tylko z sygnaturą czasową. |
mi | Skrócona nazwa ery. Dotyczy tylko kalendarzy: Imperial Imperial, ROC Official, Thai Buddha. |
EE | Pełna nazwa ery |
FF | Ułamki sekund. Używaj z sygnaturą czasową. |
FF1..FF9 | Ułamki sekund. Używaj z sygnaturą czasową. Cyfra określa liczbę cyfr dziesiętnych używanych do ułamków sekund. |
FM | Tryb wypełnienia: eliminuje puste miejsca w wyjściu z konwersji |
FX | Format Exact: wymaga dokładnego dopasowania wzorca między danymi a modelem formatu. |
IYY LUB IY LUB I | Ostatnie 3,2,1 cyfry standardowego roku ISO. Tylko wyjście |
RM | Rzymska reprezentacja miesiąca (I .. XII) |
RR | Ostatnie 2 cyfry roku. |
RRRR | Ostatnie 2 cyfry roku używanego do celów wyjściowych. Akceptuje lata fout-cyfrowe, gdy są używane jako dane wejściowe. |
SP | Format ortograficzny. Może pojawiać się na końcu elementu liczbowego. Wynik jest zawsze w języku angielskim. Na przykład miesiąc 10 w formacie MMSP zwraca „dziesięć” |
SPTH | Format ortograficzny i porządkowy; 1 wyników w pierwszej. |
TH | Konwertuje liczbę na jej format porządkowy. Na przykład 1 jest pierwszym. |
TS | Krótki format czasu. Zależy od ustawień NLS. Używaj tylko z sygnaturą czasową. |
TZD | Skrócona nazwa strefy czasowej. tj. PST. |
TZH, TZM | Przesunięcie godziny / minuty strefy czasowej. |
TZR | Region strefy czasowej |
X | Lokalny znak radix. W Ameryce jest to okres (.) |
Poniższe zapytania SELECT akceptują liczby jako dane wejściowe i drukuje je po specyfikatorze formatu.
SELECT TO_NUMBER('121.23', '9G999D99')
FROM DUAL
TO_NUMBER('121.23','9G999D99')
------------------------------
121.23
SELECT TO_NUMBER('1210.73', '9999.99')
FROM DUAL;
TO_NUMBER('1210.73','9999.99')
------------------------------
1210.73
TO_DATE
Funkcja przyjmuje wartości znakowe jako dane wejściowe i zwraca sformatowaną datę odpowiadającą temu samemu. Funkcja TO_DATE umożliwia użytkownikom wprowadzenie daty w dowolnym formacie, a następnie konwertuje wpis do domyślnego formatu używanego przez Oracle 11g.
Składnia:
TO_DATE( string1, [ format_mask ], [ nls_language ] )
Argument format_mask składa się z szeregu elementów reprezentujących dokładnie to, jak powinny wyglądać dane, i musi być wprowadzony w pojedynczych cudzysłowach.
Formatuj model | Opis |
---|---|
ROK | Rok, przeliterowany |
RRRR | 4-cyfrowy rok |
YYY, YY, Y | Ostatnie 3, 2 lub 1 cyfra roku. |
IYY, IY, I | Ostatnie 3, 2 lub 1 cyfra roku w standardzie ISO. |
IYYY | 4-cyfrowy rok na podstawie normy ISO |
RRRR | Akceptuje dwucyfrowy rok i zwraca czterocyfrowy rok. |
Q | Kwartał roku (1, 2, 3, 4; JAN-MAR = 1). |
MM | Miesiąc (01-12; JAN = 01). |
PON | Skrócona nazwa miesiąca. |
MIESIĄC | Nazwa miesiąca dopełniona spacjami do długości 9 znaków. |
RM | Miesiąc oznaczony cyfrą rzymską (I-XII; JAN = I). |
W W | Tydzień roku (1-53), w którym tydzień 1 rozpoczyna się pierwszego dnia roku i trwa do siódmego dnia roku. |
W. | Tydzień miesiąca (1-5), w którym tydzień 1 rozpoczyna się pierwszego dnia miesiąca, a kończy siódmego. |
IW | Tydzień roku (1-52 lub 1-53) na podstawie normy ISO. |
re | Dzień tygodnia (1-7). |
DZIEŃ | Nazwa dnia. |
DD | Dzień miesiąca (1-31). |
DDD | Dzień roku (1-366). |
DY | Skrócona nazwa dnia. |
jot | Dzień juliański; liczba dni od 1 stycznia 4712 rpne. |
HH12 | Pora dnia (1-12). |
HH24 | Pora dnia (0-23). |
TĘSKNIĆ | Minuta (0-59). |
SSSSS | Sekundy po północy (0-86399). |
FF | Ułamki sekund. Użyj wartości od 1 do 9 po FF, aby wskazać liczbę cyfr w ułamkach sekund. Na przykład „FF4”. |
AM, PM | Wskaźnik południka |
AD, BC | Wskaźnik AD, BC |
TZD | Informacje na temat czasu letniego. Na przykład „PST” |
TZH, TZM, TZR | Strefa czasowa godzina / minuta / region. |
Poniższy przykład konwertuje ciąg znaków na datę:
SELECT TO_DATE('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.', 'NLS_DATE_LANGUAGE = American')
FROM DUAL;
TO_DATE('
---------
15-JAN-89
Funkcje ogólne
Funkcje ogólne służą do obsługi wartości NULL w bazie danych. Celem ogólnych funkcji obsługi wartości NULL jest zastąpienie wartości NULL wartością alternatywną. Poniżej pokrótce omówimy te funkcje.
NVL
Funkcja NVL zastępuje wartość alternatywną wartością NULL.
Składnia:
NVL( Arg1, replace_with )
W składni oba parametry są obowiązkowe. Należy pamiętać, że funkcja NVL działa ze wszystkimi typami danych. A także, że typ danych oryginalnego ciągu i zastąpienia musi być w stanie zgodnym, tj. Taki sam lub niejawnie konwertowany przez Oracle.
Jeśli arg1 jest wartością znakową, to oracle konwertuje łańcuch zastępczy na typ danych zgodny z arg1 przed ich porównaniem i zwraca VARCHAR2 w zestawie znaków wyrażenia1. Jeśli argument arg1 jest liczbowy, Oracle określa argument o najwyższym priorytecie liczbowym, niejawnie konwertuje drugi argument na ten typ danych i zwraca ten typ danych.
Poniższa instrukcja SELECT wyświetli „n / a”, jeśli pracownik nie został jeszcze przypisany do żadnego stanowiska, tj. JOB_ID ma wartość NULL. W przeciwnym razie wyświetli rzeczywistą wartość JOB_ID.
SELECT first_name, NVL(JOB_ID, 'n/a')
FROM employees;
NVL2
Jako ulepszenie w stosunku do NVL, Oracle wprowadziło funkcję zastępowania wartości nie tylko dla wartości kolumn NULL, ale także dla kolumn NOT NULL. Funkcji NVL2 można użyć do zastąpienia wartości alternatywnej dla wartości NULL lub innej niż NULL.
Składnia:
NVL2( string1, value_if_NOT_null, value_if_null )
Poniższa instrukcja SELECT wyświetli „Bench”, jeśli JOB_CODE dla pracownika ma wartość NULL. Dla określonej niezerowej wartości JOB CODE wskazywałoby stałą wartość „Job Assigned”.
SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;
NULLIF
Funkcja NULLIF porównuje dwa argumenty wyr1 i wyr2. Jeśli wyr1 i wyr2 są równe, zwraca NULL; w przeciwnym razie zwraca wyr1. W przeciwieństwie do innych funkcji obsługujących wartości null, pierwszy argument nie może mieć wartości NULL.
Składnia:
NULLIF (expr1, expr2)
Zauważ, że pierwszy argument może być wyrażeniem, którego wynikiem jest NULL, ale nie może to być literał NULL. Oba parametry są obowiązkowe, aby funkcja mogła zostać wykonana.
Poniższe zapytanie zwraca NULL, ponieważ obie wartości wejściowe, 12, są równe.
SELECT NULLIF (12, 12)
FROM DUAL;
Podobnie, poniższe zapytanie zwraca „SUN”, ponieważ oba łańcuchy nie są równe.
SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;
ŁĄCZYĆ
Funkcja COALESCE, bardziej ogólna forma NVL, zwraca pierwsze niezerowe wyrażenie na liście argumentów. Wymaga co najmniej dwóch obowiązkowych parametrów, ale maksymalna liczba argumentów nie ma ograniczeń.
Składnia:
COALESCE (expr1, expr2, ... expr_n )
Rozważ poniższe zapytanie SELECT. Wybiera pierwszą niezerową wartość wprowadzoną do pól adresowych dla pracownika.
SELECT COALESCE (address1, address2, address3) Address
FROM employees;
Co ciekawe, działanie funkcji COALESCE jest podobne do konstrukcji IF..ELSIF..ENDIF. Powyższe zapytanie można ponownie zapisać jako -
IF address1 is not null THEN
result := address1;
ELSIF address2 is not null THEN
result := address2;
ELSIF address3 is not null THEN
result := address3;
ELSE
result := null;
END IF;
Funkcje warunkowe
Oracle udostępnia funkcje warunkowe DECODE i CASE do narzucania warunków nawet w instrukcji SQL.
Funkcja DECODE
Funkcja jest odpowiednikiem SQL warunkowej instrukcji proceduralnej IF..THEN..ELSE. DECODE działa z wartościami / kolumnami / wyrażeniami wszystkich typów danych.
Składnia:
DECODE (expression, search, result [, search, result]... [, default])
Funkcja DECODE porównuje po kolei wyrażenie z każdą wyszukiwaną wartością. Jeśli istnieje równość między wyrażeniem a argumentem wyszukiwania, zwraca odpowiedni wynik. W przypadku braku dopasowania zwracana jest wartość domyślna, jeśli została zdefiniowana, w przeciwnym razie NULL. W przypadku niezgodności zgodności dowolnego typu oracle wewnętrznie wykonuje możliwą niejawną konwersję w celu zwrócenia wyników.
W rzeczywistości Oracle uważa, że dwie wartości null są równoważne podczas pracy z funkcją DECODE.
SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL')
FROM DUAL;
DECOD
-----
EQUAL
Jeśli wyrażenie ma wartość null, Oracle zwraca wynik pierwszego wyszukiwania, który również jest pusty. Maksymalna liczba komponentów w funkcji DECODE to 255.
SELECT first_name, salary, DECODE (hire_date, sysdate,'NEW JOINEE','EMPLOYEE')
FROM employees;
Wyrażenie CASE
Wyrażenia CASE działają na tej samej koncepcji co DECODE, ale różnią się składnią i zastosowaniem.
Składnia:
CASE [ expression ]
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n
ELSE result
END
Wyszukiwanie Oracle rozpoczyna się od lewej i przesuwa w prawo, aż znajdzie prawdziwy warunek, a następnie zwraca skojarzone z nim wyrażenie wynikowe. Jeśli żaden warunek nie zostanie spełniony, a istnieje klauzula ELSE, Oracle zwraca wynik zdefiniowany za pomocą else. W przeciwnym razie Oracle zwraca wartość null.
Maksymalna liczba argumentów w wyrażeniu CASE wynosi 255. Wszystkie wyrażenia wliczają się do tego limitu, w tym początkowe wyrażenie prostego wyrażenia CASE i opcjonalne wyrażenie ELSE. Każda para KIEDY ... WTEDY liczy się jako dwa argumenty. Aby uniknąć przekroczenia tego limitu, możesz zagnieździć wyrażenia CASE, tak aby samo wyrażenie return_expr było wyrażeniem CASE.
SELECT first_name, CASE WHEN salary < 200 THEN 'GRADE 1'
WHEN salary > 200 AND salary < 5000 THEN 'GRADE 2'
ELSE 'GRADE 3'
END CASE
FROM employees;
ENAM CASE
---- -------
JOHN GRADE 2
EDWIN GRADE 3
KING GRADE 1