将代码列表存储到 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 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章