将代码列表存储到 Oracle SQL 中的变量中

Posted

技术标签:

【中文标题】将代码列表存储到 Oracle SQL 中的变量中【英文标题】:Storing a list of codes into a variable in Oracle SQL 【发布时间】:2021-02-03 17:17:03 【问题描述】:

有没有办法将一组代码存储到Oracle SQL中的变量中?

我有这些代码,我需要在查询的不同部分使用它们。

但我不会在我的 SQL 代码中的很多地方重复这个列表。

'G31', 'G310', 'G311', 'G312', 'G318', 'G319', 'G239', 'G122', 'G710',
     'B20', 'B22', 'B23', 'B24', 'G35', 'C811', 'G37', 'G375', 'K702', 'K741'

我想做类似这样的想法:

LIST <- ['G31', 'G310', 'G311', 'G312', 'G318', 'G319', 'G239', 'G122', 'G710',
         'B20', 'B22', 'B23', 'B24', 'G35', 'C811', 'G37', 'G375', 'K702', 'K741']

SELECT * FROM TABLE_A where COLUMN IN [LIST];

SELECT * FROM TABLE_B where COLUMN IN [LIST];

【问题讨论】:

您可以将它们放在一个表中,然后加入或子查询它。 我希望数据库中有一个查找表来定义所有可能的代码。如果您有查询要查找一堆不同的代码,这强烈暗示应该将某些属性定义为查询可以引用的查找表的列。因此,如果这些都是冰淇淋口味的代码,并且您已经获得了用于过敏查询的所有涉及花生的代码列表,那么将 has_peanuts 标志添加到 ice_cream 表中是有意义的,其中存储所有可能的代码。 什么是“SQL 代码”? SQL 是一种查询语言,它并没有像您的示例中那样真正具有变量。 PL/SQL 确实如此,因为它是一种编程语言,但这是一个完全不同的问题。 【参考方案1】:

这是一种奇特的方法

WITH CODE_VALUES AS 
  ( SELECT DISTINCT COLUMN_VALUE AS CODE_VALUE
      FROM TABLE (sys.dbms_debug_vc2coll ('G31',
                                      'G310',
                                      'G311',
                                      'G312',
                                      'G318',
                                      'G319',
                                      'G239',
                                      'G122',
                                      'G710',
                                      'B20',
                                      'B22',
                                      'B23',
                                      'B24',
                                      'G35',
                                      'C811',
                                      'G37',
                                      'G375',
                                      'K702',
                                      'K741'))
  )
  SELECT *
    FROM CODE_VALUES -- + the rest of your query

你也可以用连续的联合反对“双重”来做同样的事情

WITH CODE_VALUES AS 
    ( SELECT 'ABC' AS code_value FROM dual UNION 
      SELECT 'CDE' AS code_value FROM dual
    )

如果要在多个操作查询中使用它,最好将它们存储在一个表中。

【讨论】:

【参考方案2】:

创建一次global temporary table 并在gtt 中添加所需的值,然后使用join 在查询中使用它。

gtt 的好处是您不必担心数据维护。 (删除 - 插入)。在一个会话/事务中添加的数据将仅在该会话/事务中可见(基于您创建的 gtt 类型。

Create global temporary table gtt
(Col1 varchar2(10))
On commit preserve row; -- session specific

Insert into gtt
Select 'G31' from dual union all
Select 'G310' from dual union all
...
...
Select 'K741' from dual;

现在,您可以在同一会话中的任何位置使用它,如下所示:

SELECT * 
FROM TABLE_A a
Join gtt g on a.COLUMN = g.col1;

SELECT * 
FROM TABLE_B b
Join gtt g on b.COLUMN = g.col1;

【讨论】:

以上是关于将代码列表存储到 Oracle SQL 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个列中的值存储到 oracle 中的单个变量中?

变量作为 Oracle PL/SQL 中 where 子句中的列名

Sql server 存储过程中怎么将变量赋值?

PL_sql如何执行oracle存储过程

将 for 循环中的多个打印输出值存储到列表或变量中

从XML到Oracle PL / SQL环境中的路径列表