将字符串拆分为 PL/SQL 中的单个元素

split a string into individual elements in PL/SQL

这是为了PL/SQL

我正在传递一系列字符串,以逗号分隔,在一个字符串中。 我想使用这些分隔字符串并在我的查询中创建一个 IN 子句。

我想简单地在前面添加一个左括号和单引号,在字符串和单引号的末尾加上一个右括号,trim spaces,和用引号逗号引号字符串交换逗号。当字符串在分隔字符串中嵌入 space 时,问题就出现了。

例如传入的字符串是

TNR, abc, D N, w

处理后我希望收到的是

('TNR','ABC','D N','W')

我不确定应该从哪里开始。

你描述的太复杂了。只需将字符串拆分成行,然后在 IN 子句中将它们用作子查询。

这是在 SQL*Plus 中运行的示例(因此单引号和 && 用于替换变量);查询 returns 一行(来自 dual table),因为它的 dummy 列包含字母 X,它是输入字符串的一部分:

SQL> SELECT *
  2    FROM DUAL
  3   WHERE dummy IN (    SELECT TRIM (REGEXP_SUBSTR ('&&par_string',
  4                                                   '[^,]+',
  5                                                   1,
  6                                                   LEVEL))
  7                         FROM DUAL
  8                   CONNECT BY LEVEL <= REGEXP_COUNT ('&&par_string', ',') + 1);
Enter value for par_string: TNR, abc, D N,X, w

D
-
X

SQL>

子查询本身 returns

SQL>     SELECT TRIM (REGEXP_SUBSTR ('&&par_string',
  2                                  '[^,]+',
  3                                  1,
  4                                  LEVEL))
  5        FROM DUAL
  6  CONNECT BY LEVEL <= REGEXP_COUNT ('&&par_string', ',') + 1;
Enter value for par_string: TNR, abc, D N,X, w

TRIM(REGEXP_SUBSTR
------------------
TNR
abc
D N
X
w

SQL>

如果你使用绑定变量,你会使用例如:par_string 而不是 '&&par_string';或者,如果它被传递给一个过程或函数,你只需要参数名称 - par_string.

使用REPLACE, 更改为', ',然后在前面添加('并追加'):

DECLARE
  list VARCHAR2(50) := 'TNR, abc, D N, w';
BEGIN
  list := '(''' || REPLACE(list, ', ', ''', ''') || ''')';
  DBMS_OUTPUT.PUT_LINE(list);
END;
/

如果逗号后面的白色 space 是可选的那么你可以使用 REGEXP_REPLACE 而不是 REPLACE:

DECLARE
  list VARCHAR2(50) := 'TNR,abc, D N,    w';
BEGIN
  list := '(''' || REGEXP_REPLACE(list, ',\s*', ''', ''') || ''')';
  DBMS_OUTPUT.PUT_LINE(list);
END;
/

这两个输出:

('TNR', 'abc', 'D N', 'w')

db<>fiddle here