2012-08-17 5 views
2

Je travaille sur ce problème depuis plusieurs jours. J'ai une base de données oracle. Le problème doit être résolu en une requête. No Function, Pocedure, ... Je veux faire une sélection. Quand il a des résultats, affichez-les. Sinon, il devrait y avoir un "résultat vide".SQL Oracle: Remplacer un résultat vide par le mot

select case 
when count(*) = 0  
then 'no Entry' 
else MAX(Member)--all Members should be here 
END as Member 
from tableMember 
where Membergroup = 'testgroup'; 

Le problème est que Oracle veut une fonction Agregat par l'autre. Donc, je reçois seulement une valeur si le résultat n'est pas "aucune entrée". J'ai besoin de toutes les valeurs. Tous ceux qui peuvent m'aider sont les bienvenus et me rendent heureux.

+0

Quelle est la sortie désirée de la requête? faire une ex plle. – schurik

+0

Vous dites: "Quand il a des résultats, affichez-les". Est-ce que ces résultats ont plus d'une colonne? Si c'est le cas, il est impossible de savoir ce que vous demandez. Une requête a toujours un nombre défini de colonnes qu'elle renvoie. Ceux-ci ne peuvent pas changer en fonction de certaines conditions dans la requête elle-même. –

Répondre

3

ne sais pas ce que vous essayez d'atteindre, peut-être ce

select member from tablemember where Membergroup = 'testgroup' 
union 
select 'no Entry' 
from dual 
where NOT EXISTS (select member from tablemember where membergroup = 'testgroup') 
; 
+0

Merci, ça marche super! –

2

Il n'y a pas besoin de deux requêtes d'agrégat, il suffit de vérifier si max(member) est nul. Je le ferais de cette façon pour clarifier ce qui se passe.

select case when max_member is null then 'no entry' else max_member end as member 
    from (select max(member) as max_member 
      from tablemember 
      where membergroup = 'testgroup' 
       ) 

Cependant, si vous voulez retourner tous les membres que vous pouvez faire quelque chose comme ce qui suit:

select member 
    from tablemember 
where membergroup = 'testgroup' 
union all 
select 'no entry' 
    from dual 
where not exists (select 1 from tablemember where membergroup = 'testgroup') 
-2

Essayez ceci:

DECLARE C INTEGER; 

SELECT COUNT(*) INTO C FROM tableMember WHERE Membergroup = 'testgroup'; 

IF C > 0 

THEN 

    SELECT * FROM tableMember; 

ELSE 

    SELECT 'No results!' FROM tableMember; 

END IF; 
+0

Salut, vous pouvez utiliser la mise en forme du code en mettant en surbrillance la partie pertinente de votre code et en cliquant sur «{}». L'OP a spécifiquement demandé SQL non PL/SQL. De plus, votre code ne compilera ou affichera rien. Cela ne retournera rien au client. La deuxième partie de votre code n'était pas la syntaxe Oracle. – Ben

1

Si vous RIGHT JOIN votre requête avec une requête pour l'ensemble vide vous obtiendrez toujours une ligne et obtiendrez toutes les lignes si votre requête renvoie des données. C'est moins cher (plus rapide) qu'un UNION ou un UNION ALL avec un NOT EXISTS car il ne nécessite pas plusieurs balayages des données.

SELECT nvl(a.member,b.member) member 
    FROM (SELECT member FROM tablemember WHERE membergroup='????') a 
    RIGHT JOIN (SELECT 'no Entry' member FROM dual) b ON 1=1; 

environnement de test:

DROP TABLE tablemember; 
CREATE TABLE tablemember AS 
    (
     SELECT TO_CHAR(level) member 
     , DECODE(mod(level, 5), 0, 'testgroup', 'othergroup') membergroup 
     FROM dual CONNECT BY level <= 50 
    ); 
0

Vous pouvez utiliser des fonctions d'agrégation et NVL pour atteindre votre objectif:

SELECT MIN ('VALEUR 1') p1, MIN (» VALEUR 2') AS p2 dE DEUX OU 1 = 0

résultat

de cette requête est: NULL, NULL

suivant, remplacer les valeurs vides par les chaînes souhaitées:

SELECT 
    NVL(MIN('1'), 'empty value 1') AS p1, 
    NVL(MIN('STRING VALUE'), 'empty value 2') AS p2, 
    NVL(MIN((select 'subquery result' from dual)), 'empty subquery result') as p3 
FROM 
    DUAL 
WHERE 
    1=0 

Mais, vous ne pouvez pas mélanger les nombres et les chaînes dans les champs.

Questions connexes