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')
我有以下查询,其中有一个派生(子查询)列。我在其中使用 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')