Une application web peut envoyer à une fonction d'un array of arrays
commepassant un tableau de tableaux comme paramètre à une fonction
[
[
[1,2],
[3,4]
],
[
[],
[4,5,6]
]
]
La longueur de la rangée extérieure est n > 0
. Les tableaux du milieu sont de longueur constante, 2 dans cet exemple. Et les longueurs des matrices internes sont n >= 0
.
Je string pourrais construire comme ceci:
with t(a, b) as (
values (1, 4), (2, 3), (1, 4), (7, 3), (7, 4)
)
select distinct a, b
from t
where
(a = any(array[1,2]) or array_length(array[1,2],1) is null)
and
(b = any(array[3,4]) or array_length(array[3,4],1) is null)
or
(a = any(array[]::int[]) or array_length(array[]::int[],1) is null)
and
(b = any(array[4,5,6]) or array_length(array[4,5,6],1) is null)
;
a | b
---+---
7 | 4
1 | 4
2 | 3
Mais je pense que je peux faire mieux comme ça
with t(a, b) as (
values (1, 4), (2, 3), (1, 4), (7, 3), (7, 4)
), u as (
select unnest(a)::text[] as a
from (values
(
array[
'{"{1,2}", "{3,4}"}',
'{"{}", "{4,5,6}"}'
]::text[]
)
) s(a)
), s as (
select a[1]::int[] as a1, a[2]::int[] as a2
from u
)
select distinct a, b
from
t
inner join
s on
(a = any(a1) or array_length(a1, 1) is null)
and
(b = any(a2) or array_length(a2, 1) is null)
;
a | b
---+---
7 | 4
2 | 3
1 | 4
avis qu'un text array
a été adopté puis « casted » à l'intérieur de la fonction. Cela était nécessaire car Postgresql ne peut traiter que des tableaux de dimensions correspondantes et les tableaux internes transmis peuvent varier en dimension. Je pourrais les "réparer" avant de passer en ajoutant une valeur spéciale comme zéro pour les faire tous de la même longueur que le plus long mais je pense qu'il est plus propre de faire face à cela à l'intérieur de la fonction.
Ai-je raté quelque chose? Est-ce la meilleure approche?
Le format du tableau tridimensionnel est-il enveloppé dans un format texte donné ou pouvez-vous choisir comment transmettre ces valeurs? Et la fonction recevant ces valeurs est plpgsql? Version Postgres? –
@Erwin Je peux choisir comment transmettre les valeurs. L'extrémité avant est en Python donc très flexible. Ce format est juste comment je l'ai réussi à travailler. La fonction travaille maintenant en sql pour la simplicité mais elle peut être plpgsql ou plpython. Postgresql 9.3. –