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

How to convert delimited string to a PL/SQL table for JOINing?

我有以下 table:

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...

其中 idvalue 实际上是 T_DATA 上的对应值。我希望使用该字符串和 return 来自 T_DATA 的结果集,使用作为过滤器提供的 ids 和 values(基本上,select) .我被告知我可以将字符串转换为具有两列的 PL/SQL table 并且这样,一个简单的 SELECT * FROM T_DATA INNER JOIN [PL/SQL table] ON [fields] 将检索所需的行,但我不知道如何将字符串转换为具有多列的 PL/SQL table。我该怎么做?

我能想到的最简单的解决方案(虽然它可能不是最有效的)就是使用一个简单的 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);

您可以使用 LIKE 的查询,如下所示:

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