我在Table1中有一条记录,我希望将这一条记录分成两行并插入另一个表Table2。
表1
ID Date User value
1 29/05/18 XXX X_ID||X_value||22||xx
2 29/05/18 YYY Y_ID||Y_value||33|yy
我想将table1值作为
插入到table2中表2
P_ID ID Date User Field Value
1 1 29/05/18 XXX X_ID 22
2 1 29/05/18 XXX X_Value XX
3 2 29/05/18 YYY Y_ID 33
4 3 29/05/18 YYY Y_Value YY
table1中的值是table2中的字段,没有任何东西可以硬编码,因为我在表table1中有很多记录。 编辑:如果table1中的值有更多的值,如X_ID || X_VALUE || Y_ID || Y_Value || 22 || xx || 33 || yy,该怎么办?如何使此查询动态化,以便与输出无关,它将table2的不同行中的记录分开
答案 0 :(得分:1)
您可以使用regexp_substr()
:
select id, date, user, regexp_substr(val, '[^|]+', 1, 1) as field, regexp_substr(val, '[^|]+', 1, 3) as value
from table1
union all
select id, date, user, regexp_substr(val, '[^|]+', 1, 2) as field, regexp_substr(val, '[^|]+', 1, 4) as value
from table1;
您可以使用insert
将其放入另一个表格中。这假定自动分配p_id
。如果您想自己分配,可以使用row_number()
:
select row_number() over (partition by id order by which) as p_id,
id, date, user, field, value
from ((select id, date, user, regexp_substr(val, '[^|]+', 1, 1) as field, regexp_substr(val, '[^|]+', 1, 3) as value, 1 as which
from table1
) union all
(select id, date, user, regexp_substr(val, '[^|]+', 1, 2) as field, regexp_substr(val, '[^|]+', 1, 4) as value, 2 as which
from table1
)
) t
答案 1 :(得分:0)
我试图通过使用游标来解决问题。
DECLARE @ID INT
DECLARE @NAME VARCHAR(50)
DECLARE @DATE DATE
DECLARE @VALUE VARCHAR(500)
DECLARE @List TABLE(item NVARCHAR(MAX))
宣告@SELECTCURSOR CURSOR
SET @SELECTCURSOR = CURSOR FOR SELECT * FROM tempTable1
OPEN @SELECTCURSOR
FETCH NEXT FROM @SELECTCURSOR INTO @ ID,@ DATE,@ NAME,@ VALUE
WHILE @@ FETCH_STATUS = 0
BEGIN
SET @VALUE =替换(@VALUE,' ||','。');
INSERT INTO tempTable2(ID,[User],[Date],Field,Value)VALUES(@ ID,@ NAME,@ DATE,ParseName(@ VALUE,4),PARSENAME(@ VALUE,2))
INSERT INTO tempTable2(ID,[User],[Date],Field,Value)VALUES(@ ID,@ NAME,@ DATE,ParseName(@ VALUE,3),PARSENAME(@ VALUE,1))
FETCH NEXT FROM @SELECTCURSOR INTO @ ID,@ DATE,@ NAME,@ VALUE
END
关闭@SELECTCURSOR
DEALLOCATE @SELECTCURSOR