8
votes

Comment retourner 0 si table vide, 1 sinon

dans PostgreSQL, comment puis-je retourner une table contenant 0 si ma table est vide et une table contenant 1 si ma table a des rangées?

J'ai besoin de le faire dans SQL, sans aucune autre langue


3 commentaires

Voulez-vous retourner la valeur 0 ou 1 si votre table a des rangées? Ou voulez-vous retourner une table contenant une seule rangée si elle a des rangées, et rien si ce n'est pas le cas?


Je veux retourner une table contenant la valeur 1 s'il y a des rangées dans ma table et une table contenant 0 si rien n'est dans ce tableau spécifique que j'ai.


Est-il absolument nécessaire de retourner un 0 ou 1? Si vous voulez juste un indicateur booléen, toute valeur supérieure à 0 pour être true dans votre logique post-db.


7 Réponses :


-9
votes

Je ne pense pas que ce soit possible avec rien que SQL. Pourquoi ne pouvez-vous utiliser aucune autre langue?


1 commentaires

Cela aurait été mieux comme un commentaire



0
votes

Peut-être que c'est ce que vous recherchez?

select min( c ) from (
select count(*) c
from mytab
union
select 1
from mytab
having count(*) > 1 )


0 commentaires

17
votes

Utilisation:

SELECT CASE 
         WHEN EXISTS (SELECT * FROM foo LIMIT 1) THEN 1
         ELSE 0 
       END


4 commentaires

C'est tellement faux! Cette requête lit une table entière pour déterminer s'il est vide. Pour une petite table, cela prendrait des âges!


Puis-je simplement ajouter un "top 1" puis pour résoudre ce problème?


ERM, parce que ce n'est pas SQLServer, limite 1?


@Tometzky, cela ne prendrait pas d'âge. De Documentation PostgreSQL : "La sous-requête sera généralement Seulement être exécuté suffisamment loin pour déterminer si au moins une ligne est renvoyée, pas jusqu'à l'achèvement. " En d'autres termes, limite 1 est déjà intégré. Toute mise en œuvre d'existence devrait se comporter de la même manière, car il n'y a jamais de point à récupérer plus de données.



13
votes

Peut-être un piratage, mais cela fonctionne.

SELECT count(*) FROM (SELECT 1 FROM table LIMIT 1) AS t;
  • Le 1 sélectionné dans la sous-requête pourrait être autre chose, c'est juste un porte-endroit. Li>
  • La limite 1 doit rendre la sous-requête très rapide, quelle que soit la taille de la table. Li> ul>

    EDIT: strong> réécrit un peu. L'utilisation antérieure de la limite était fausse (n'a rien aidé sur les grandes tables que je voulais). P> p>


0 commentaires

0
votes

Sélectionnez, comptez et limite doit le faire. xxx

edit: cela ne fonctionne pas dans Postgers < / em> (8.x au moins). S'il vous plaît voir les commentaires et ici: http: // postgretsql.1045698.n5.nfabababebobil.com/window-function-count-and-limit-td3233588.html

Happy SQL'ing.


1 commentaires

Cela limitera simplement le nombre de lignes retournées à 1, il retournera toujours «3» s'il y a 3 rangées.



2
votes

Essayez:

select sign(count(*)) from mytable


1 commentaires

Count (*) est très lent pour les énormes tables



0
votes

Vous pouvez mettre cette demande dans une procédure stockée, avec le nom de la table en tant que paramètre: xxx

puis exécutez cette fonction comme ceci: xxx

Vous pouvez donc l'appeler avec n'importe quel nom de votre table


0 commentaires