1

我想知道如何从另一列具有多个可能值的表中选择列。因此,例如,如果列 G 具有输入给定的值,则此代码将返回表 1 中的 X 列和表 2 中的 B 列。

variable input varchar2(60);
exec :input := 'c';

Select Table1.x, Table2.b
  FROM Table1, 
       Table2
 WHERE Table1.g = :input

如果相反,我想从如果有值“k”或“c”或“d”返回table1XColumnBTable2而不ColumnG

WHERE Table1.g = "k" or Table1.g = "c" or Table1.g = "d"

我如何定义输入以获得这种效果?

我使用:oracle 10g,PL/SQL

4

5 回答 5

1

正如我从您对@SuperMan 回答的评论中了解到的那样

是的,有没有办法将变量定义为('c','d','k')的占位符?

你想参数化IN子句。

显然,您不能在这样定义的子句中传递:input变量。我的意思是,从技术上讲你可以,但是查询不会产生所需的输出,因为它会搜索整个字符串。INexec :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
于 2013-08-28T13:16:03.180 回答
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;
于 2013-08-28T12:38:03.633 回答
0

寻找这个?

Select Table1.x, Table2.b
FROM Table1, Table2
WHERE Table1.g  in ('c', 'd', 'k')

编辑-回复评论:这不是直截了当的,或者看看这里

于 2013-08-28T11:50:11.917 回答
0

它非常直截了当-

Select Table1.X, Table2.B FROM TABLE1, TABLE2 WHERE TABLE1.g IN ('c', 'd', 'k')

基本上,它将为您提供表 1 中所有行的笛卡尔积,其中 Table1.g = c 或 d 或 k 以及 Table2 中的所有行,因为您没有任何其他连接条件。

于 2013-08-28T20:18:53.310 回答
-1

你能试试这个吗?

where table1.g in ("k","c","d")
于 2013-08-28T11:52:40.530 回答