【问题标题】:SQL Query not returning Null valuesSQL 查询不返回 Null 值
【发布时间】:2019-12-24 17:56:23
【问题描述】:

我正在使用下面的查询来获取 USD 值,但是当 Unit_price 为 null 时,它必须返回 null 值,而我没有得到 null 值。请告诉我哪里出错了。谢谢!

数据库: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);

上述查询的输出如下..

请帮帮我。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    最简单的解决方法是将usd 表达式包含在指定业务规则的case 表达式中:

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

    '返回值y或z判断x是否为空'逻辑也可以用

    表示

    nvl2(some_value, value_if_not_null, value_if_null)

    所以在你的查询中我这样说:

    nvl2(p.unit_price, f.quantity_dispensed * nvl(pc.prc_amt,p.unit_price), null) as usd
    

    但我总是发现 nvl2 的可读性低于等效的 case 表达式。

    至于你哪里出错了,llpricing_lkup 标量子查询获取值而不管product.unit_price,所以只要分配了一些数量并且定义了一个涵盖服务日期的定价查找行,那么你就会得到一个价值。

    【讨论】:

    • 非常感谢William的详细解释。
    【解决方案2】:

    oracle 中的 NVL 函数返回第一个非空值。你的 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
    

    正在使用 llpricing_lkup 表中的一些计算,并且必须返回一些值。因此,您没有得到任何空值。如果要在 usd 列中获取 null,则必须删除子查询。

    【讨论】:

    • 感谢 ankit 的帮助
    【解决方案3】:

    NVL() 函数接受两个参数。如果 e1 计算结果为 null,则 NVL() 函数返回 e2。如果e1 计算结果为非空,则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
    

    【讨论】:

    • 感谢 Ajeet 的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2021-08-16
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多