1

どの製品がどの 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

ただし、「ヌル」に問題があります。isnull を試してみましたが、コードのさまざまな部分と case ステートメントですが、どこに行くのかわかりません。

誰かが私に何か助けを与えることができれば、それは素晴らしいことです。

4

1 に答える 1

2

私の推測では、問題のあるNULLs は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
于 2013-06-08T19:26:52.923 に答える