2010-11-17 3 views
5

En avance, je voudrais dire merci pour l'aide. C'est une grande communauté et j'ai trouvé beaucoup de réponses de programmation ici.SQL Retourne Null si une colonne est nulle (en face de COALESCE())

J'ai une table avec plusieurs colonnes, dont 5 contiennent des dates ou null.

Je voudrais écrire une requête sql qui fusionne essentiellement les 5 colonnes en 1 colonne, à la condition que si 1 des 5 colonnes contient une valeur "NULL", la valeur retournée est null. Essentiellement le contraire de la condition de coalesce de retourner le premier non-nul, je veux retourner le premier null. Si aucun n'est nul, retourner le plus grand des 5 dates serait optimal, cependant je peux me contenter de retourner l'une des 5 dates.

C1   C2   C3  C4  C5 
    --   --   --  --  -- 
1/1/1991 1/1/1991 1/1/1991 1/1/1991 2/2/1992 
    NULL  1/1/1991 1/1/1991 1/1/1991 1/1/1991 

requête renvoie:

C1 
    -- 
2/2/1992 
    NULL 

Merci beaucoup.

(serveur est MSSQL2008)

+2

Il peut le rendre plus facile pour vous de savoir que la somme d'un ensemble contenant 'null' est' null' ... – JNK

+1

Qu'est-ce que la base de données du serveur utilisez-vous? – Rudi

+0

Je suppose que vous obtiendrez une large gamme de réponses d'Oracle, à SQL Server, jusqu'à ce que vous nous fassiez savoir quel système de base de données vous utilisez. Le plus grand et le moins travailler avec Oracle. Ma solution devrait fonctionner pour les deux. – JonH

Répondre

0

Sans overthinking il:

SELECT 
    CASE WHEN c1 is null or c2 is null or c3 is null or c4 is null or c5 is null 
     THEN null 
     ELSE c1 
    END 
FROM mytable 

Mon édition est comme suit:

CASE 
WHEN (c1 >= c2 AND c1 >= c3) THEN c1 
WHEN (c2 >= c1 AND c2 >= c3) THEN c2 
WHEN (c3 >= c1 AND c3 >= c2) THEN c3 
END 
+0

Voici les rouages ​​de ce dont j'avais besoin. Merci beaucoup à tous, sincèrement. En tant que gars qui apprend le SQL depuis le web, c'est bien d'avoir une ressource pour me connecter avec des gens qui connaissent WAAAAY plus que moi. Je ne savais pas s'il y avait une fonction intégrée ou si je devais utiliser une déclaration de cas . –

+0

DownVoter, vous voulez expliquer? – Axn

+0

Cela ne retournera pas le maximum de 5 si tous les cinq ne sont pas nuls. –

-1

Peut-être avec LEAST? Je ne sais pas comment cela fonctionne avec NULL.

2
select greatest(c1, c2, c3, c4, c5) 
from table; 

La vie peut être si facile :-)

(edit: fonctionne sur Oracle)

1

Essayez ceci:

SELECT 
    CASE WHEN t1.SomeDate IS NULL THEN NULL ELSE MAX(t1.SomeDate) END AS TheVal 
FROM 
(
SELECT C1 AS SomeDate FROM Table_1 
UNION ALL 
SELECT C2 AS SomeDate FROM Table_1 
UNION ALL 
SELECT C3 AS SomeDate FROM Table_1 
UNION ALL 
SELECT C4 AS SomeDate FROM Table_1 
UNION ALL 
SELECT C5 AS SomeDate FROM Table_1 
) t1 
GROUP BY 
t1.SomeDate 
+0

Quelle est votre sortie lorsque vous exécutez la requête sur les données de l'OP? Avez-vous deux disques ou trois? – Axn

+0

Je reçois 3 enregistrements, NULL, 1991 et 1992 lors de l'exécution de votre requête. Êtes-vous sûr d'utiliser le bon jeu de données? – Axn

+0

OK, le premier commentaire était inexact, je l'ai supprimé. @JonH Comme vous écrasez toutes les colonnes en lignes avec une union totale, il n'y a aucune garantie que votre solution produira 1 résultat par enregistrement original. Changez les données d'origine pour avoir 9 dates différentes et une valeur nulle. Votre requête renvoie ensuite 10 résultats au lieu de 2.Cela explique mon downvote sur votre solution. –

-2
SELECT 
    CASE WHEN C1 IS NULL THEN C2 WHEN C1 IS NULL AND C2 IS NULL THEN C3 WHEN C1 IS NULL AND C2 IS NULL AND C3 IS NULL THEN C4 WHEN C1 IS NULL AND C2 IS NULL AND C3 IS NULL AND C4 IS NULL THEN C5 ELSE C1 END AS REQUIREDNOTNULLVALUE 
FROM 
TABLE1 
Questions connexes