在 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