如:如查詢test表中 t這個欄位 內容是
T
-------------------
A,B,C,D
如何 能查詢的結果為
T
-------------------------------
A
B
C
D
uj5u.com熱心網友回復:
-- 支持多行
SQL>
SQL> create table test(id int, name varchar(50));
Table created
SQL> begin
2 insert into test values(1, 'A,B,C,D,E,F');
3 insert into test values(2, '111,333,555,22');
4 end;
5 /
PL/SQL procedure successfully completed
SQL> col id format a10;
SQL> select id, regexp_substr(name, '[^,]+', 1, level) colA
2 from test
3 connect by level <= regexp_count(name, ',') + 1
4 and prior rowid = rowid
5 and prior dbms_random.value is not null
6 order by id, cola;
ID COLA
---------- -----------------------------------------
1 A
1 B
1 C
1 D
1 E
1 F
2 111
2 22
2 333
2 555
10 rows selected
SQL> drop table test purge;
Table dropped
SQL>
uj5u.com熱心網友回復:
如果不帶主鍵 id 那么 至單獨查詢 name值進行分組 是不是也可以。但是效率會很慢。uj5u.com熱心網友回復:
不帶主鍵也沒關系,效率是一樣的。
uj5u.com熱心網友回復:
即時不帶主鍵執行效率也是很慢,我這個表本身有10多萬資料。要做個視圖。而且這么查詢完之后 還需要和其他表進行主鍵關聯 多對多查詢。直接運行不動了。uj5u.com熱心網友回復:
這個屬于資料庫設計不到位所致;詳細說一下你的需求;
uj5u.com熱心網友回復:
有一個作業表 A 其中有個欄位 name 是一個作業幾個人干(主鍵gid)。還有個作業情況表 B(主鍵qid,外鍵gid)。A和B是一對多的關系。現在需要查詢出每個人都干了哪些作業。查詢A表的每個人以及B表的gzm(作業名),gzxq(作業詳情)。uj5u.com熱心網友回復:
如果還來得及,建議把這個對應關系,單建一個表出來;uj5u.com熱心網友回復:
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (400);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
創建一下拆分函式,繞后使用;
拆分本來就是低效率的,可以把拆分資料放入一個臨時表中;然后再進行其他關聯什么的;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/102181.html
標籤:高級技術
上一篇:查找連續號中缺失的號碼
