我需要将0和1的字符串转换为表示1的整数序列,类似于打印对话框中的页面选择序列。将0和1的序列转换为打印样式的页面列表
例如'0011001110101' - >'3-4,7-9,11,13'
是否可以在单个SQL选择(在Oracle 11g中)执行此操作?
我可以得到页码的个人列表下列要求:
with data as (
select 'K1' KEY, '0011001110101' VAL from dual
union select 'K2', '0101000110' from dual
union select 'K3', '011100011010' from dual
)
select
KEY,
listagg(ords.column_value, ',') within group (
order by ords.column_value
) PAGES
from
data
cross join (
table(cast(multiset(
select level
from dual
connect by level <= length(VAL)
) as sys.OdciNumberList)) ords
)
where
substr(VAL, ords.column_value, 1) = '1'
group by
KEY
但是,这并不做分组(如返回“3,4,7,8,9,11,13 “为第一个值)。
如果我可以在每次更改值时分配组号,那么我可以使用分析函数来获取每个组的最小值和最大值。即如果我能生成以下,然后我会设置:
Key Page Val Group
K1 1 0 1
K1 2 0 1
K1 3 1 2
K1 4 1 2
K1 5 0 3
K1 6 0 3
K1 7 1 4
K1 8 1 4
K1 9 1 4
K1 10 0 5
K1 11 1 6
K1 12 0 7
K1 13 1 8
但我坚持这一点。
任何人有任何想法,或另一种方法来得到这个?
这是真棒!通过使用基于扩展数据的递归查询,我得到了一些工作,但是你的优雅更加优雅,更不用说提速几个数量级。 – Barney