Vastus (26.09.2023 12:37): 2023. aastal tuli peale pikka ootamist välja SQL standardi uus versioon - SQL:2023. Eelmine versioon oli SQL:2016 - nimes on viide aastale.
SIIN on ülevaade mõningatest täiendustest võrreldes SQL:2016 standardi versiooniga. Põhilised täiendused on seotud JSON formaadis andmete toe täiendamisega ja omaduste graafi toe lisamisega, aga ka keele tuuma kasutatavuse parandamisega.
PostgreSQL toetas juba varasemalt mitmeid standardi uude versiooni tehtud täiendusi ning ka PostgreSQL 16 (tuli välja 2023. aasta septembris) lisandus mõningaid standardi uude versiooni lisandunud võimalusi.
PostgreSQL 16 lisandus võimalus kasutada loetavuse parandamiseks täisarve ja püsikomaarve esitavates literaalides alakriipse.
SELECT *
FROM Emp
WHERE sal>1_000_000;
Samuti lisandus PostgreSQL 16 võimalus esitada täisarvu tüüpi väärtuse literaali muus formaadis kui kümnendformaat (nt kuueteistkümnend formaadis).
SELECT *
FROM Emp
WHERE sal>0xF4240;
Eelnevad kaks on samaväärsed kui päring:
SELECT *
FROM Emp
WHERE sal>1000000;
Veenduge:
SELECT cast(0xF4240 AS INTEGER);
Samuti lisandus PostgreSQL 16 kokkuvõttefunktsioon ANY_VALUE. Leia sellised ametikohad, millel töötab vähemalt kaks töötajat. Väljasta ametikoha nimetus ja ühe sellisel ametikohal töötava töötaja kood.
SELECT job, any_value(empno) AS üks_töötaja_sellise_ametiga
FROM Emp
GROUP BY job
HAVING Count(*)>1;
Samuti saab nüüd kontrollida, kas tekstiline väärtus esitab JSON väärtust.
WITH vaartused AS (VALUES ('{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}'), ('<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()" />
<menuitem value="Open" onclick="OpenDoc()" />
<menuitem value="Close" onclick="CloseDoc()" />
</popup>
</menu>'))
SELECT column1 AS vaartus, column1 IS JSON AS is_json
FROM vaartused;
PostgreSQL toetas juba varasemast selliseid SQL:2023 lisandunud võimalusi:
- võimalust deklareerida, et UNIQUE kitsenduse kontekstis käsitletakse NULLi väärtusena ja seega NULL=NULL e mittekohustuslik UNIQUE veerus võib olla maksimaalselt üks NULL,
CREATE TABLE unik (vaartus INTEGER,
CONSTRAINT uq_unik UNIQUE NULLS NOT DISTINCT (vaartus));
INSERT INTO unik(vaartus) VALUES (NULL);
INSERT INTO unik(vaartus) VALUES (NULL); --ebaõnnestub
- grupeerimise tulemuse sorteerimist veeru järgi, mida pole SELECT klauslis,
SELECT deptno, Count(*) AS cnt
FROM Dept INNER JOIN Emp USING (deptno)
GROUP BY deptno
ORDER BY dname;
- funktsioone greatest ja least,
SELECT greatest(1,2,3) AS suurim, least(1,2,3) AS vähim;
- funktsioone lpad ja rpad,
SELECT lpad(cast(123 as varchar), 12, '*') ;
- funktsioone, mis kärbivad stringi algusest rohkem kui ühe märgi,
SELECT ltrim('****123', '*');
- väljapikkuse mittemääramist tekstilise veeru defineerimisel,
CREATE TABLE T(a CHAR, b VARCHAR);
- lihtsustatud tsükli kontrollimise süntaksi rekursiivsete päringute puhul,
- JSON andmetüüpi (PostgreSQLis on tüübid JSON ja JSONB) (samas ei ole PostgreSQL 16-s SQL:2023-s ette nähtud võimalust deklareerida, et JSON väärtuses peavad olema unikaalsed võtmed),
- JSONB tüüpi väärtuste korral nende võrdlemist ning nende alusel sorteerimist ja grupeerimist.
PostgreSQL tugi SQL standardile on dokumentatsioonis kirjeldatud lisas, kus eraldi tuuakse välja, millised standardis ettenähtud keele võimalused on andmebaasisüsteemi poolt
toetatud ja millised on
mittetoetatud .
Kahjuks ei ole PostgreSQL 16 veel omaduste graafi tuge.