Sql 如何将一行中的多个值拆分为单独的行?

Sql 如何将一行中的多个值拆分为单独的行?,sql,hana,Sql,Hana,我想在sap hanasql中将一行中的多个值拆分为一个单独的行。 表: 但我想要这样的输出: id name 1 kabil 1 arasan 尽量避免列中类似csv的数据,例如在ETL过程中进行规范化 您可以使用一个过程,请参见[ 如果没有过程,您可以使用以下SQL(限制:它假设您的csv字段中有最大数量的值) CREATE COLUMN TABLE "TEST_SPLIT"( "SOME_KEY" VARCHAR(10), "CSV_STR" VARCHAR

我想在sap hanasql中将一行中的多个值拆分为一个单独的行。 表:

但我想要这样的输出:

id  name
1   kabil  
1   arasan
  • 尽量避免列中类似csv的数据,例如在ETL过程中进行规范化
  • 您可以使用一个过程,请参见[
  • 如果没有过程,您可以使用以下SQL(限制:它假设您的csv字段中有最大数量的值)

    CREATE COLUMN TABLE "TEST_SPLIT"(
        "SOME_KEY" VARCHAR(10),
        "CSV_STR" VARCHAR(1000) );
    
    INSERT INTO "TEST_SPLIT" ("SOME_KEY", "CSV_STR") VALUES ('1', 'hello world');
    INSERT INTO "TEST_SPLIT" ("SOME_KEY", "CSV_STR") VALUES ('2', 'one,two,three');
    INSERT INTO "TEST_SPLIT" ("SOME_KEY", "CSV_STR") VALUES ('3', NULL);
    
    Select * from 
    ( select "SOME_KEY" "KEY", "ELEMENT_NUMBER" "ORD", 
           SUBSTR_REGEXPR('(?<=^|,)([^,]*)(?=,|$)' IN "TEST_SPLIT"."CSV_STR" OCCURRENCE "SERIES"."ELEMENT_NUMBER" GROUP 1) "VAL"
      from "TEST_SPLIT",
           SERIES_GENERATE_INTEGER(1, 1, 10 ) "SERIES" -- replace 10 with your max. number of values in CSV-Field
    )
    where "VAL" is not null
    order by "KEY", "ORD"
    
    创建列表“TEST\u SPLIT”(
    “SOME_KEY”VARCHAR(10),
    “CSV_STR”VARCHAR(1000);
    插入“TEST_SPLIT”(“SOME_KEY”,“CSV_STR”)值('1','hello world');
    在“TEST_SPLIT”(“SOME_KEY”,“CSV_STR”)值('2','1',2,3')中插入;
    插入“测试分割”(“某些密钥”、“CSV字符串”)值('3',NULL);
    从中选择*
    (选择“某个要素”“要素”“要素编号”“ORD”,
    
    SUBSTR_REGEXPR(')(?对SUBSTR_REGEXPR函数的使用进行了轻微调整。我上周刚刚在Hana中将其用作脚本视图,可以确认它是有效的

    Begin
    VAR_OUT =
        select *
        from ( select
        ST.PARAM, -- Source table id
        NT.Element_Number, -- Occurrence number within source table row
    SUBSTR_REGEXPR( '([;])([^;]*)(?=;)'
    IN   CONCAT(CONCAT(';',ST.VALUE),';')
         OCCURRENCE NT.Element_Number
        GROUP 2
        ) splitted      -- string piece
    from 
    "_SYS_BIC"."Financial_Planning_and_Analysis/ZZTPARPAR_SOURCE" as ST, -- source  table
    SERIES_GENERATE_INTEGER(1, 0, 10 ) as NT -- numbers table
        ) tbl
    where splitted is not null
    order by PARAM, Element_Number;
    End     
    

    永远不要将数据存储为逗号分隔的项目!这只会给您带来很多麻烦。谢谢您的回复…但我只是在尝试如何在一列中输入多个值,以及如何拆分多个值…这就是y我发布了这个问题…您可以通过创建表类型函数来拆分逗号分隔的值和en
    使用值交叉应用
    。类似的解决方案,我可以在
    SQL SERVER
    中提供。
    Begin
    VAR_OUT =
        select *
        from ( select
        ST.PARAM, -- Source table id
        NT.Element_Number, -- Occurrence number within source table row
    SUBSTR_REGEXPR( '([;])([^;]*)(?=;)'
    IN   CONCAT(CONCAT(';',ST.VALUE),';')
         OCCURRENCE NT.Element_Number
        GROUP 2
        ) splitted      -- string piece
    from 
    "_SYS_BIC"."Financial_Planning_and_Analysis/ZZTPARPAR_SOURCE" as ST, -- source  table
    SERIES_GENERATE_INTEGER(1, 0, 10 ) as NT -- numbers table
        ) tbl
    where splitted is not null
    order by PARAM, Element_Number;
    End