在 Oracle 中获取变量中的多个列列表
Getting many column list in a variable in Oracle
oracle如何在一个变量中传递多个字符串值?
这就是我正在尝试的,但这 returns 什么都没有。
SET DEFINE ON;
DEFINE column_name ='"column_1","column_2","column_3","column_4","column_5"';
SELECT * FROM SYS.all_tab_columns WHERE column_name in ('&column_name');
对于变量中的一个值,它工作正常,但是如何传递多个字符串值?
我在这里看到的所有示例都没有帮助我
这里有一个选项(如果一定要DEFINE
):
SQL> define column_name = 'EMPNO,DEPTNO'
SQL> select table_name, column_name from user_tab_columns where column_name in
2 (select regexp_substr('&&column_name', '[^,]+', 1, level) from dual
3 connect by level <= regexp_count('&&column_name', ',') + 1
4 );
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
EMP EMPNO
DEPT DEPTNO
EMP DEPTNO
SQL>
不过,何必呢?简单有什么问题
SQL> select table_name, column_name from user_tab_columns where column_name in ('EMPNO', 'DEPTNO');
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DEPT DEPTNO
EMP EMPNO
EMP DEPTNO
SQL>
如果您正在寻找要添加到 IN 子句中的过程列列表的动态性,那么像这样的东西可能会有用 -
想法是使用LISTAGG。
select listagg('''column'||'_'||level||'''',',') as column_list from dual connect by level<5;
COLUMN_LIST
--------------------------------------------------------------------------------
'column_1','column_2','column_3','column_4'
在您的 IN 查询中使用上面生成的列列表。
否则,如果您只关心 all_tab_columns 那么您最好指定列名,如@Littlefoot 所述。
你有:
- 替换变量中的错误引号;和
- 如果替换变量的替换文本中存在引号,则查询中替换变量周围不需要引号。
像这样:
SET DEFINE ON;
DEFINE column_name='column_1','column_2','column_3','column_4','column_5'
SELECT * FROM SYS.all_tab_columns WHERE column_name in (&column_name);
客户端应用程序(即 SQL*Plus 或 SQL Developer,它们是少数支持此语法的客户端之一)将有效地在 [=11] 上执行 find-replace =] 并将其替换为您的 DEFINE
命令中指定的字符串。
替换变量的文档是 here。
oracle如何在一个变量中传递多个字符串值? 这就是我正在尝试的,但这 returns 什么都没有。
SET DEFINE ON;
DEFINE column_name ='"column_1","column_2","column_3","column_4","column_5"';
SELECT * FROM SYS.all_tab_columns WHERE column_name in ('&column_name');
对于变量中的一个值,它工作正常,但是如何传递多个字符串值? 我在这里看到的所有示例都没有帮助我
这里有一个选项(如果一定要DEFINE
):
SQL> define column_name = 'EMPNO,DEPTNO'
SQL> select table_name, column_name from user_tab_columns where column_name in
2 (select regexp_substr('&&column_name', '[^,]+', 1, level) from dual
3 connect by level <= regexp_count('&&column_name', ',') + 1
4 );
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
EMP EMPNO
DEPT DEPTNO
EMP DEPTNO
SQL>
不过,何必呢?简单有什么问题
SQL> select table_name, column_name from user_tab_columns where column_name in ('EMPNO', 'DEPTNO');
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DEPT DEPTNO
EMP EMPNO
EMP DEPTNO
SQL>
如果您正在寻找要添加到 IN 子句中的过程列列表的动态性,那么像这样的东西可能会有用 - 想法是使用LISTAGG。
select listagg('''column'||'_'||level||'''',',') as column_list from dual connect by level<5;
COLUMN_LIST
--------------------------------------------------------------------------------
'column_1','column_2','column_3','column_4'
在您的 IN 查询中使用上面生成的列列表。
否则,如果您只关心 all_tab_columns 那么您最好指定列名,如@Littlefoot 所述。
你有:
- 替换变量中的错误引号;和
- 如果替换变量的替换文本中存在引号,则查询中替换变量周围不需要引号。
像这样:
SET DEFINE ON;
DEFINE column_name='column_1','column_2','column_3','column_4','column_5'
SELECT * FROM SYS.all_tab_columns WHERE column_name in (&column_name);
客户端应用程序(即 SQL*Plus 或 SQL Developer,它们是少数支持此语法的客户端之一)将有效地在 [=11] 上执行 find-replace =] 并将其替换为您的 DEFINE
命令中指定的字符串。
替换变量的文档是 here。