I PostgreSQL er VALUES
kommando returnerer et sæt af en eller flere rækker som en tabel. Det er en tabelværdikonstruktør, der kan bruges som en del af en større kommando eller som en selvstændig SQL-sætning.
Syntaks
Den officielle syntaks lyder sådan her:
VALUES ( expression [, ...] ) [, ...]
[ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
Eksempel
Her er et simpelt eksempel for at demonstrere, hvordan det virker:
VALUES (1, 2, 3), (4, 5, 6);
Resultat:
+--------+---------+---------+| kolonne 1 | kolonne 2 | kolonne 3 |+--------+---------+---------+| 1 | 2 | 3 || 4 | 5 | 6 |+--------+---------+---------+
De resulterende kolonner er implicit navngivet column1
, column2
, column3
og så videre (selvom dette kan ændres – se SELECT
erklæringsmulighed senere i denne artikel).
Hver række er defineret af en eller flere værdier omgivet af parentes. Når mere end én række er angivet, skal alle rækkerne have det samme antal elementer
Her er et andet eksempel:
VALUES ('Peter', 'Griffin'), ('Bart', 'Simpson');
Resultat:
+--------+---------+| kolonne 1 | kolonne 2 |+--------+---------+| Peter | Griffin || Bart | Simpson |+--------+---------+
ORDER BY
Klausul
Syntaksen tillader brug af ORDER BY
klausul for at sortere resultaterne.
Eksempel:
VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) ORDER BY column1 DESC;
Resultat:
+--------+---------+---------+| kolonne 1 | kolonne 2 | kolonne 3 |+--------+---------+---------+| 7 | 8 | 9 || 4 | 5 | 6 || 1 | 2 | 3 |+--------+---------+---------+
LIMIT
Klausul
Vi kan bruge LIMIT
klausul for at begrænse antallet af rækker, der udskrives:
VALUES
('Peter', 'Griffin'),
('Homer', 'Simpson'),
('Ned', 'Flanders')
LIMIT 2;
Resultat:
+--------+---------+| kolonne 1 | kolonne 2 |+--------+---------+| Peter | Griffin || Homer | Simpson |+--------+---------+
OFFSET
Klausul
Her er et eksempel på brug af OFFSET
klausul med VALUES
kommando:
VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders'),
(4, 'Barney', 'Rubble'),
(5, 'George', 'Costanza')
OFFSET 3;
Resultat:
+--------+---------+----------+| kolonne 1 | kolonne 2 | kolonne 3 |+--------+---------+----------+| 4 | Barney | Murbrokker || 5 | George | Costanza |+---------+--------+----------+
FETCH
Klausul
Her er et eksempel på brug af FETCH
klausul:
VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders'),
(4, 'Barney', 'Rubble'),
(5, 'George', 'Costanza')
FETCH FIRST 3 ROWS ONLY;
Resultat:
+--------+---------+----------+| kolonne 1 | kolonne 2 | kolonne 3 |+--------+---------+----------+| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Flandern |+---------+--------+----------+
Inden for en SELECT
Erklæring
Vi kan også bruge VALUES
sætning i en SELECT
sætning, som om VALUES
tabelkonstruktør var en faktisk tabel:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Resultat:
+-------+-----------+| fornavn | efternavn |+-------+----------+| Homer | Simpson |+-----------+----------+
Hver rækkekonstruktør skal indeholde det samme antal værdier
Hver rækkekonstruktør i samme VALUES
sætningen skal have det samme antal værdier i sin værdiliste.
Derfor kan vi ikke gøre dette:
VALUES (1, 2), (3);
Resultat:
FEJL:VALUES-lister skal alle have samme længdeLINJE 1:VALUES (1, 2), (3); ^
Brug af VALUES
for at indsætte data
Vi kan bruge VALUES
sætning i forbindelse med INSERT
sætning for at indsætte data i en tabel.
Eksempel:
CREATE TABLE Idiots (
IdiotId int,
FirstName varchar(50),
LastName varchar(50)
);
INSERT INTO Idiots VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders');
Det skabte en tabel kaldet Idiots
og indsatte tre rækker i den.
Vi kan nu bruge en SELECT
sætning for at se de nye værdier i tabellen:
SELECT * FROM Idiots;
Resultat:
+--------+-----------+----------+| idiot | fornavn | efternavn |+--------+-----------+----------+| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Flandern |+--------+------------+----------+