使用regex_substr从oracle中的另一列获取相应的值

时间:2015-08-11 11:05:08

标签: oracle regexp-substr

我有以下查询,它提供了与我在where子句中给出的键对应的第n个字符串作为名称(分隔符为##)

select names from (
select 
    regexp_substr('a##b##c##d##e##f','[^##]+', 1, level) as names,
    rownum as nth
from dual
connect by regexp_substr('a##b##c##d##e##f', '[^##]+', 1, level) is  not    null
)
where nth in (

select nth from (
select 
    regexp_substr('150##200##13##8##51##61','[^##]+', 1, level) as names,
    rownum as nth
from dual
connect by regexp_substr('150##200##13##8##51##61', '[^##]+', 1, level) is  not    null
)
where names = '200'
)

现在,我有一个表格,其中有3列x,y和z,其中x的字符串类似于## b ## c ## d ## e ## f,y有1 ## 2 ## 3 ## 4 ## 5 ## 6和z的编号如1。

如果我有像

这样的行
  • a ## b ## c ## d ## e ## f 150 ## 200 ## 13 ## 8 ## 51 ## 61 200
  • a ## b ## c ## d ## e ## f 1 ## 2 ## 3 ## 4 ## 5 ## 6 2
  • g ## h ## i ## j ## k ## l 1 ## 2 ## 3 ## 4 ## 5 ## 99 99

我想要输出

  • a ## b ## c ## d ## e ## f 150 ## 200 ## 13 ## 8 ## 51 ## 61 200 b
  • a ## b ## c ## d ## e ## f 1 ## 2 ## 3 ## 4 ## 5 ## 6 2 b
  • g ## h ## i ## j ## k ## l 1 ## 2 ## 3 ## 4 ## 5 ## 99 99 l

在上面的查询中简单地插入“temp”代替dual需要很长时间,因为db有超过50k行。任何更好的解决方案或我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可能会找到一个简单的SQL解决方案,但我更愿意在函数中封装关键子字符串功能。之后,查询很简单

<强>更新

ko.bindingHandlers.datepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {

    var unwrap = ko.utils.unwrapObservable;
    var dataSource = valueAccessor();
    var binding = allBindingsAccessor();

    //initialize datepicker with some optional options
    var options = allBindingsAccessor().datepickerOptions || {};
    $(element).datepicker(options);
    $(element).datepicker('update', dataSource());
    //when a user changes the date, update the view model
    ko.utils.registerEventHandler(element, "changeDate", function (event) {
        var value = valueAccessor();
        if (ko.isObservable(value)) {
            value(event.date);
        }
    });
},
update: function (element, valueAccessor) {
    var widget = $(element).data("datepicker");

    var value = ko.utils.unwrapObservable(valueAccessor());

    //when the view model is updated, update the widget
    if (widget) {
        widget.date = value;
        if (widget.date) {
            widget.setValue();
            $(element).datepicker('update', value)
        }
    }
}};

with tcols as (
 select  rownum colnum from dual connect by level <= 6 /* (max) number of columns */),
 t2 as (
 select x,y,z, colnum,
 nth_substring(y,'#',colnum) subs
 from regexp_tst, tcols
 )
 select 
 x,y,z, colnum,
 nth_substring(x,'#',colnum) a
 from t2
 where subs = z
 ;

所需功能如下(您可能需要调整修剪和重复的分隔符逻辑)

 X                Y                         Z A                                                                      
 ---------------- ---------------- ---------- ----
 a##b##c##d##e##f 1##2##3##4##5##6          1 a         
 a##b##c##d##e##f 1##2##3##4##5##6          2 b    
 g##h##i##j##k##l 1##2##3##4##5##6          3 i