关于sql:查询将字符串值拆分为多行

Query to split String value into multiple rows

我有

1
2
3
4
id | dvr
1  | 1,2,3
2  | 1,3,4
3  | 1,5,6,7,8

,并希望拥有

1
2
3
4
5
6
7
8
id | dvr
1  | 1
1  | 2
1  | 3
2  | 1
2  | 3
2  | 4
... AND so ON

我应该使用最快的查询是什么?


进行如下所示的sql函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE FUNCTION [dbo].[fun_CSVToTable]
(
    @LIST VARCHAR(7000),
    @Delimeter VARCHAR(10)
)
RETURNS @RET1 TABLE (RESULT BIGINT)
AS
BEGIN
    DECLARE @RET TABLE(RESULT BIGINT)

    IF LTRIM(RTRIM(@LIST))='' RETURN  

    DECLARE @START BIGINT
    DECLARE @LASTSTART BIGINT
    SET @LASTSTART=0
    SET @START=CHARINDEX(@Delimeter,@LIST,0)

    IF @START=0
    INSERT INTO @RET VALUES(SUBSTRING(@LIST,0,LEN(@LIST)+1))

    WHILE(@START >0)
    BEGIN
        INSERT INTO @RET VALUES(SUBSTRING(@LIST,@LASTSTART,@START-@LASTSTART))
        SET @LASTSTART=@START+1
        SET @START=CHARINDEX(@Delimeter,@LIST,@START+1)
        IF(@START=0)
        INSERT INTO @RET VALUES(SUBSTRING(@LIST,@LASTSTART,LEN(@LIST)+1))
    END

    INSERT INTO @RET1 SELECT * FROM @RET
    RETURN
END


如果您正在运行postgresql并且dvr列是文本,则可以执行以下操作:

1
2
3
4
SELECT
  id,
  unnest(string_to_array(dvr,','))
FROM your_table;