SQL查询不返回空值

SQL查询不返回空值,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我使用下面的查询来获取美元值,但是当单价为空时,它必须返回空值,我没有得到空值。请告诉我哪里出了问题。谢谢 DB:Oracle 11g 查询: SELECT data_raw_id, f.ndc_cd, date_of_service, quantity_dispensed, p.unit_price, NVL((SELECT f.quantity_dispensed * pc.prc_amt FRO

我使用下面的查询来获取美元值,但是当单价为空时,它必须返回空值,我没有得到空值。请告诉我哪里出了问题。谢谢

DB:Oracle 11g

查询

SELECT data_raw_id,
       f.ndc_cd,
       date_of_service,
       quantity_dispensed,
       p.unit_price,
       NVL((SELECT f.quantity_dispensed * pc.prc_amt
             FROM llpricing_lkup pc
            WHERE pc.ndc_cd = f.ndc_cd
              AND f.date_of_service BETWEEN pc.strt_dt AND pc.end_dt),
           f.quantity_dispensed * p.unit_price) usd
  FROM fact_data f
  JOIN product p
    ON f.ndc_Cd = p.ndc_Cd
 WHERE data_Raw_id in (44214229, 44214183, 41084896, 41244850, 41374409, 41501126, 41501107);
上述查询的输出如下所示


请帮助我。

oracle中的NVL函数返回第一个not null值。您的NVL功能-

NVL ((SELECT f.quantity_dispensed * pc.prc_amt
                        FROM llpricing_lkup pc
                       WHERE pc.ndc_cd = f.ndc_cd 
                         AND f.date_of_service BETWEEN pc.strt_dt
                                                   AND pc.end_dt)
                   , f.quantity_dispensed * p.unit_price) usd
正在使用LLU lkup表中的某些计算,并且必须返回一些值。因此,您不会得到任何空值。如果要在usd列中获取空值,必须删除子查询。

函数接受两个参数。如果
e1
的计算结果为null,则
NVL()
函数返回
e2
。如果
e1
的计算结果为非null,则
NVL()
函数将返回
e1

语法::

NVL(e1, e2)
因此,在查询中,nvl函数中的Select语句不为空,这就是它返回USD列数据的原因。请在
NVL()
函数处使用以下查询

NVL (f.quantity_dispensed * p.unit_price,(SELECT f.quantity_dispensed * pc.prc_amt
                        FROM llpricing_lkup pc
                       WHERE pc.ndc_cd = f.ndc_cd 
                         AND f.date_of_service BETWEEN pc.strt_dt
                                                   AND pc.end_dt)) usd

最简单的修复方法是将
usd
表达式括在指定业务规则的
大小写
表达式中:

select data_raw_id
     , f.ndc_cd
     , date_of_service
     , quantity_dispensed
     , p.unit_price
     , case when p.unit_price is not null then
           nvl
           (
             ( select f.quantity_dispensed * pc.prc_amt
               from   llpricing_lkup pc
               where  pc.ndc_cd = f.ndc_cd
               and    f.date_of_service between pc.strt_dt and pc.end_dt
             )
           , f.quantity_dispensed * p.unit_price
           )
       end as usd
from   fact_data f
       join  product p
             on  p.ndc_cd = f.ndc_cd
where  data_raw_id in (44214229, 44214183, 41084896, 41244850, 41374409, 41501126, 41501107);
但是,考虑到这一点,似乎可以通过将标量子查询作为外部联接合并到主查询中来简化事情:

select data_raw_id
     , f.ndc_cd
     , date_of_service
     , quantity_dispensed
     , p.unit_price
     , case
           when p.unit_price is not null then
               f.quantity_dispensed * nvl(pc.prc_amt,p.unit_price)
       end as usd
from   fact_data f
       join  product p
             on  p.ndc_cd = f.ndc_cd
       left join llpricing_lkup pc
             on  pc.ndc_cd = f.ndc_cd
             and f.date_of_service between pc.strt_dt and pc.end_dt
where  data_raw_id in (44214229, 44214183, 41084896, 41244850, 41374409, 41501126, 41501107);
“关于x是否为null的返回值y或z”逻辑也可以使用

因此,在你的询问中,我提出:

nvl2(p.unit_price, f.quantity_dispensed * nvl(pc.prc_amt,p.unit_price), null) as usd
但我总是发现
nvl2
的可读性不如等价的
case
表达式


至于哪里出了问题,
llpricing\u lkup
scalar子查询获取值,而不管
product.unit\u price
,因此,只要分配了一些数量,并且定义了包含服务日期的定价查询行,您就会得到一个值。

非常感谢William的详细解释。谢谢您的帮助。谢谢您的帮助