如何像if子句一样使用NVL函数,并集成子查询?

How to use NVL function as like a if clause, and integrate a subquery?

我有这个 sql 查询

SELECT cast(dmh.DOC_NO as varchar(35)) AS DOCUMENT_ID, cast(dmh.DOC_TYPE as varchar(30)) AS DOC_TYPE_ID, dmh.CREATE_DATE as DOC_DATE, dmh.LOCATION as LOCATION, dmh.LOC_TYPE as LOC_TYPE, 'DOC_MERCH' as DOC_SOURCE, 
          (SELECT lcompany_fiscal_num
           FROM (SELECT lcompany_fiscal_num
                 FROM NB_IM_LOC_RIM_START locr, NB_LEGAL_COMPANY legalc
                    WHERE locr.LOC_TYPE = dmh.LOC_TYPE
                        AND locr.LOCATION = dmh.LOCATION
                        AND locr.LOC_START_DATE <= dmh.CREATE_DATE
                        AND legalc.LCOMPANY_CODE = locr.COMPANY
                        ORDER BY locr.LOC_START_DATE desc)
                        WHERE rownum = 1) as COMPANY_ID, 'N' as IS_PRINTED, 'N' as IS_MIGRATED
    FROM NB_DOC_MERCH_HEADER dmh
    WHERE dmh.DOC_TYPE IN ('VFT','NDB','VND','CVFT','VTD','VNC','NCI','NNC','CVNC', 'VFI')
          AND dmh.CREATE_DATE BETWEEN ADD_MONTHS(get_vdate, - (12 * 10)) and get_vdate
          AND dmh.DOCUMENT_ID_SMIS is null;

这个查询 returns 我这样的结果:

DOCUMENT_ID DOC_TYPE_ID DOC_DATE LOCATION LOC_TYPE DOC_SOURCE COMPANY_ID IS_PRINTED IS_MIGRATED
1600401 NDB 11.11.25 16 S DOC_MERCH (null) N N
1600401 NDB 11.11.25 160 W DOC_MERCH (null) N N

如您所见,company_id 在某些情况下为空,我不希望这种情况发生

我想做的是:当 attrib LOC_TYPE = 'S' 我想做一个查询,当 LOC_TYPE = 'W' 我想做另一个查询,为了解决空题。

NVL功能可以吗?如果是这样,我如何将其集成到我的代码中?

主要 select 子句:

select cast(...) as document_id, cast(...) as document_type_id, ...

当你来到 company_id 时,写下下面的 case 表达式,而不是你现在拥有的标量子查询:

select cast(...) as document_id, cast(...) as document_type_id, ...
...
, case loc_type when 'S' then (the scalar subquery for that case)
                when 'W' then (the scalar subquery for that case)
  end as company_id,
....

您可能有更多 loc_type 的情况(以相同的方式使用),您也可以有一个“默认”情况,前面有 else 关键字。注意列名(别名)前的end关键字;它是 case 表达式语法的一部分,并且是强制性的。

我认为 nvl 没有必要,因为你说案例 'S' 需要一件事,案例 'W' 需要另一件事。这不是 nvl 的工作方式 - 如果你想要在 所有 情况下使用“东西”,你会使用它,但是当那个“东西”为空时你想要“其他东西”。

尝试使用合并:

select cast(...) as document_id, cast(...) as document_type_id, ...
...
, coalesce( (the first scalar subquery),
            (the second scalar subquery),
            any_column_name
          )
  end as company_id,
...

它将return第一个非空结果。