Question

L'extrait de code suivant crée trois tableaux, qui sont passés dans une fonction PL / R.

FOR s_id, s_latitude, s_longitude IN 
  SELECT
    s.id,
    s.latitude_decimal,
    s.longitude_decimal
  FROM
    climate.station s
  WHERE
    s.applicable AND
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max
LOOP
  SELECT array_append( v_id, s_id ) INTO v_id;
  SELECT array_append( v_latitude, s_latitude ) INTO v_latitude;
  SELECT array_append( v_longitude, s_longitude ) INTO v_longitude;
END LOOP;

Les tableaux sont déclarés comme:

  v_id integer[];
  v_latitude double precision[];
  v_longitude double precision[];

je préfère utiliser CREATE TYPE et de transmettre une matrice, chaque élément contenant trois valeurs.

Comment qualifieriez-vous le coder afin qu'il n'utilise pas FOR ... LOOP?

La première ligne de la fonction PL / R est la suivante:

stations <- cbind( v_id, v_longitude, v_latitude )

Je voudrais supprimer cette ligne de code et de simplifier la requête SELECT.

Merci.

Était-ce utile?

La solution

Selon le pl / documentation r , » .. .TWO dimensions des tableaux de PostgreSQL sont mis en correspondance avec R ... matrices "

Peut-être quelque chose comme ...

  SELECT
    plr_function(
      array_agg(array[s.id,s.latitude_decimal,s.longitude_decimal])
    )
  FROM
    climate.station s
  WHERE
    s.applicable AND
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max

Autres conseils

Vous pouvez utiliser le code suivant et continuer à utiliser 3 tableaux:

SELECT
  array_agg(s.id),
  array_agg(s.latitude_decimal),
  array_agg(s.longitude_decimal)
INTO
  v_id, v_latitude, v_longitude
FROM
  climate.station s
WHERE
  s.applicable AND
  s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND
  s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max

ou utiliser le constructeur de ligne et d'assembler un tableau d'un type composite:

SELECT
  array_agg((
    s.id,
    s.latitude_decimal,
    s.longitude_decimal
  ))
INTO
  v_id, v_latitude, v_longitude
FROM
  climate.station s
WHERE
  s.applicable AND
  s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND
  s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max

BTW, cela ne fonctionne que sur PostgreSQL 8.4 +

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top