P處理的中有大量判斷條件是的sql寫法

2021-06-03 05:20:39 字數 2745 閱讀 9157

在執行p處理時需要根據傳經來的引數來寫where條件的時候可能因為,引數太多,或者傳值的範圍太多而導致sql的where條件不好寫。巢狀什麼的都out。

最好的方法是,定義乙個變數如: v_strsql varchar2(20000);然後執行的時候寫:  v_strsql := 'select ftbl.nendo, ftbl.nendo_meisho, ftbl.fukushiki_renban, ftbl.shikko_no || ''_'' || ftbl.shikko_no_edaban as shishutsuno, ' ||

'case ftbl.data_shubetsu when ''0'' then ''歳入'' when ''1'' then ''歳出'' when ''3'' then ''資產'' when ''4'' then ''決算整理'' when ''5'' then ''マッチング'' when ''7'' then ''鏈結'' else '''' end as kbn, ' ||

'to_char(to_date(ftbl.shikko_date, ''yyyy/mm/dd''), ''yyyy/mm/dd'') as shikko_date, ' ||

'ftbl.shukanka, ftbl.shukanka_ref.bumon_meisho, ' ||

'ftbl.shikko_kikan, ftbl.shikko_kikan_ref.bumon_meisho, ' ||

'ftbl.kaikei, ftbl.kaikei_ref.kaikei_meisho, ' ||

'nvl(ftbl.tanshiki_kamoku.kankomoku.kan, '''') as kan, nvl(ftbl.tanshiki_kamoku.kankomoku.kou, '''') as kou, nvl(ftbl.tanshiki_kamoku.kankomoku.moku, '''') as moku, ' ||

'nvl(ftbl.tanshiki_kamoku.jigyo.jigyo_dai, '''') as dai, nvl(ftbl.tanshiki_kamoku.jigyo.jigyo_chu, '''') as chu, ' ||

'nvl(ftbl.tanshiki_kamoku.jigyo.jigyo_sho, '''') as sho, nvl(ftbl.tanshiki_kamoku.jigyo.jigyo_sai, '''') as sai, ' ||

'nvl(ftbl.tanshiki_kamoku.setsu.setsu, '''') as setsu, nvl(ftbl.tanshiki_kamoku.setsu.saisetsu, '''') as saisetsu, nvl(ftbl.tanshiki_kamoku.setsu.saisai, '''') as saisai, ' ||

'case data_shubetsu when ''0'' then nvl(ftbl.sainyu_kamoku_ref.tanshiki_meisho,'''') when ''1'' then nvl(ftbl.saishtsu_kamoku_ref.tanshiki_meisho,'''') else '''' end as kamokumei, ' ||

'swk_nt.karikata.kingaku, swk_nt.remarks ' ||

'from fukushiki_tab ftbl, table(ftbl.shiwake_data) swk_nt ' ||

'where ftbl.data_shubetsu = ''' || wkdatatype || ''' and ftbl.nendo = ' || wknendo ||

' and ftbl.shikko_date >= ''' || wkshikkodatefrom || ''' and ftbl.shikko_date <= ''' || wkshikkodateto || ''' ';在需要根據引數來寫where的時候:

if wkdatatype = '1' then    /* データ種別が歳出の場合のみ */

if wkdaijigyo != '00' then    /* 大事業 */

v_strsql := v_strsql || 'and ftbl.saishtsu_dai_jigyo_ref.hyoji_tanshiki.jigyo.jigyo_dai = ''' || wkdaijigyo || ''' ';

end if;

if wkchujigyo != '00' then    /* 中事業 */

v_strsql := v_strsql || 'and ftbl.saishtsu_chu_jigyo_ref.hyoji_tanshiki.jigyo.jigyo_chu = ''' || wkchujigyo || ''' ';

end if;

if wkshojigyo != '00' then    /* 小事業 */

v_strsql := v_strsql || 'and ftbl.saishtsu_sho_jigyo_ref.hyoji_tanshiki.jigyo.jigyo_sho = ''' || wkshojigyo || ''' ';

end if;

if wksaijigyo != '00' then    /* 細事業 */

v_strsql := v_strsql || 'and ftbl.saishtsu_sai_jigyo_ref.hyoji_tanshiki.jigyo.jigyo_sai = ''' || wksaijigyo || ''' ';

end if;

end if;

避免把判斷處理放入 WHERE 條件

業務需求如下 有表a 在查詢的時候,需要根據標誌確定是查詢大於某個值的記錄,還是小於某個值的記錄 if a 0 select trannumber from a where trannumber 10000 else if a 1 select trannumber from a where tra...

SQL 查詢語句 IIF()處理條件判斷

語法 iif expr,truepart,falsepart 例子 select iif 選擇 1,金額 as 新金額 from 表1 已經測試通過 在access中,1 表示 是 0 表示 否 iif 返回由邏輯測試確定的兩個數值或字串值之一。語法 數字 iif logical expressio...

避免把判斷處理放入 WHERE 條件

問題描述 業務需求如下 有表a,在查詢的時候,需要根據標誌確定是查詢大於某個值的記錄,還是小於某個值的記錄 a 一般的處理方法 if a 0 select trannumber from a where trannumber 10000 else if a 1 select trannumber f...