2016-08-02 122 views
2

我有从表格中获取字符串的情况,将它拆分为字母,每个字母表示“活动/不活动”“0/1”,然后从其他表中返回说明,信在一个单元.. 注:字母顺序,因为它是在其他表..将字符串中的每个字母都拆分为字母

这是我的情况:

CREATE TABLE Strings_tab 
(
    Str_id  NUMBER, 
    Str_text VARCHAR2 (40) 
); 

CREATE TABLE Reprsnt_Tab 
(
    rep_id  NUMBER, 
    rep_text VARCHAR2 (40) 
); 

INSERT INTO Strings_tab VALUES (1, '1111111111000000000011111111110000000000'); 
INSERT INTO Strings_tab VALUES (2, '0000011111000001111100000111110000011111'); 

INSERT INTO Reprsnt_Tab VALUES (1, 'rep1'); 
INSERT INTO Reprsnt_Tab VALUES (2, 'rep2'); 
INSERT INTO Reprsnt_Tab VALUES (3, 'rep3'); 
INSERT INTO Reprsnt_Tab VALUES (4, 'rep4'); 
INSERT INTO Reprsnt_Tab VALUES (5, 'rep5'); 
INSERT INTO Reprsnt_Tab VALUES (6, 'rep6'); 
INSERT INTO Reprsnt_Tab VALUES (7, 'rep7'); 
INSERT INTO Reprsnt_Tab VALUES (8, 'rep8'); 
INSERT INTO Reprsnt_Tab VALUES (9, 'rep9'); 
INSERT INTO Reprsnt_Tab VALUES (10, 'rep10'); 
INSERT INTO Reprsnt_Tab VALUES (11, 'rep11'); 
INSERT INTO Reprsnt_Tab VALUES (12, 'rep12'); 
INSERT INTO Reprsnt_Tab VALUES (13, 'rep13'); 
INSERT INTO Reprsnt_Tab VALUES (14, 'rep14'); 
INSERT INTO Reprsnt_Tab VALUES (15, 'rep15'); 
INSERT INTO Reprsnt_Tab VALUES (16, 'rep16'); 
INSERT INTO Reprsnt_Tab VALUES (17, 'rep17'); 
INSERT INTO Reprsnt_Tab VALUES (18, 'rep18'); 
INSERT INTO Reprsnt_Tab VALUES (19, 'rep19'); 
INSERT INTO Reprsnt_Tab VALUES (20, 'rep20'); 
INSERT INTO Reprsnt_Tab VALUES (21, 'rep21'); 
INSERT INTO Reprsnt_Tab VALUES (22, 'rep22'); 
INSERT INTO Reprsnt_Tab VALUES (23, 'rep23'); 
INSERT INTO Reprsnt_Tab VALUES (24, 'rep24'); 
INSERT INTO Reprsnt_Tab VALUES (25, 'rep25'); 
INSERT INTO Reprsnt_Tab VALUES (26, 'rep26'); 
INSERT INTO Reprsnt_Tab VALUES (27, 'rep27'); 
INSERT INTO Reprsnt_Tab VALUES (28, 'rep28'); 
INSERT INTO Reprsnt_Tab VALUES (29, 'rep29'); 
INSERT INTO Reprsnt_Tab VALUES (30, 'rep30'); 
INSERT INTO Reprsnt_Tab VALUES (31, 'rep31'); 
INSERT INTO Reprsnt_Tab VALUES (32, 'rep32'); 
INSERT INTO Reprsnt_Tab VALUES (33, 'rep33'); 
INSERT INTO Reprsnt_Tab VALUES (34, 'rep34'); 
INSERT INTO Reprsnt_Tab VALUES (35, 'rep35'); 
INSERT INTO Reprsnt_Tab VALUES (36, 'rep36'); 
INSERT INTO Reprsnt_Tab VALUES (37, 'rep37'); 
INSERT INTO Reprsnt_Tab VALUES (38, 'rep38'); 
INSERT INTO Reprsnt_Tab VALUES (39, 'rep39'); 
INSERT INTO Reprsnt_Tab VALUES (40, 'rep40'); 

COMMIT; 

这是我的查询:

SELECT STR_TEXT, 
     RTRIM (
      XMLAGG (XMLELEMENT (E, DATA.REP_TEXT || ',' || CHR (10))).EXTRACT (
      '//text()'), 
      ',') 
      REPS 
    FROM ( SELECT LETTER, 
       STR_ID, 
       LVL, 
       STR_TEXT, 
       REP_TEXT 
      FROM ( SELECT DISTINCT SUBSTR (A.STR_TEXT, LEVEL, 1) LETTER, 
             A.STR_ID, 
             LEVEL LVL, 
             A.STR_TEXT 
         FROM STRINGS_TAB A 
        CONNECT BY LEVEL <= LENGTH (A.STR_TEXT) ---- HERE IS MY PROBLEM 
             ) TXT, 
       ( SELECT ROWNUM RN, REPRSNT_TAB.* 
         FROM REPRSNT_TAB 
        ORDER BY REP_ID) B 
      WHERE B.RN = TXT.LVL AND LETTER = 1 
     ORDER BY STR_ID, STR_TEXT, LVL) DATA 
     GROUP BY STR_TEXT 

