代码之家  ›  专栏  ›  技术社区  ›  Léster

如何将分隔字符串转换为PL/SQL表以进行连接?

  •  0
  • Léster  · 技术社区  · 5 年前

    我有下表:

    CREATE TABLE T_DATA
    (
        id VARCHAR2(20),
        value VARCHAR2(30),
        index NUMBER,
        valid_from DATE,
        entry_state VARCHAR2(1),
        CONSTRAINT PK_T_DATA PRIMARY KEY(id, value)
    );
    

    我有以下字符串:

    id1:value1,id2:value2,id3:value3...
    

    哪里 id value T_DATA . 我希望使用该字符串并从返回结果集 T_数据 身份证件 s和 价值 SELECT * FROM T_DATA INNER JOIN [PL/SQL table] ON [fields] 将检索所需的行,但我无法找到如何将字符串转换为具有多列的PL/SQL表。我怎么做?

    2 回复  |  直到 5 年前
        1
  •  1
  •   EJ Egyed    5 年前

    我能想到的最简单的解决方案(尽管它可能不是最有效的)就是使用一个简单的 INSTR

    WITH
        t_data
        AS
            (    SELECT 'id' || ROWNUM        AS id,
                        'value' || ROWNUM     AS VALUE,
                        ROWNUM                AS index_num,
                        SYSDATE - ROWNUM      AS valid_from,
                        'A'                   AS entry_state
                   FROM DUAL
             CONNECT BY LEVEL <= 10)
    SELECT *
      FROM t_data
     WHERE INSTR ('id1:value1,id3:value3', id || ':' || VALUE) > 0;
    

    如果要拆分搜索字符串,可以尝试以下查询

    WITH
        t_data
        AS
            (    SELECT 'id' || ROWNUM        AS id,
                        'value' || ROWNUM     AS VALUE,
                        ROWNUM                AS index_num,
                        SYSDATE - ROWNUM      AS valid_from,
                        'A'                   AS entry_state
                   FROM DUAL
             CONNECT BY LEVEL <= 10),
      split_string AS (SELECT 'id1:value1,id3:value3' AS str FROM DUAL),
      split_data as (
        SELECT substr(regexp_substr(str, '[^,]+', 1, LEVEL),1,instr(regexp_substr(str, '[^,]+', 1, LEVEL), ':') - 1) as id,
               substr(regexp_substr(str, '[^,]+', 1, LEVEL),instr(regexp_substr(str, '[^,]+', 1, LEVEL), ':') + 1) as value
          FROM split_string
    CONNECT BY INSTR (str, ',', 1, LEVEL - 1) > 0)
    SELECT t.*
      FROM t_data t
      join split_data s
     on( t.id = s.id and t.value = s.value);
    
        2
  •  0
  •   Popeye    5 年前

    LIKE 详情如下:

    SELECT *
      FROM T_DATA 
     WHERE ',' || YOUR_STRING || ',' LIKE '%,' || ID || ':' || VALUE || ',%'