Select 在 Oracle 中列为列 SQL

Select list as column in Oracle SQL

我想将几行附加到已经存在的 table(准确地说是 15 行)。最快的方法是什么?

这有效,但似乎多余。

select person_id from people_table
union all
select '0010' as person_id from dual
union all
select '0019' as person_id from dual
union all
select '0085' as person_id from dual

我想知道是否有解决方案:

select person_id from people_table
union all
select ('0010','0019','0085') as person_id from dual

请注意,我想保留列表中每个元素的前导零。 This post is almost what I'm looking for,但它将每个元素转换为整数并删除前导零。

您需要使用层级查询如下:

select person_id from people_table
union all
select regexp_substr('0010,0019,0085','[^,]+',1,level) 
  from dual
connect by  level <= length (regexp_replace('0010,0019,0085', '[^,]+'))  + 1 ;

请使用正则表达式使用下面的查询,

select person_id from people_table
union all
select distinct  trim(regexp_substr(('0010,0019,0085'),'[^,]+', 1, level) ) as person_id
 from dual
 connect by regexp_substr(('0010,0019,0085'), '[^,]+', 1, level)
 order by level;

您可以使用系统提供的集合类型;您使用 TABLE 运算符从它 select (即使自 Oracle 12 以来不再需要,正如我在下面演示的那样)。请注意,列名称是 COLUMN_NAME - 这是 Oracle 在创建系统提供的类型时选择的名称。

让我们创建一个小的 table 用于测试:

create table people_table (person_id varchar2(10), person_name varchar2(10));

insert into people_table (person_id, person_name) values ('2003', 'Maria');
insert into people_table (person_id, person_name) values ('2005', 'Peter');

然后,您可以按以下方式做您想做的事情:

select person_id from people_table
union all
select column_value from sys.odcivarchar2list('1000', '1001', '1002')
;

PERSON_ID
---------
2005
2003
1000
1001
1002

如果您不熟悉 Google 搜索 SYS.ODCIVARCHAR2LIST(以及类似的 SYS.ODCINUMBERLIST);很有用。