*Memos:
-
Un tableau a des valeurs de [1]
mais pas de [0]
, donc [0]
renvoie NULL
.
-
En gros, vous devriez utiliser une conversion de type pour créer un tableau sauf lorsque vous déclarez un tableau non vide dans une clause DECLARE
dans une fonction, une procédure ou une instruction DO
car le type peut être différent de ce que vous attendez et il y a des cas où vous ne pouvez pas créer un tableau sans conversion de type. *Ma réponse explique la conversion de type en détail.
-
Le doc explique les tableaux en détail.
-
Ma réponse explique comment créer et utiliser le tableau 1D (unidimensionnel) avec VARCHAR[]
en détail.
-
[Mon post][4] explique comment créer et utiliser un tableau 2D (bidimensionnel) en détail.
-
Ma réponse explique comment créer et utiliser un tableau vide en détail.
Vous pouvez obtenir les éléments du tableau en utilisant string_to_array() avec ces moyens ci-dessous:
SELECT string_to_array('1,2,3,4,5', ',')::INT[]; -- {1,2,3,4,5}
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[0]; -- NULL
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[2]; -- 2
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[2:4]; -- {2,3,4}
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[:4]; -- {1,2,3,4}
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[2:]; -- {2,3,4,5}
SELECT (string_to_array('1,2,3,4,5', ',')::INT[])[:]; -- {1,2,3,4,5}
*Memos:
-
Le type du tableau ci-dessus est INT[]
(INTEGER[]
).
-
Si vous omettez ::INT[]
, le tableau ci-dessus est de type TEXT[]
qui ne peut pas effectuer de calcul.
-
Ne mettez pas d'espaces dans le 1er argument de string_to_array()
sinon les valeurs séparées par ,
auront des espaces.
De plus, vous pouvez obtenir les éléments du tableau avec ces moyens ci-dessous:
SELECT ARRAY[1,2,3,4,5]::INT[]; -- {1,2,3,4,5}
SELECT (ARRAY[1,2,3,4,5]::INT[])[0]; -- NULL
SELECT (ARRAY[1,2,3,4,5]::INT[])[2]; -- 2
SELECT (ARRAY[1,2,3,4,5]::INT[])[2:4]; -- {2,3,4}
SELECT (ARRAY[1,2,3,4,5]::INT[])[:4]; -- {1,2,3,4}
SELECT (ARRAY[1,2,3,4,5]::INT[])[2:]; -- {2,3,4,5}
SELECT (ARRAY[1,2,3,4,5]::INT[])[:]; -- {1,2,3,4,5}
*Memos:
-
Le type du tableau ci-dessus est INT[]
(INTEGER[]
).
-
Même si vous omettez ::INT[]
, le type du tableau ci-dessus reste INT[]
.
Ou:
SELECT '{1,2,3,4,5}'::INT[]; -- {1,2,3,4,5}
SELECT ('{1,2,3,4,5}'::INT[])[0]; -- NULL
SELECT ('{1,2,3,4,5}'::INT[])[2]; -- 2
SELECT ('{1,2,3,4,5}'::INT[])[2:4]; -- {2,3,4}
SELECT ('{1,2,3,4,5}'::INT[])[:4]; -- {1,2,3,4}
SELECT ('{1,2,3,4,5}'::INT[])[2:]; -- {2,3,4,5}
SELECT ('{1,2,3,4,5}'::INT[])[:]; -- {1,2,3,4,5}
*Memos:
-
Le type du tableau ci-dessus est INT[]
(INTEGER[]
).
-
Si vous omettez ::INT[]
, la valeur ci-dessus n'est pas un tableau et le type de la valeur ci-dessus est unknown
.
Et, même si vous définissez INT[2]
pour le tableau, le résultat est le même que celui montré ci-dessous:
postgres=# SELECT ARRAY[1,2,3,4,5]::INT[2];
array
-------------
{1,2,3,4,5}
(1 row)
Et, le type du tableau est INT[]
(INTEGER[]
) plutôt que INT[2]
(INTEGER[2]
) comme le montre ci-dessous. *Vous pouvez utiliser pg_typeof() pour vérifier le type d'une valeur:
postgres=# SELECT pg_typeof(ARRAY[1,2,3,4,5]::INT[2]);
pg_typeof
-----------
integer[]
(1 row)
Et, même si vous définissez VARCHAR
à 1
, le type de 1
est INT
(INTEGER
) plutôt que VARCHAR
comme le montre ci-dessous car la conversion de type extérieure INT[]
est priorisée:
postgres=# SELECT (ARRAY[1::VARCHAR,2,3,4,5]::INT[])[1];
array
-------
1
(1 row)
postgres=# SELECT pg_typeof((ARRAY[1::VARCHAR,2,3,4,5]::INT[])[1]);
pg_typeof
-----------
integer
(1 row)