【问题标题】:selecting with nvl function使用 nvl 功能选择
【发布时间】:2018-02-20 18:47:20
【问题描述】:

我有这个问题:

 select w.worker_id,   w.lastname,pd.invalid
                             from workers w,personal_data pd
                             where pd.worker_id (+) = w.worker_id
                             and nvl(pd.invalid,'N')='Y'

我有复选框 (y,n),该复选框的目的是获取无效列表,如果它被选中并且当它没有与包括无效的正常工作人员一起检查时。有了这个我总是得到无效的列表。

通过这个选择:

  select w.worker_id,   w.lastname,pd.invalid
                                 from workers w,personal_data pd
                                 where pd.worker_id (+) = w.worker_id
                                 and pd.invalid =nvl(:p_invalid,pd_invalid)

如果复选框是 Y,我会得到无效的工人,而当未选中时 (n) 我得到的只是普通工人,我需要得到 N 个所有工人的时间(无效和正常)。

【问题讨论】:

    标签: sql oracle report nvl


    【解决方案1】:

    停止使用(+) 语法!使用正确的、显式的外连接。

    但是,我认为您不需要外连接——您与常量的比较无论如何都会撤消它。我认为这可以满足您的要求:

    select w.worker_id, w.lastname, pd.invalid
    from workers w join
         personal_data pd
        on pd.worker_id = w.worker_id
    where (:p_invalid = 'N' or pd.invalid = :p_invalid);
    

    【讨论】:

    • 从您的选择中,当复选框为 N 时,我仍然只得到普通工人
    • @mikrimouse。 . .好的。 :p_invalid 采用 NULL 值还是仅采用“Y”和“N”?如果NULL,则相当于“Y”或“N”。我改变了答案,假设:p_invalid 永远不是NULL
    • 当我看到它时我改变了它;),但它有效......谢谢
    • @mikrimouse。 . .如果值不是NULL,那么这不是一种自然的方法。另外,我更喜欢COALESCE(),因为后者是标准SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多