当我在Oracle中使用CASE WHEN表达式时,出现了一个额外的空行

时间:2016-11-08 07:31:57

标签: oracle

我正在尝试使用简单的查询来获取报表的一些必要行。这是查询: -

SELECT DISTINCT Z.ITEMDESC, X.NMCODDES AS CODE

FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z

WHERE 
       X.NMHRDCDE='PKZ'
       AND Y.FINISHGD='Y'
       AND X.COMPCODE=Z.COMPCODE
       AND Y.COMPCODE=Z.COMPCODE
       AND X.COMPCODE=Y.COMPCODE
       AND Y.USERDEF1=X.NMSOFCDE
       AND Y.ITEMCODE=Z.ITEMCODE
       AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND  NVL(:P12,Z.DOCTDATE)

And Here's the ouput

但由于某些原因,我无法在{WH}中使用X.NMHRDCDE='PKZ'。所以,我只是在CASE WHEN Expression中使用X.NMHRDCDE='PKZ'。就像那样: -

SELECT DISTINCT Z.ITEMDESC, 

CASE 
WHEN X.NMHRDCDE='PKZ'
THEN X.NMCODDES
END AS CODE

FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z

WHERE 
      -- X.NMHRDCDE='PKZ'
       Y.FINISHGD='Y'
       AND X.COMPCODE=Z.COMPCODE
       AND Y.COMPCODE=Z.COMPCODE
       AND X.COMPCODE=Y.COMPCODE
       AND Y.USERDEF1=X.NMSOFCDE
       AND Y.ITEMCODE=Z.ITEMCODE
       AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND  NVL(:P12,Z.DOCTDATE)

在这种情况下,每行都与NULL NMCODDES字段重复。检查输出 - output

我无法理解为什么每个项目都有一个额外的空行。在上面的代码中使用ELSE没有任何区别。因为我可以确保在我的数据库中每个项目都有一个唯一的NMHRDCDE。因此,即使在案件中使用ELSE也无法解决我的问题。

有人可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

select a.ITEMDESC,b.CODE from
(SELECT DISTINCT Z.ITEMDESC 

FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z

WHERE 
      -- X.NMHRDCDE='PKZ'
       Y.FINISHGD='Y'
       AND X.COMPCODE=Z.COMPCODE
       AND Y.COMPCODE=Z.COMPCODE
       AND X.COMPCODE=Y.COMPCODE
       AND Y.USERDEF1=X.NMSOFCDE
       AND Y.ITEMCODE=Z.ITEMCODE
       AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND  NVL(:P12,Z.DOCTDATE)) as a


LEFT JOIN

(SELECT DISTINCT Z.ITEMDESC, 

CASE 
WHEN X.NMHRDCDE='PKZ'
THEN X.NMCODDES
END AS CODE

FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z

WHERE 
      -- X.NMHRDCDE='PKZ'
       Y.FINISHGD='Y'
       AND X.COMPCODE=Z.COMPCODE
       AND Y.COMPCODE=Z.COMPCODE
       AND X.COMPCODE=Y.COMPCODE
       AND Y.USERDEF1=X.NMSOFCDE
       AND Y.ITEMCODE=Z.ITEMCODE
       AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND  NVL(:P12,Z.DOCTDATE)) as b
on a.ITEMDESC = b.ITEMDESC

答案 1 :(得分:1)

忽略这些行的唯一方法是:

select * from (/*YOUR QUERY*/) where code is not null;

正如WJack写的那样,当案例不匹配并且行为正确时,你的空值会被篡改。 Where子句定义将返回哪些行,case定义将为行返回的内容。因此,您的第二个查询会返回任何X.NMHRDCDE的行,但没有X.NMHRDCDE != 'PKZ'

的值