我想知道如何从表中选择另一列有几个可能值的列。因此,例如,如果列G具有输入给定的值,则此代码将返回表1中的列X和表2中的列B.
variable input varchar2(60);
exec :input := 'c';
Select Table1.x, Table2.b
FROM Table1,
Table2
WHERE Table1.g = :input
如果相反,如果table1
的值为“k”或“c”或“d”,我希望从ColumnB
和Table2
返回列X没有做
ColumnG
如何定义输入以使我获得此效果?
我使用:oracle 10g,PL / SQL
答案 0 :(得分:1)
正如我从你对@SuperMan回答
的评论中所理解的那样是的,有没有办法将变量定义为占位符 ('c','d','k')?
您想参数化IN
子句。
显然,您无法传递:input
子句中定义的IN
子句exec :input := 'k,c,d'
。我的意思是,技术上你可以,但查询不会产生所需的输出,因为它将搜索整个'k,c,d'
字符串。
您可以做的是,您可以用逗号分割'k,c,d'
(或任何其他)字符串,并使用IN
子句中的结果。
以下是一个例子:
-- variable of this type will contain letters produced by
-- splitting 'k,c,d' string
create or replace type T_vars as table of varchar2(5)
-- This table function returns collection of individual letters
create or replace function GetLetters(p_input in varchar2)
return t_vars
is
l_res T_Vars;
begin
select cast(
collect(
cast(res as varchar2(5))
) as T_Vars
)
into l_res
from ( select regexp_substr(p_input, '[^,]+', 1, level) as res
from dual
connect by level <= regexp_count(p_input, '[^,]+' )
);
return l_res;
end;
以下是它的工作原理:
SQL> variable x varchar2(11);
SQL> exec :x := 'k,c,d';
PL/SQL procedure successfully completed
SQL> select col
2 from table1
3 where col in (select column_value from table(getletters(:x)))
4 ;
结果:
COL
---
k
c
d
答案 1 :(得分:0)
寻找这个?
Select Table1.x, Table2.b
FROM Table1, Table2
WHERE Table1.g in ('c', 'd', 'k')
修改 - 回复评论:It is not straight forward或take a look here。
答案 2 :(得分:0)
由于您使用的是pl / sql,因此可以使用FOR循环为每个值运行查询。 像这样:
FOR x in ('k','c','d')
loop
Select Table1.x, Table2.b into var1,var2
FROM Table1, Table2
WHERE Table1.g = x
dbms_output.put_line(var1,var2);
end loop;
答案 3 :(得分:0)
非常直接 -
Select Table1.X, Table2.B FROM TABLE1, TABLE2 WHERE TABLE1.g IN ('c', 'd', 'k')
基本上它会给你一个表1中所有行的笛卡尔乘积,其中Table1.g = c或d或k以及表2中的所有行,因为你没有任何其他连接条件。
答案 4 :(得分:-1)
你能试试吗?
where table1.g in ("k","c","d")