簡體   English   中英

Oracle SQL - 帶迭代的 Case 語句

[英]Oracle SQL - Case statement with iteration

應將 ASCII 表值與 s.manure_type 進行比較。 對於下表中的每條記錄,QuantityText case 語句都應該做一個比較。 它需要選擇的值是例如燕麥,天鵝絨豆,其他無。

select                        
c.id customer_num,
c.type type, 
s.id_text sample_num,
c.sasa_grower_code s_grower,
c.address s_address1,
c.postalcode s_post_code,
c.email q1_email,
nvl(c.client_name, c.farm_name )s_company,
c.farm_name s_estate,
c.contact_name s_contact,
s.id_numeric id_numeric,
s.id_text fas_lab_id,
s.date_received received_date,
s.date_printed printed_date,
s.sampled_date sampled_date,
e.name S_AREA_DESCRIP,
a.name s_advisor_name,
a.email s_advisor_email,
s.order_no s_order_num,
s.field_name s_field,
p.phrase_text  || ' cm' sample_depth,
cr.crop_name s_crop,
s.attyield s_yield,
s.variety s_varty, 
case when s.flg_trashed is null then 
               'None'
             else (case when s.flg_trashed = constant_pkg.get_true  then 
                     'Yes'
                   else (case when s.flg_trashed = constant_pkg.get_false then 
                          'No'
                         else ' ' 
                         end)
                   end) end trashed,
case when s.flg_irrigated is null then 
               'None'
             else (case when s.flg_irrigated = constant_pkg.get_true then 
                     'Yes'
                   else (case when s.flg_irrigated = constant_pkg.get_false then 
                          'No'
                         else ' ' 
                         end)
                   end) end s_irrig,     
                   CASE
                        WHEN trim(s.manure_type) in (select p.phrase_id from phrase p where p.phrase_type = 'AL_G_MANUR') then (select p.phrase_text from phrase p)
                    END AS QuantityText,                  
'' S_GM_YIELD,
s.project_code project_code,
s.trial_ref trial_ref,
s.cost_centre cost_centre
from client c
left outer join sample s on (s.client_id = c.id)
left outer join extension e on (e.id = c.extension_id)
left outer join advisor a on (a.id = c.advisor_id)
left outer join phrase p on (p.phrase_id = s.depth)
left outer join crop cr on (cr.id = s.crop_id)
where p.phrase_type = phrase_pkg.get_soil_depth
and c.id =    '211493A'
and s.fas_sample_type =  sample_pkg.get_soil_sample
and s.flg_recommendation = sample_pkg.get_flg_recommendation
and s.id_numeric between   14932  and  14933
+----------------------------+
|           Phrase           |
+----------------------------+
|AL_G_MANUR  OA Oats         |
|AL_G_MANUR  V  Velvet Beans
|AL_G_MANUR  O  Other
|AL_G_MANUR  N  None         |
+----------------------------+

但我收到錯誤 ORA-00900:單行查詢返回多於一行

其中一個 case 語句中缺少 where 子句很可能是原因。

CASE
  WHEN trim(s.manure_type) in 
      (select p.phrase_id from phrase p where p.phrase_type = 'AL_G_MANUR') 
    then (select p.phrase_text from phrase p) <<< NO WHERE CLAUSE ?
END AS QuantityText,                  

這個比較容易自己調試。

  1. 刪除單個選定列
  2. 檢查錯誤是否仍然發生
  3. 如果是,則返回到 1。
  4. 如果沒有,則驗證上次添加列錯誤的原因

問題出在以下語句中

then (select p.phrase_text from phrase p)

我想,應該用這個代替

(select p.phrase_text from phrase p where p.phrase_type = 'AL_G_MANUR')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM