我有以下查询,它返回什么产品在什么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语句但似乎无法想象它会去哪里。
如果有人能给我任何帮助,那就太好了。
答案 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