Le comportement de PAS COMME avec des valeurs NULL
Je veux récupérer toutes les colonnes d'une table, à l'exception des colonnes de type série. Le plus proche de la requête à ce problème, j'ai été en mesure de venir avec celui-ci:
SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1' AND column_default NOT LIKE 'nextval%'
Mais le problème, c'est son exclusion/filtrage des lignes ayant des valeurs vides pour column_default.Je ne sais pas pourquoi le comportement de Postgres est comme ça. J'ai donc dû modifier ma requête à quelque chose comme ceci:
SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1'
AND ( column_default IS NULL OR column_default NOT LIKE 'nextval%')
Mieux suggestions ou de la justification derrière ce sont les bienvenus.
Les comparaisons avec la valeur NULL n'utilisant pas
IS NULL
ou IS NOT NULL
retour NULL
au lieu de vrai ou de faux dans la plupart/tous les systèmes de base de données.OriginalL'auteur kushi | 2014-04-02
Vous devez vous connecter pour publier un commentaire.
Sur
NULL
'anything' NOT LIKE NULL
rendementsNULL
, pasTRUE
.Et seulement
TRUE
se qualifie pour les expressions de filtre dans unWHERE
clause.La plupart des fonctions de retour
NULL
surNULL
d'entrée (il y a des exceptions). C'est la nature deNULL
dans tout bon SGBDR.Si vous désirez un unique expression, vous pourrait utilisation:
Qui est à peine plus court ou plus rapide, cependant. Les détails dans le manuel.
Bonne requête
Votre requête est toujours pas fiable. Un nom de table, seul, n'est pas unique dans une base de données Postgres, vous devez spécifier le nom du schéma en outre compter sur l'actuel
search_path
pour trouver le premier match:Connexes:
Mieux, mais toujours pas à l'épreuve des balles. Une colonne de départ par défaut avec "nextval' ne pas faire un
serial
, encore. Voir:Pour vous en assurer, vérifiez si la séquence utilisée est "possédé" par la colonne avec
pg_get_serial_sequence(table_name column_name)
.J'ai rarement utiliser les informations de schéma de moi-même. Ceux lent, un gonflement de vue de garantir la portabilité de l'ensemble des principaux versions - et visent à la transférabilité à d'autres conforme à la norme SGBDR. Mais trop est incompatible de toute façon. Oracle n'a même pas de mettre en œuvre les schémas d'information (en 2015).
Aussi, utile Postgres-colonnes spécifiques sont manquants dans les informations de schéma. Pour ce cas, je pourrais interroger le les catalogues système comme ceci:
Plus rapide et plus fiable, mais moins portable.
Le manuel de:
'table1'::regclass
utilise lesearch_path
pour résoudre le nom, ce qui évite toute ambiguïté. Vous pouvez schéma qualifier le nom de contredire:'myschema.table1'::regclass
.Connexes:
OriginalL'auteur Erwin Brandstetter
peut aussi être écrite
NOT column_default LIKE 'pattern%'
n'a pas renvoyé de toutes les colonnes contenant des valeurs NULL.OriginalL'auteur Brad Windsor
Je pense que vous pouvez utiliser :
nvl/fusionner fonction de donner une valeur pour column_default champ pour qu'il soit non nulle. cela semble fonctionner et est plus facile à gérer que l'ajout de la clause where paramètres.
OriginalL'auteur satish pattar