简体   繁体   English

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

[英]SQL Server ISNULL function not working in derived query

I have the follow query that has a derived (sub-query) column in it.我有以下查询,其中包含派生(子查询)列。 I am using the ISNULL function inside it, however my query output still has null values in it.我在其中使用ISNULL function,但是我的查询 output 仍然有 null 值。 Why is the ISNULL function not working as expected?为什么ISNULL function 没有按预期工作? The rows that you see resulting to NULL should actually be outputting as "Test"您看到的导致NULL的行实际上应该输出为“测试”

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')

Sample results:样本结果:

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

The NULL is being returned by the subquery itself, not as a value from a row. NULL子查询本身返回,而不是作为行中的值。 The subquery returns no rows, and that is represented as NULL .子查询不返回任何行,表示为NULL

There are two options for handling this:有两种处理方法:

You can either use aggregation in the subquery:您可以在子查询中使用聚合:

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

The aggregation forces the subquery to return one row.聚合强制子查询返回一行。

Or you can move the ISNULL() logic outside the subquery:或者您可以将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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM