将字符串拆分为 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
这是为了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