【问题标题】:Query to split String value into multiple rows查询将字符串值拆分为多行
【发布时间】:2015-03-27 03:24:36
【问题描述】:

我有

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

想拥有

id | dvr
1  | 1
1  | 2
1  | 3
2  | 1
2  | 3
2  | 4
... and so on

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

【问题讨论】:

  • 你的 DBMS 是什么?无论如何,关于这个问题有很多答案。
  • 这在很大程度上取决于您使用的数据库。请使用此重要信息更新您的问题。
  • 在回答任何问题之前,我们非常重视的另一件事是向我们展示您在编写查询并自己找到解决方案时的尝试。

标签: sql split


【解决方案1】:

如下创建一个sql函数:

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

【讨论】:

    【解决方案2】:

    如果您正在运行 postgresql 并且 dvr 列是文本,您可以这样做:

    select
      id,
      unnest(string_to_array(dvr,','))
    from your_table;
    

    【讨论】:

    • 我正在使用 MS sql 服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多