2013-06-08 2 views
1

J'ai la requête ci-dessous qui retourne quels produits sont sur quel orderID.Travailler avec Nulls

SELECT P.Name, 
STUFF ((SELECT ' | ' + CONVERT(VARCHAR(22) , SOD.SalesOrderID) 
     FROM Sales.SalesOrderDetail SOD 
     WHERE 
     P.ProductID = SOD.ProductID 
     FOR XML PATH ('') 
     ), 1, 1, '') 
     as Orders 
FROM Production.Product P 

Cependant, j'ai des problèmes avec les 'Nulls'. J'ai essayé isnull est différentes parties du code ainsi que d'une déclaration de cas, mais ne peut pas sembler comprendre où cela irait.

Si quelqu'un peut me donner de l'aide, ce serait génial.

+1

Qu'est-ce qui est annulé et qui ne devrait pas l'être? Pourriez-vous montrer quelques exemples de données et de résultats que vous recherchez? – sisdog

Répondre

2

Ma conjecture est que les NULL problématiques sont dans SOD.SalesOrderId.

One way to handle them is by filtering them out: 

SELECT P.Name, 
STUFF ((SELECT ' | ' + CONVERT(VARCHAR(22) , SOD.SalesOrderID) 
     FROM Sales.SalesOrderDetail SOD 
     WHERE 
     P.ProductID = SOD.ProductID and SOD.SalesOrderId is not null 
     FOR XML PATH ('') 
     ), 1, 1, '') 
     as Orders 
FROM Production.Product P 

Une autre façon est de les convertir à une représentation acceptable:

SELECT P.Name, 
STUFF ((SELECT ' | ' + coalesce(CONVERT(VARCHAR(22) , SOD.SalesOrderID), '<NULL>') 
     FROM Sales.SalesOrderDetail SOD 
     WHERE 
     P.ProductID = SOD.ProductID 
     FOR XML PATH ('') 
     ), 1, 1, '') 
     as Orders 
FROM Production.Product P 

EDIT:

Les NULL s sont retournés parce qu'il n'y a pas de correspondance dans SalesOrderDetail pour les enregistrements. Que voudriez-vous retourné dans ce cas?

Pour trouver ces produits:

select p.* 
from Production.Product p left outer join 
    Sales.SalesOrderDetail sod 
    on p.ProductID = SOD.ProductID 
where sod.ProductId is null; 

Si vous voulez les filtrer, puis utiliser un sous-requête:

select t.* 
from (<either of the above queries>) t 
where t.Orders is not NULL 

EDIT II:

Si vous voulez des blancs à retourner , puis envelopper coalesce() autour de la valeur:

SELECT P.Name, 
coalesce(STUFF ((SELECT ' | ' + CONVERT(VARCHAR(22) , SOD.SalesOrderID) 
     FROM Sales.SalesOrderDetail SOD 
     WHERE 
     P.ProductID = SOD.ProductID 
     FOR XML PATH ('') 
     ), 1, 1, ''), '') 
     as Orders 
FROM Production.Product P 
+0

Salut, Les deux requêtes renvoyaient toujours des valeurs NULL. http://oi42.tinypic.com/2v2e6fs.jpg Je pense que les valeurs nulles apparaissent comme ils font partie d'une jointure gauche et je ne sais pas s'il est possible de les filtrer du tout – Jay

+0

Bonjour, Je voudrais un blanc '' à retourner. Ce n'est pas un gros problème, c'est à des fins purement pédagogiques. – Jay

+0

Brillant! J'étais sûr que j'ai essayé isnull/coalesce dans toutes les parties possibles du code. Merci beaucoup de m'avoir aidé. Marqué comme répondu. – Jay