SQL 服务器 ISNULL 函数在派生查询中不起作用

SQL Server ISNULL function not working in derived query

我有以下查询,其中有一个派生(子查询)列。我在其中使用 ISNULL 函数,但是我的查询输出中仍然包含空值。为什么 ISNULL 函数没有按预期工作?您看到的结果为 NULL 的行实际上应该输出为“Test”

SELECT 
    PS_PO_HDR.PO_ID,
    PS_PO_HDR.BUSINESS_UNIT,
    (SELECT ISNULL(PS_PO_COMMENTS_FS.COMMENTS_2000, 'TEST') 
     FROM PS_PO_COMMENTS_FS PS_PO_COMMENTS_FS  
     WHERE 
         -- PS_PO_LINE.PO_ID='0000000003' AND
         PS_PO_COMMENTS_FS.BUSINESS_UNIT = PS_PO_LINE.BUSINESS_UNIT 
         AND PS_PO_COMMENTS_FS.PO_ID = PS_PO_LINE.PO_ID 
         AND PS_PO_COMMENTS_FS.LINE_NBR = PS_PO_LINE.LINE_NBR 
         AND PS_PO_COMMENTS_FS.COMMENT_TYPE = 'LIN') AS "NOTE_TO_VENDOR",
    'DR' AS 'DISCOUNT_REASON'
FROM 
    PS_PO_LINE PS_PO_LINE, PS_PO_HDR PS_PO_HDR
WHERE 
    PS_PO_LINE.BUSINESS_UNIT = PS_PO_HDR.BUSINESS_UNIT
    AND PS_PO_LINE.PO_ID = PS_PO_HDR.PO_ID  
    AND PS_PO_HDR.PO_STATUS NOT IN ('C', 'X', 'PX')

示例结果:

PO_ID           BUSINESS_UNIT         NOTE_TO_VENDOR        DISCOUNT_REASON
---------------------------------------------------------------------------
0000000004      11MMS                 NULL                  DR
0000000016      41000                 NULL                  DR
0000000021      41000                 Test Note1            DR

NULL 子查询 本身 return 编辑,而不是作为行中的值。子查询 return 没有行,表示为 NULL.

有两种处理方式:

您可以在子查询中使用聚合:

(SELECT ISNULL(MAX(PS_PO_COMMENTS_FS.COMMENTS_2000), 'TEST') 
. . . 

聚合强制子查询 return 一行。

或者您可以将 ISNULL() 逻辑移到子查询之外:

ISNULL( (SELECT PS_PO_COMMENTS_FS.COMMENTS_2000
         FROM . . .
        ), 'TEST'
      )
    SELECT 
PS_PO_HDR.PO_ID ,
PS_PO_HDR.BUSINESS_UNIT ,
**ISNULL(**(SELECT ISNULL(PS_PO_COMMENTS_FS.COMMENTS_2000, 'TEST') 
  FROM PS_PO_COMMENTS_FS PS_PO_COMMENTS_FS  
  WHERE -- PS_PO_LINE.PO_ID='0000000003' AND
  PS_PO_COMMENTS_FS.BUSINESS_UNIT=PS_PO_LINE.BUSINESS_UNIT 
  AND PS_PO_COMMENTS_FS.PO_ID=PS_PO_LINE.PO_ID 
  AND PS_PO_COMMENTS_FS.LINE_NBR=PS_PO_LINE.LINE_NBR 
  AND PS_PO_COMMENTS_FS.COMMENT_TYPE='LIN' ), **'TEST')** AS "NOTE_TO_VENDOR"  ,
'DR' AS 'DISCOUNT_REASON'
FROM PS_PO_LINE PS_PO_LINE, PS_PO_HDR PS_PO_HDR
WHERE 
 PS_PO_LINE.BUSINESS_UNIT=PS_PO_HDR.BUSINESS_UNIT
  AND PS_PO_LINE.PO_ID=PS_PO_HDR.PO_ID  
  AND PS_PO_HDR.PO_STATUS NOT IN ('C','X','PX')