这个查询得到COR矩形数据 如果我把10代替“LENGTH(A.STR_TEXT)”来获得每个字符串的前10个字母。 但是..如果“LENGTH(A.STR_TEXT)”这么大,在我的情况40,查询将挂起 所以,请,建议我..在这种情况下???从我的查询,如果我把“LEVEL < = 10”

结果:

 STR_TEXT       REP 
------------------------------- ------------------------------ 
000001111100000111110000011111 rep6,rep10,rep9,rep8,rep7 
111111111100000000001111111111 rep1,rep10,rep9,rep8,rep7,rep6,rep5,rep4,rep3,rep2 

回答

1

我的做法采取CONNECT BY到辅助表(表中的使用CONNECT BY LEVEL超过1行不是很好。恕我直言想法看here):

with aux as (select level as lvl 
       from dual 
       connect by level <= (select max(length(str_text)) from strings_tab)) 
SELECT STR_TEXT, 
     RTRIM (
      XMLAGG (XMLELEMENT (E, DATA.REP_TEXT || ',' || CHR (10))).EXTRACT (
      '//text()'), 
      ',') 
      REPS 
    FROM ( SELECT LETTER, 
       STR_ID, 
       LVL, 
       STR_TEXT, 
       REP_TEXT 
      FROM ( SELECT DISTINCT SUBSTR (A.STR_TEXT, LVL, 1) LETTER, 
             A.STR_ID, 
             LVL, 
             A.STR_TEXT 
         FROM STRINGS_TAB A join aux x on x.lvl <=LENGTH (A.STR_TEXT) 
             ) TXT, 
       ( SELECT ROWNUM RN, REPRSNT_TAB.* 
         FROM REPRSNT_TAB 
        ORDER BY REP_ID) B 
      WHERE B.RN = TXT.LVL AND LETTER = 1 
     ORDER BY STR_ID, STR_TEXT, LVL) DATA 
     GROUP BY STR_TEXT; 

输出(未(CHAR(10))

STR_TEXT         REPS 
0000011111000001111100000111110000011111 rep6,rep40,rep39,rep38,rep37,rep36,rep30,rep29,rep28,rep27,rep26,rep20,rep19,rep18,rep17,rep16,rep10,rep9,rep8,rep7 
1111111111000000000011111111110000000000 rep1,rep30,rep29,rep28,rep27,rep26,rep25,rep24,rep23,rep22,rep21,rep10,rep9,rep8,rep7,rep6,rep5,rep4,rep3,rep2 
+1

谢谢@vercelli ..这是奇妙的查询,这是我需要..我太接近解决了..哈哈哈哈 – boshkash12

+0

对不起,但代表rep6, rep40,rep39没有顺序,因为它是在表REPRSNT_TAB ..所以我改变查询..看我的回答@vercelli – boshkash12

+1

@ boshkash12:很高兴你觉得它有帮助,说的方式感谢你是upvote和接受答案,如果你发现它有帮助,这意味着更多比感谢,也是你的努力奖励 – TheGameiswar

0

这就是我的回答:

SELECT str_text, 
     LISTAGG (DATA.REP_TEXT, ',' || CHR (10)) 
      WITHIN GROUP (ORDER BY DATA.rn_rep) 
      reps 
    FROM (SELECT * 
      FROM ( SELECT str_text, SUBSTR (str_text, rn, 1) OneDigit, rn 
         FROM (SELECT str_text FROM STRINGS_TAB) txt, 
          ( SELECT ROWNUM rn 
            FROM DUAL 
          CONNECT BY LEVEL <= 
              (SELECT MAX (LENGTH (str_text)) 
              FROM STRINGS_TAB)) rep 
        WHERE REP.RN <= LENGTH(str_text) 
        ORDER BY Str_text, rn) xx, 
       ( SELECT ROWNUM rn_rep, rep_text 
         FROM REPRSNT_TAB 
        ORDER BY rn_rep) desc_rep 
      WHERE desc_rep.rn_rep = xx.rn AND OneDigit = 1) data 
GROUP BY str_text 
0
select Str_id 
     ,Str_text 
     ,xmlquery('let $abc := for $i in 1 to string-length($str) 
           where substring($str, $i, 1) = "1" 
            return $data/rows/row[$i]/text() 
        return string-join($abc, ",")' 
     passing Str_text as "str" 
       , (select xmlelement("rows",xmlagg(xmlelement("row",rep_text) order by rep_id)) from Reprsnt_Tab) as "data" 
     returning content 
    ) from Strings_tab 

表Reprsnt_Tab是汇总到一个xmlelemtnt。要访问选定的行,你只需要做$doc/rows/row[$selected_row_nr]/text()

+0

如果有什么不清楚,我可以添加解释 –

相关问题