是否可以在 sql 语句中定义表?
Posted
技术标签:
【中文标题】是否可以在 sql 语句中定义表?【英文标题】:Is it possible to define table inside sql statement? 【发布时间】:2014-03-26 08:00:44 【问题描述】:有没有办法在 select 语句中创建一个自定义表格?
类似这样的:
select id from (1, 2, 3, 4) tbl
假设tbl
是别名,并且自定义表有一列有 1、2、3、4 行。
如果不创建物理临时表,这可能吗?
【问题讨论】:
【参考方案1】:是的,你可以像在 Oracle 中那样做(数字表):
with tbl as (
-- generates table with id column with 1, 2, 3, 4 values
select level id
from dual
connect by level <= 4)
select id
from tbl
你可以用不同的语法来表达:
select id
from (select level id
from dual
connect by level <= 4) tbl
如果您需要任意值,比如1, 5, 14, 127
,您可以这样实现:
with tbl as (
select 1 from dual
union all
select 5 from dual
union all
select 14 from dual
union all
select 127 from dual
)
select id
from tbl
或者
select id
from (select 1 from dual
union all
select 5 from dual
union all
select 14 from dual
union all
select 127 from dual) tbl
如果你想要像from (1, 2, 3)
这样的语法,你必须声明一个类型
create or replace type NumberTable is table of number;
...
select *
from table(NumberTable(1, 2, 3, 4)) tbl
【讨论】:
数字需要手动输入,而不是由 select from dual 语句生成。这可能吗? 如果你想尽可能地保留 (1, 2, 3) 的语法,你必须创建一个类型(见我的编辑) 该表函数在 from 之后做什么以及为什么它接受自定义类型? 它将 pl/sql 集合 NumberTable 转换为行为类似于常规表的对象,您可以在查询中使用该对象 但这是两个语句,我在 select 语句中寻找所有语句【参考方案2】:create or replace type char_int is table of integer;
/
with numbers as (select column_value
from table(char_int(1,2,5,6,7)))
select numbers.column_value
, object_name
, object_id
from all_objects
join numbers on (substr(object_id,1,1) = numbers.column_value);
;
输出:
<snip>
1 V$HS_AGENT 1999
2 V$HS_SESSION 2001
<snip>
【讨论】:
以上是关于是否可以在 sql 语句中定义表?的主要内容,如果未能解决你的问题,请参考以下文章