1

我有一个字符串

vl_str_uniq=D01,D08,D02,D05,D31,D24...我想在下面的这个 ON 上执行 ORDER BYdynamic query


 'SELECT   a.trcode,
               townname,
                     DAYS COUNT,'
            || vl_str_uniq
            || ' FROM   MTXNMGRMTPDT3 a
          WHERE   a.entryno ='
            || p_entryno
            || ' AND a.geocode = '
            || p_geocode
            || ' AND a.bu ='
            || p_bu
            || ' AND a.recstat=0';

那么输出会像

trcode ||镇名|| 天数||D01 ||D05||D09||D03 ..

或者任何内置的无序字符串

vl_str_uniq

所以我希望在上述查询中订购 D01 ||D03||D05||D09 ...?

我怎样才能以任何可能的方式实现这一目标?

4

1 回答 1

2
select * from (
select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, level) as split from dual
connect by regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31', '[^,]+', 1, level) is not null
  ) order by split asc

输出:

SPLIT
D01
D02
D03
D04
D10
D11
D12
D20
D21
D22
D30
D31

链接到小提琴

REGEXP_SUBSTR可以在这里找到一个很好的解释。可以在这里
找到 一个很好的解释connected by

简短说明:

select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, 1) as split from dual

返回第一个子字符串 match D01。如果我们将最后一个参数更改为 2:

select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, 2) as split from dual

它将返回第二场比赛:D08等等。

Connected by是根据元素的“层次结构”递归地“排序”元素(这是它们在字符串中出现的顺序 - 在我们的示例中)。这个顺序可以通过level参数查看。将查询更改为:

select level, regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, level) as split from dual
connect by regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31', '[^,]+', 1, level) is not null

将根据其“级别”输出子字符串:

LEVEL   SPLIT
1       D01
2       D08
3       D02
4       D05
5       D10
6       D11
7       D12
8       D20
9       D21
10      D22
11      D30
12      D31

在我们利用该级别递归地显示所有子字符串之后,我们用另一个查询“包装”查询 - 对于order by(字符串的自然顺序)。

于 2013-09-19T03:35:38.300 回答