Comment puis-je retourner mes enregistrements regroupés par NULL et not NULL?
J'ai une table qui a un processed_timestamp
colonne -- si un enregistrement a été traitée alors que le champ contient la date, il a été traité, sinon il est nul.
Je veux écrire une requête qui retourne deux lignes:
NULL xx -- count of records with null timestamps
NOT NULL yy -- count of records with non-null timestamps
Est-ce possible?
Mise à jour: Le tableau est assez grand, donc l'efficacité est importante. J'ai juste l'exécuter deux requêtes à calculer, pour chaque total séparément, mais je veux éviter de heurter la table deux fois si je peux l'éviter.
Vous devez vous connecter pour publier un commentaire.
Oracle:
groupe par nvl2(champ, 'not NULL', 'NULL')
Dans MySQL, vous pourriez faire quelque chose comme
En T-SQL (MS SQL Server), cela fonctionne:
Essayez ce qui suit, c'est neutre:
Après avoir nos locaux DB2 gourou de regarder cela, il est d'accord: aucune des solutions présentées à ce jour (y compris celui-ci) peut éviter un full table scan (de la table si l'horodatage n'est pas indexé, ou de la indexotherwise). Ils ont tous la numérisation de chaque enregistrement dans la table exactement une fois.
Tous les CAS/SI/NVL2() les solutions de null-à-conversion de chaîne de caractères pour chaque ligne, présentant une charge inutile sur les SGBD. Cette solution n'a pas ce problème.
Si c'est oracle, alors vous pouvez faire:
Je suis sûr que d'autres DBs permettre une astuce similaire.
Stewart,
Peut-être envisager cette solution. C'est (aussi!) vendeur non-spécifiques.
Que de l'efficacité, cela évite 2x index cherche/analyses de table/que ce soit, par y compris les résultats sur une seule ligne. Si vous avez absolument besoin de 2 lignes dans le résultat, deux passes dans le jeu peut être inévitable en raison de la fusion des agrégats.
Espère que cette aide
Un autre MySQL méthode consiste à utiliser le
CAS
de l'opérateur, qui peut être généralisée à d'autres solutions queIF()
:Si votre base de données efficace de la fonction COUNT(*) pour une table, vous pouvez COMPTER le moindre nombre, et de soustraction.
SQL Server (à compter de 2012):
Personnellement, j'aime Pax solution, mais si vous avez absolument besoin d'une ligne de retour (que j'ai eu récemment), Dans MS SQL Server 2005/2008 vous pouvez "empiler" les deux requêtes à l'aide d'un CTE
Espère que cette aide
[T-SQL]:
Et vous pouvez ajouter dans le cas énoncé de ce que d'autres valeurs que vous souhaitez à forment une partition, par exemple, aujourd'hui, hier, entre midi et 2h, après 6 heures du soir, un jeudi.
Edit: il n'a pas lu attentivement, celui-ci renvoie une seule ligne.
Dans Oracle
count(*) renvoie le nombre de lignes
count(nom_colonne) retourne le nombre de lignes qui ne sont pas NULL, alors
devrait faire le travail.
Si la colonne est indexée, vous pourriez vous retrouver avec une sorte de gamme de numérisation et d'éviter de lire la table.
Une autre façon de T-sql (sql server)