有没有一种不难看的方法在 Oracle 11g 查询中使用多列、多行表文字?

问题描述 投票:0回答:3

我正在尝试使用“文字”多列表与 Oracle 11g 进行联接查询。

这是我根据这个答案想出的最好的答案( 这个答案建议了一种更好的语法,但据我所知,它仅适用于单列表):

SELECT * from
(
 -- The ugly... it burns...
 select 'APPLE' as n, 'FRUIT' as m from dual
 union all select 'CARROT' as n, 'VEGGIE' as m from dual
 union all select 'PEACH' as n, 'FRUIT' as m from dual
 union all select 'CUCUMBER' as n, 'VEGGIE' as m from dual
 union all select 'ORANGE' as n, 'FRUIT' as m from dual
)

在Oracle中创建多行多列文字表有没有不太难看的方法?不幸的是,我无法创建临时表。

<rant>
正如我所期望的,PostgreSQL 对于文字表有一个漂亮、健全的语法,但 Oracle 却一团糟。
</rant>

编辑:我已经尝试了行值构造函数语法,如@Mark Chesney建议的,但这也不起作用:

select n,m from dual where (n,m) in (...)
给了我一个无效标识符错误。

sql oracle oracle11g literals
3个回答
8
投票

对于两列,您可以使用 ODCIObjectList:

select objectschema m, objectname n
  from table(sys.ODCIObjectList(
    sys.odciobject('APPLE', 'FRUIT'), 
    sys.odciobject('CARROT', 'VEGGIE'),
    sys.odciobject('PEACH', 'FRUIT'),
    sys.odciobject('CUCUMBER', 'VEGGIE'),
    sys.odciobject('ORANGE', 'FRUIT')));

M          N         
---------- ----------
APPLE      FRUIT     
CARROT     VEGGIE    
PEACH      FRUIT     
CUCUMBER   VEGGIE    
ORANGE     FRUIT 

对于更多列,您可以定义自己的类型:

create type t as object (a varchar2(10), b varchar2(10), c number);
create type tt as table of t;

select * from table( tt (
    t('APPLE', 'FRUIT', 1),
    t('APPLE', 'FRUIT', 1122), 
    t('CARROT', 'VEGGIE', 3),
    t('PEACH', 'FRUIT', 104),
    t('CUCUMBER', 'VEGGIE', 5),
    t('ORANGE', 'FRUIT', 6) ) )

A          B                   C
---------- ---------- ----------
APPLE      FRUIT               1 
APPLE      FRUIT            1122 
CARROT     VEGGIE              3 
PEACH      FRUIT             104 
CUCUMBER   VEGGIE              5 
ORANGE     FRUIT               6

6
投票

对于许多专栏,您可以像这样加入

SELECT a.v field1, b.v field2
  FROM (SELECT column_value v, rownum r
          FROM TABLE(sys.odcivarchar2list('abc', 'def', 'ghi'))) a
  JOIN (SELECT column_value v, rownum r
          FROM TABLE(sys.odcivarchar2list('abc', 'def', 'ghi'))) b ON a.r = b.r

0
投票

从 Oracle 23 开始,您可以使用

VALUES
语法:

SELECT *
FROM   ( VALUES ('APPLE', 'FRUIT'),
                ('CARROT', 'VEGGIE'),
                ('PEACH', 'FRUIT'),
                ('CUCUMBER', 'VEGGIE'),
                ('ORANGE', 'FRUIT')
       ) t (m, n);

输出:

M N
苹果 水果
胡萝卜 蔬菜
桃子 水果
黄瓜 蔬菜
橙色 水果

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.