是否可以在 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 语句中定义表?的主要内容,如果未能解决你的问题,请参考以下文章

请问SQL语句必须用大写,是否规范

求sql语句,怎样查询一个表中都是汉字的记录

是否可以在.net 的同一事务中并行运行多个 SQL 语句?

是否可以在 SQL 中反转 select 语句?

判断表中是否存在记录的SQL语句

在Oracle中定义SQL查询。索引为啥不能直接从select语句中引用?求教,谢谢