所以我有这张桌子
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 - -
有可能吗?
P.S:C行中的-
只是为了表明该列为空。
答案 0 :(得分: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 - -
答案 1 :(得分: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')
答案 2 :(得分:0)
如果您不想像在Nicholas Krasnov的回答中那样创建额外的嵌套表类型,或者不想创建一个包含A,B,C行的单独临时表,那么只需创建一个{{1}的驱动表}子句:
with