Oracle APEX 5.1-如何在Shuttle控件中对所选值进行排序

时间:2018-09-28 09:47:24

标签: sql oracle oracle-apex-5.1

我有一个带有国家/地区列表的班车控制。因此,用户可以选择多个国家/地区,例如:UK, France, Portugal。顺序取决于用户如何选择或移动选择(请参见图片)

enter image description here

这些作为UK:France:Portugal存储在基础表中。

问题是我需要按字母顺序存储这些国家,因为UK:France:Portugal与France:Portugal:UK不同。我知道在理想情况下,这些文件将保存在单独的行中,但是不幸的是,这对我来说不是一个选择。

是否有一种方法可以按顺序(例如在选择国家/地区时通过动态操作)对往复式选单中的选定值(右侧)进行排序?

如果没有,作为替代,我们是否可以进行后期计算以排序和存储这些值?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不知道 Apex解决方案,但是我可以建议 Oracle解决方案

这里是一个示例:表test存储有关国家/地区的信息:

SQL> create table test (id number, countries varchar2(30));

Table created.

数据库触发器对countries列中的值进行排序。怎么样?它将冒号分隔的值字符串分成几行(regexpconnect by的操作),然后将它们合并回另一个冒号分隔的值字符串(使用listagg),但这时间排序(order by 1):

SQL> create or replace trigger trg_biu_cou
  2    before insert or update on test
  3    for each row
  4  begin
  5    select listagg(regexp_substr(:new.countries, '[^:]+', 1, level), ':') within group (order by 1)
  6    into :new.countries
  7    from dual
  8    connect by level <= regexp_count(:new.countries, ':') + 1;
  9  end;
 10  /

Trigger created.

好的,让我们看看它的工作原理:

SQL> insert into test (id, countries) values (1, 'UK:France:Portugal');

1 row created.

SQL> select * from test;

        ID COUNTRIES
---------- ------------------------------
         1 France:Portugal:UK

SQL> update test set countries = 'New Zealand:Croatia:Hungary' where id = 1;

1 row updated.

SQL> select * from test;

        ID COUNTRIES
---------- ------------------------------
         1 Croatia:Hungary:New Zealand

SQL>

可能还可以;试试看。