Oracle 是否支持 VALUES 表达式构造?

Eva*_*oll 3 oracle

PostgreSQL 支持 SQL 规范的VALUES表达式,规范称为<table value constructor>

SELECT *
FROM (VALUES
  (1, 'one'),
  (2, 'two'),
  (3, 'three')
) AS t(num,letter);
 num | letter
-----+--------
   1 | one
   2 | two
   3 | three
(3 rows)
Run Code Online (Sandbox Code Playgroud)

dbfiddle尝试,我无法让它在 Oracle 中工作。我不断得到

ORA-00903: 无效的表名

Oracle 是否支持VALUES ( expression [, ...] )? 如果不是,从查询中提供的行文字创建虚拟表的替代方法是什么?

Jac*_*las 8

Oracle 是否支持 VALUES(表达式 [, ...] )?如果不是,从查询中提供的行文字创建表的替代方法是什么?

我们得到的最简洁的选项是insert all

insert all 
  into t values(1,'one')
  into t values(2,'two')
  into t values(3,'three')
select * from dual
Run Code Online (Sandbox Code Playgroud)
select * from t;
Run Code Online (Sandbox Code Playgroud)
NUM | 单词
--: | :----
  1 | 一  
  2 | 二  
  3 | 三

dbfiddle在这里


请注意,语法是标准的扩展,允许使用单个语句和条件插入插入多个表,如示例所示:

insert all
when 1 = 1 then
  into t values (num, word)
when num > 0 then
  into t values (-num, 'minus ' || word)
select 0 as num, 'zero' as word from dual union all 
select 1, 'one'   from dual union all
select 2, 'two'   from dual union all 
select 3, 'three' from dual ;
Run Code Online (Sandbox Code Playgroud)
7 行受影响
select * from t;
Run Code Online (Sandbox Code Playgroud)
NUM | 单词       
--: | :----------
  0 | 零       
  1 | 一        
  2 | 二        
  3 | 三      
 -1 | 减一  
 -2 | 减二  
 -3 | 减三

dbfiddle在这里


Eva*_*oll 6

这是功能请求 13697:添加对 VALUES() 构造函数的支持,因此目前不支持。在这张票中,您可以看到解决方法,

目前可以使用以下方法在 Oracle 中模拟(非常乏味)上述查询:

SELECT 1 FROM dual
UNION ALL
SELECT 2 FROM dual
Run Code Online (Sandbox Code Playgroud)

所以在 Oracle 中,你会使用

SELECT 1 AS num, 'one' AS letter FROM dual
UNION ALL SELECT 2, 'two'   FROM dual
UNION ALL SELECT 3, 'three' FROM dual;
Run Code Online (Sandbox Code Playgroud)