使用Nulls

时间:2013-06-08 19:00:47

标签: sql-server tsql null

我有以下查询,它返回什么产品在什么orderID上。

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

但是,我在'Nulls'方面遇到了麻烦。我已经尝试过isnull是代码的不同部分以及case语句但似乎无法想象它会去哪里。

如果有人能给我任何帮助,那就太好了。

1 个答案:

答案 0 :(得分:2)

我的猜测是有问题的NULL位于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

另一种方法是将它们转换为可接受的表示形式:

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

编辑:

正在返回NULL,因为SalesOrderDetail中的记录没有匹配项。在这种情况下你想要什么回报?

要找到这些产品:

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

如果要过滤掉它们,请使用子查询:

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

编辑II:

如果要返回空格,请将coalesce()包围在值

周围
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