即使Result为0或Null,如何获取查询结果

时间:2013-12-05 02:26:18

标签: sql oracle null

我希望得到这个问题的答案。

我正在使用SQL Developer编写连接到Oracle数据库的查询。我需要的是,如果查询结果为空(我猜是null或0),我仍然需要显示一些内容。截至目前,当查询结果为空时,只有列标题出现。

以下代码是我迄今为止所尝试过的,但没有成功。

SELECT
to_char(rs.cr_date, 'MM/DD/YYYY') "Date",
COUNT(os.ord_id) "RTS Returned Orders"

FROM return_sku rs,
order_sku os

WHERE
rs.s_method Like '%RTS%'
AND trunc(created_date) = trunc(SYSDATE)
AND os.ord_sku_id = rs.ord_sku_id

GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY')) rts

当s_method列中存在“RTS”时,此工作正常;如,在我的查询结果中会出现一个数字。问题是当没有查询结果,其中rs.s_method中包含“RTS”时,我的查询只返回列标题而没有其他内容(见下文)。

Date      | RTS Returned Orders
------------------------------

我需要它,以便当s_method中没有“RTS”的结果时,它将在“RTS返回的订单”列中返回一个日期和数字0的行。如下所示:

Date      | RTS Returned Orders
------------------------------
12/4/2013 |         0

我尝试过使用解码和NVL无济于事。要么我没有正确使用它们,要么我可以使用其他我不知道的东西。

请帮忙!提前致谢。非常感谢任何帮助。

最诚挚的问候,

-Anthony C。

4 个答案:

答案 0 :(得分:2)

我认为您想要的查询使用条件聚合,而不是在where子句中进行过滤:

SELECT to_char(rs.cr_date, 'MM/DD/YYYY') as "Date",
       sum(case when rs.s_method Like '%RTS%' then 1 else 0 end) as "RTS Returned Orders"
FROM return_sku rs join
     order_sku os
     on os.ord_sku_id = rs.ord_sku_id
WHERE trunc(created_date) = trunc(SYSDATE)
GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY');

注意一些事情。 group by是不必要的,因为你只返回一行(但我将它留在原因,因为它是原始问题的一部分)。我还修复了join语法以使用标准连接语法(join ... on)而不是隐式连接。

答案 1 :(得分:1)

你可以这样做:

select "date", sum('MM/DD/YYYY') "Date") 
from 
(select to_char(sysdate, 'MM/DD/YYYY') "Date"
, 0 "'MM/DD/YYYY') "Date"
from dual
union

SELECT
to_char(rs.cr_date, 'MM/DD/YYYY') "Date",
COUNT(os.ord_id) "RTS Returned Orders"

FROM return_sku rs,
order_sku os

WHERE
rs.s_method Like '%RTS%'
AND trunc(created_date) = trunc(SYSDATE)
AND os.ord_sku_id = rs.ord_sku_id

GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY')) rts
) temp

不确定所有引用别名的语法,但总体思路应该有用。

答案 2 :(得分:0)

您可以使用子查询。

这将是伪代码。

选择检查columnA是否为null,然后显示备用值 从 (从当前查询中选择columnA)作为MyQuery

答案 3 :(得分:0)

WITH os_counts AS (
    SELECT COUNT(rs.ord_id) AS "RTS Returned Orders",
           os.ord_id
    FROM   order_sku os
           LEFT OUTER JOIN
           ( SELECT ord_id
             FROM   return_sku
             WHERE  s_method LIKE '%RTS%'
           ) rs
           ON ( os.ord_sku_id = rs.ord_sku_id )
    AND    TRUNC(created_date) = TRUNC(SYSDATE)
    GROUP BY
          os.ord_id
)
SELECT TO_CHAR( NVL( rs.cr_date, SYSDATE ), 'MM/DD/YYYY') "Date",
       "RTS Returned Orders"
FROM   os_counts os
       LEFT OUTER JOIN
       return_sku rs
       ON ( os.ord_sku_id = rs.ord_sku_id );

我不知道您的created_date列所在的哪个表格,因此您可能需要移动该声明。

较低的LEFT OUTER JOIN可能是INNER JOIN,但我不知道您的表格结构和依赖关系。

相关问题