如何像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第一个非空结果。
我有这个 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第一个非空结果。