我有這個 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;
此查詢回傳此類結果:
| DOCUMENT_ID | DOC_TYPE_ID | DOC_DATE | 地點 | LOC_TYPE | DOC_SOURCE | COMPANY_ID | IS_PRINTED | IS_MIGRATED |
|---|---|---|---|---|---|---|---|---|
| 1600401 | 新開發銀行 | 11.11.25 | 16 | 秒 | DOC_MERCH | (空值) | N | N |
| 1600401 | 新開發銀行 | 11.11.25 | 160 | 寬 | DOC_MERCH | (空值) | N | N |
正如您所看到的,在某些情況下 company_id 為空,我不希望這種情況發生
我想要做的是:當 attrib LOC_TYPE = 'S' 我想做一個查詢,當 LOC_TYPE = 'W' 我想做另一個查詢,以解決空問題。
這可能與 NVL 功能有關嗎?如果是這樣,我如何將其集成到我的代碼中?
uj5u.com熱心網友回復:
主要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,
....
您可能有更多 case for loc_type(以相同方式使用),并且您也可以在else關鍵字前面有一個“default” case 。注意end列名前的關鍵字(別名);它是case運算式語法的一部分,并且是強制性的。
我認為沒有必要,nvl因為您說案例“S”需要一件事,而案例“W”則需要另一件事。這不是nvl作業原理 - 如果您在所有情況下都想要“某物”,則可以使用它,但是當“某物”為空時,您需要“其他東西”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366517.html
