SQL将字符串拆分为每行中的每个字母
我用case从表中获取字符串,将其拆分为字母,每个字母表示活动/非活动0/1,然后从另一个表中返回一个单元格中所有活动字母的说明。。 注:字母顺序与其他表格相同 这就是我的情况:SQL将字符串拆分为每行中的每个字母,sql,string,oracle,split,Sql,String,Oracle,Split,我用case从表中获取字符串,将其拆分为字母,每个字母表示活动/非活动0/1,然后从另一个表中返回一个单元格中所有活动字母的说明。。 注:字母顺序与其他表格相同 这就是我的情况: CREATE TABLE Strings_tab ( Str_id NUMBER, Str_text VARCHAR2 (40) ); CREATE TABLE Reprsnt_Tab ( rep_id NUMBER, rep_text VARCHAR2 (40) );
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
我的方法是在一个包含多行的表中使用CONNECT BY LEVEL将CONNECT BY连接到辅助表,这不是一个好主意。看:
我的答案是:
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
table Reprsnt_选项卡聚合为一个XMLElemtent。要访问选定行,您只需执行$doc/rows/row[$selected\u row\u nr]/textthank you@vercelli。。这是一个很棒的问题,这就是我需要的。。我靠得太近了,解决不了这个问题。。哈哈,对不起,但是rep6、rep40、rep39的表示形式没有顺序,因为它在表REPRSNT_选项卡中。。因此,我更改了查询。。看看我的答案@vercelli@boshkash12当前位置很高兴你觉得它很有用,表示感谢的方式是投票并接受答案,如果你觉得它很有用,这意味着不仅仅是感谢,而且你对他们的努力是有回报的
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;
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
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
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