113 votes

Obtenir le Nième élément d'un tableau renvoyé par la fonction "string_to_array()"

Je suis à la recherche d'un moyen d'accéder au Nième élément d'un tableau qui est le résultat de la fonction string_to_array() dans PostgreSQL. Par exemple,

Supposons qu'une cellule contienne la valeur de chaîne : "Un exemple simple". Si j'utilise la fonction string_to_array(), j'obtiendrai un tableau de trois chaînes comme ('A','simple','exemple'). Maintenant, sans stockage (je veux dire, à la volée), je veux accéder au 2ème élément de ce tableau, qui est 'simple'.

Pendant mes recherches sur Google, j'ai vu un exemple pour accéder au dernier élément du tableau mais cela n'a guère résolu mon problème.

Existe-t-il un moyen de faire cela?

196voto

devanand Points 3162
sélectionner (string_to_array('1,2,3,4',','))[2];

1voto

*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)

-1voto

Taylor Gronka Points 66

Pour ajouter l'exemple de ce que je cherchais:

select product_ids[1] from comments where board_name = '12345678';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X