选择列表作为oracle sql中的列

mw3dktmi  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(328)

我想在已经存在的表中添加几行(准确地说是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

请注意,我想保留列表中每个元素的前导零。这篇文章几乎就是我要找的,但它将每个元素转换为整数,并删除前导零。

o2g1uqev

o2g1uqev1#

可以使用系统提供的集合类型;您可以使用 TABLE 操作符(甚至从oracle12开始就不再需要它了,正如我在下面演示的那样)。请注意,列名是 COLUMN_NAME -这是oracle在创建系统提供的类型时选择的名称。
让我们创建一个用于测试的小表:

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

在谷歌上搜索 SYS.ODCIVARCHAR2LIST (及类似) SYS.ODCINUMBERLIST )如果你不熟悉它;它很有用。

jaxagkaj

jaxagkaj2#

您需要使用以下层次结构查询:

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 ;
k5hmc34c

k5hmc34c3#

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

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;

相关问题