Y a-t-il une expression qui retourne vrai si tous les éléments d'un tableau postgreSQL sont NULL?
Si c'était une valeur autre que NULL, je pouvais bien sûr utiliser quelque chose comme: p>
SELECT 4 = ALL (ARRAY[4,5]::integer[]);
5 Réponses :
Je ne suis pas vraiment fier de cela, mais:
=> select not exists ( select 1 from (select all unnest(ARRAY[NULL, NULL, NULL]) is null as x) as dt where x = 'f' ); ?column? ---------- t (1 row) => select not exists ( select 1 from (select all unnest(ARRAY[NULL, 11, NULL]) is null as x) as dt where x = 'f' ); ?column? ---------- f (1 row)
Une autre approche pour rendre le code plus court, utilisez chaque fonction globale sortie: p> une autre approche, générant des nulls à être Utilisé pour la comparaison: p> logique sous-jacente du code ci-dessus, cela renvoie true: p> une autre approche, utilisez < Un href = "http://developer.postgresql.org/pgdocs/postgres/functions-array.html" rel = "nofollow"> array_fill p> CAREAT, Construction Array et Array_fill ne sont pas symétriques cependant, testez ceci: p>
Je pense avoir la réponse la plus courte, tout en conservant toujours Test en direct: 4 = tout (tableau [4,5] :: INTEGER []); Code> Construction:
select
y, true = ALL (select unnest(z) is null)
from x
J'aime cette réponse que l'autre, alors j'ai blogué à ce sujet ;-) aniceHumble.com/2011/07/postgresql-unnest-funcer-do-many.h tml
Je pense que c'est toujours techniquement une sous-requête, mais c'est assez court. Merci.
Je pouvais imaginer que PostgreSQL Core Devs pourrait employer un algorithme spécialisé si la source de rangée de toutes / toutes les requêtes provient d'une matrice non inscrite, c'est-à-dire que cela n'obtiendra pas le même plan d'exécution de la sous-requête typique. L'approche Array_fill (mon autre réponse) pourrait être plus rapide cependant, car elle ne partage pas le plan d'exécution de sous-requête, l'apparence est une opération en mémoire; La meilleure façon de savoir est de profiler la vitesse ou de vérifier le plan d'exécution des différentes approches.
-1 = ALL(arr) IS NULL
Merci, c'est très intelligent.
Votre solution diffère des autres en retournant False sur des tableaux vides. La solution de @ Ezequiel-tolnay array_remove (Arr, null) = '{}' code> est presque aussi rapide mais retourne true pour un tableau vide.
Bon point. J'ai ajouté un tableau vide à l'étui de test ci-dessus. Ce que devrait être retourné pour un tableau vide lors de la question de la question est une matrice toutes les nulls? Code> Je dirais
false code> - ou peut-être
null code>? Mais je suppose que c'est pour le débat.
Définitivement discutable. Si la question est plutôt est une array ne rien que NULLS? CODE> Je préférerais
true code> et aussi
1 = tout ("{} ') code> et même < code> null = tout ('{}') code> rendements
true code>
(1 = Tous (Arr) et 2 = ALL (ARR)) n'est pas faux code> pourrait également être une alternative pour obtenir
true code> pour un tableau vide
Juste pour la variété d'options, ce que j'ai utilisé auparavant, c'est le cas:
NEW.arrvalue := CASE WHEN array_remove(NEW.arrvalue, null) <> '{}' THEN NEW.arrvalue END;
C'est bien parce que c'est presque aussi rapide que les erwins mais fonctionne pour les deux valeurs et null. Et il renvoie la même chose que 1 = tout (arr) code> pour un tableau vide.
Peut-être que
generate_series () code> peut aider.
Oui, je soupçonne que je pouvais, bien qu'une expression "de forme fermée" (c'est-à-dire aucune sous-requête!) Serait préférable. Je tiens à voir si quelqu'un peut penser à un.