2010-11-18 2 views
2

J'ai une requête SQL que je ne veux retourner que 1 ligne. S'il y a plusieurs lignes, je veux retourner null.Le serveur SQL renvoie uniquement une ligne ou une valeur nulle

Je crois que je peux le faire avec quelque chose comme

SELECT whatever FROM MyTable 
WHERE something = myQuery 
    AND (COUNT(SELECT whatever FROM MyTable 
      WHERE something = myQuery) = 1) 

mais c'est assez méchant et je me suis demandé s'il un moyen plus propre de le faire.

Répondre

4

Cant vous faire:

SELECT whatever FROM 
    (
     SELECT whatever, COUNT(*) As NumRecords 
     FROM MyTable 
     WHERE something = myQuery 
     GROUP BY whatever 
     HAVING NumRecords = 1 
    ) 
+1

+1 à tout le monde, mais je pense que c'est le plus mignon – fearofawhackplanet

+0

très agréable. KISS est toujours meilleur. –

1

Vous pouvez utiliser une clause IF pour vérifier une seule rangée et sélectionnez seulement si tel est le cas:

IF SELECT COUNT(*) FROM MyTable WHERE something = myQuery) = 1 
    BEGIN 
    SELECT whatever FROM MyTable 
    WHERE something = myQuery 
    END 
+0

je suis confus - c'est juste sa requête originale avec un IF au début? EDIT: juste vu votre édition, :) – RPM1984

+0

a encore besoin de deux requêtes - pas nécessaire (IMO) – RPM1984

+0

@ RPM1984 - Votre version est en effet une seule requête, cependant, s'il y a plusieurs colonnes à renvoyer ... – Oded

1

Eh bien, une autre façon peut-être:

select f1, f2, f3 
    from your_table 
where f4 = f5*2 
group by f1, f2, f3 
having count(1) = 1 

Je ne sais pas si c'est plus propre que votre solution.

0

set rowcount 1

Avant l'instruction de sélection.

Plus tard,

set rowcount 0

0

Nous pouvons ajouter cette façon aussi,

SELECT max(whatever) as whatever 
FROM MyTable 
WHERE something = myQuery 
HAVING COUNT(*) = 1 
Questions connexes