将“WHERE”与具有多个值的变量一起使用

时间:2013-08-28 11:44:18

标签: sql oracle variables oracle10g where

我想知道如何从表中选择另一列有几个可能值的列。因此,例如,如果列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”,我希望从ColumnBTable2返回列X没有做

ColumnG

如何定义输入以使我获得此效果?

我使用:oracle 10g,PL / SQL

5 个答案:

答案 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 forwardtake 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")