在Oracle SQL中将代码列表存储到一个变量中



有一种方法可以将一组代码存储到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];

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
)

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

创建一个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;

最新更新