首页 > 解决方案 > Oracle APEX 5.1 - 如何对 Shuttle 控件中的选定值进行排序

问题描述

我有一个带有国家列表的穿梭控制。所以用户可以选择多个国家,例如:UK, France, Portugal. 顺序取决于用户如何选择或移动选择(见图)

在此处输入图像描述.

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

问题是我需要按字母顺序存储这些国家/地区,因为 UK:France:Portugal 与France:Portugal:UK. 我知道在理想的世界中,这些都保存在单独的行中,但不幸的是,这对我来说不是一个选择。

有没有办法按字母顺序对穿梭机(右侧)中的选定值进行排序,可能是通过选择国家时的动态操作?

如果没有,作为替代方案,我们可以使用后计算计算来排序和存储这些值吗?

谢谢!

标签: sqloracleoracle-apex-5.1

解决方案


我不知道Apex-solution,但我可以建议Oracle-solution

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

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

Table created.

数据库触发器对countries列中的值进行排序。如何?它将冒号分隔的值字符串拆分为行(这就是regexpandconnect 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>

可能没问题;试试看。


推荐阅读