Oracle Apex 復選框回傳值保存在表中作為冒號描述的串列:
01:02:03:04
這就是它們出現在報告列中的方式,但是我想將這些值解碼回顯示值:
Apple:Banana:Carrot:Durian
如果此回傳值來自選擇串列的位置,我將使用以下 sql:
select display, return
from lov_list
where type = 'fruit'
然而,這會不經意地回傳一個ORA-01722: invalid number錯誤。我嘗試的第一種方法可能是嵌套替換函式:
replace(replace(replace(replace(fruit_column, '01', Apple), '02', 'Banana'), '03', 'Carrot'), '04', 'Durian')
這有效,但不是“動態的”,因為將來我希望能夠向 lov_list 表添加新值,而不必更新或添加更多嵌套替換函式,尤其是如果我現在有 10 個以上的新值。我的理論是我想做的是以下內容:
select replace(ft.fruit_column, ll.return, ll.display)
from fruit_table ft
left join lov_list ll
on ft.fruit_column like ('%'||ll.return||'%')
但這僅適用于相同的值:
Apple:02:03:04
02:Carrot
etc.
我查看了其他用戶創建的多個替換函式,但我認為它們不會解決特定問題,無論如何都不會“動態”地作業,除非我在這些函式中遺漏了某些東西并且它們實際上可以作業,我我不確定。他們是我可以采取的另一種方法嗎?
uj5u.com熱心網友回復:
您應該首先將冒號分隔的值拆分為行,然后將這些值與包含水果名稱的表連接起來,最后 - 將結果聚合回一個以冒號分隔的 NAMES 串列。
SQL> with
2 chbox (val) as
3 (select '01:02:03' from dual),
4 fruits (id, name) as
5 (select '01', 'Apple' from dual union all
6 select '02', 'Banana' from dual union all
7 select '03', 'Carrot' from dual
8 ),
9 temp as
10 -- first split colon-delimited value into rows
11 (select level lvl,
12 regexp_substr(val, '[^:] ', 1, level) id
13 from chbox
14 connect by level <= regexp_count(val, ':') 1
15 )
16 -- finally, join TEMP ID's with FRUITS; aggregate names
17 select listagg(f.name, ':') within group (order by t.lvl) result
18 from fruits f join temp t on t.id = f.id;
RESULT
------------------------------
Apple:Banana:Carrot
SQL>
您需要的代碼從第 9 行開始(只需在tempCTE 名稱前面加上with關鍵字)。
uj5u.com熱心網友回復:
我不太了解您的資料模型,但我喜歡使用 apex_string 包將分隔字串轉換為行。
例如
select display, return
from lov_list
where type = 'fruit'
and return in (
select column_value
from apex_string.split('01:02:03:04', ':')
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366512.html
標籤:sql 甲骨文 plsql oracle-apex oracle-apex-5.1
上一篇:基于列值拆分行的遞回CTE
下一篇:如果有重復,請保留所有條目
