11
votes

Inverse de coalesce

existe une fonction dans SQL Server 2005 qui renvoie NULL [ou une valeur booléenne] si tout des arguments (de n'importe quel type) est NULL, ce qui me sauverait de l'écriture si A est null ou b est null ou c est null ... .


7 commentaires

@Michael B: probablement le dernier élément de la liste puisque ce n'est pas null et suffira. L'accent est null, alors qu'une valeur non nulle est importante, la valeur réelle n'est pas pertinente.


Aussi null, parce que tout implique aucun .


@Cran: (En supposant que votre commentaire est une réponse à @Michael B), ne serait-il pas de défaiter le but de la fonction que vous souhaitez, si vous renvoyez NULL quand aucun null n'est présent? Je veux dire que la fonction retournerait toujours null.


La vraie question pourrait être: ce qui est retourné si la liste est vide?


@JDK: En fait, c'était une erreur que j'ai dit que NULL doit être retourné. Une valeur de retour booléen suffirait (comme ou des retours). 1 Pour No Nulls dans la liste des paramètres et 0 Si des nulls, ou vice versa ...


Je suis curieux, est-ce une tâche qui est vraiment pour SQL? Cela ressemble à la logique commerciale plus que la gestion des données. Pourquoi ne pas simplement réussir les Resulatset sur votre application et laisser l'application faire la détermination rapide? Ou mon cerveau en arrière est-il pas saisissant quelque chose que ceci est pré-caféine?


Vous avez raison, la question sort de la curiosité. Je l'ai proposé comme j'ai écrit une requête pour un rapport ad-hoc hors Datawarehouse, il n'y a donc pas d'application. Mais je ne pense pas que les SGMS doivent coller strictement avec ANSI SQL et omettre de telles fonctions d'assistance. En fin de compte, ce que la coalesse peut également être réalisée au niveau des applications, mais pensez à quelle fréquence nous utilisons des regroupements dans des questions ...


5 Réponses :


1
votes

Non, le plus proche que vous obtenez est NULLIF (), mais ce n'est pas ce que vous voulez. Je voudrais juste rester à l'aide de la déclaration ou de la déclaration ici.


1 commentaires

En fait, NULLIF retourne null si les deux paramètres d'entrée sont les mêmes. Je ne vois aucun moyen de y parvenir avec des nullifs en cascade.



5
votes

Voici une façon modérément désagréable de le faire: xxx


2 commentaires

~ Shudders aux implications ~


Une avertissement sévère de Microsoft que NULL peut produire des résultats inattendus dans ce scénario: MSDN.MicRosoft .Com / fr-US / bibliothèque / ms177682.aspx



4
votes

Puisque NULLS PROPOGUE Vous pouvez faire:

(cola + colb + colc) is null


2 commentaires

C'est pourquoi j'ai mis la contrainte de tout type dans le poteau;)


Peut-être que vous pourriez les confirmer en un seul type, car les valeurs elles-mêmes n'ont pas d'importance pour le test. Peut-être un bit nullable?



0
votes

Que diriez-vous de ...

SELECT
CASE WHEN NULLIF(ISNULL(@testA, 1), @testA) 
        + NULLIF(ISNULL(@testB, 1), @testB) 
        + NULLIF(ISNULL(@testC, 1), @testC) > 0
    THEN 'Got NULL'
    ELSE 'NO NULL'
END


1 commentaires

Cela s'occupe de la contrainte "de tout type" , mais pour la lisibilité, je préférerais @Testa est null ou @testb est null ou @testc est null ou @Testc est null



0
votes

Je ne suis pas sûr de SQL Server, mais dans une base de données similaire (j'ai utilisé la ruche ici qui est plus proche des SGBD traditionnels en termes de syntaxe) Sélectionnez ISNULL (Concat (*)) de quelque_table; aiderait à vérifier si l'une des colonnes est null .

J'espère qu'il y a un moyen de jouer autour de ce concept dans SQL Server et ma suggestion aide à résoudre le problème efficacement.


0 commentaires