0

所以我有这张桌子

Col1    Col2    Col3
A       34       X
B       43       L
A       36       L

现在如果我查询

select * from Table1 where col1 in ('A','B','C')

我期待类似的东西

Col1    Col2    Col3
A       34       X
B       43       L
A       36       L
C       -        -

可能吗 ?

PS:-C行中的只是为了表明该列是空的。

4

3 回答 3

1

您可以创建嵌套表模式对象类型:

create type T_List1 as table of varchar2(100);

然后按如下方式构建您的查询:

 select s.column_value            as col1
      , nvl(to_char(t.col2), '-') as col2
      , nvl(col3, '-')            as col3
  from Table1 t
 right join table(T_List1('A', 'B', 'C')) s
    on (t.col1 = s.column_value)

例子:

-- sample of data from your question
with Table1(Col1, Col2, Col3) as(
  select 'A',  34,  'X' from dual union all
  select 'B',  43,  'L' from dual union all
  select 'A',  36,  'L' from dual
)  -- actual query
 select s.column_value            as col1
      , nvl(to_char(t.col2), '-') as col2
      , nvl(col3, '-')            as col3
   from Table1 t
  right join table(T_List1('A', 'B', 'C')) s --< here list your values
     on (t.col1 = s.column_value)            -- as you would using `IN` clause

结果:

COL1  COL2   COL3
------------------------
A     36     L    
A     34     X    
B     43     L    
C     -      -   

SQLFiddle 演示

于 2013-09-23T19:28:56.333 回答
0

为此,您可以使用包含您想要返回的所有值的驱动程序表,即:

col1
A
B
C
D
E

然后LEFT JOIN到你的桌子上。

SELECT * 
FROM driver d
LEFT JOIN Table1 t
 ON d.col1 = t.col1
WHERE d.col1 in ('A','B','C')
于 2013-09-23T19:24:56.840 回答
0

如果您不想像 Nicholas Krasnov 的回答那样创建一个额外的嵌套表类型,或者不想创建一个带有 A、B、C 行的单独临时表,那么只需创建一个带有with子句的驱动表:

with driving_table(col) AS
(
  select 'A' from dual
  union 
  select 'B' from dual
  union
  select 'C' from dual

)
select dt.col            as col1
     , nvl(to_char(t.col2), '-') as col2
     , nvl(col3, '-')            as col3
  from Table1 t
 right join driving_table dt
  on (t.col1 = dt.col)

http://sqlfiddle.com/#!4/112ef/2

于 2013-09-23T20:26:37.793 回答