9
votes

Est-ce que tu es tous les nulls dans PostgreSQL

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[]);


2 commentaires

Peut-être que generate_series () 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.


5 Réponses :


2
votes

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)


0 commentaires

2
votes

Une autre approche pour rendre le code plus court, utilisez chaque fonction globale xxx

sortie: xxx

une autre approche, générant des nulls à être Utilisé pour la comparaison: xxx

logique sous-jacente du code ci-dessus, cela renvoie true: xxx

une autre approche, utilisez < Un href = "http://developer.postgresql.org/pgdocs/postgres/functions-array.html" rel = "nofollow"> array_fill xxx

CAREAT, Construction Array et Array_fill ne sont pas symétriques cependant, testez ceci: xxx


0 commentaires

12
votes

Je pense avoir la réponse la plus courte, tout en conservant toujours 4 = tout (tableau [4,5] :: INTEGER []); Code> Construction:

Test en direct: https://www.db-fiddle.com/f/6dub1n4fdcvzdxkihczu5y/1 P >

select
y, true = ALL (select unnest(z) is null)
from x


3 commentaires

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.



15
votes
-1 = ALL(arr) IS NULL

5 commentaires

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) = '{}' 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? Je dirais false - ou peut-être null ? 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? Je préférerais true et aussi 1 = tout ("{} ') et même < code> null = tout ('{}') rendements true


(1 = Tous (Arr) et 2 = ALL (ARR)) n'est pas faux pourrait également être une alternative pour obtenir true pour un tableau vide



2
votes

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;


1 commentaires

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) pour un tableau vide.