Oracle 如何使用指定到列中的字段作为 WHERE 条件

Oracle how to use a field specified into a column for a WHERE condition

我已将此 table 放入 Oracle 数据库中

+----+---+---+---+---+-------------+
| ID | A | B | C | D | CheckColumn |
+----+---+---+---+---+-------------+
|  1 | X |   |   |   | A           |
|  2 |   | X |   |   | A           |
|  3 |   |   | X |   | A           |
|  4 |   |   | X |   | C           |
|  5 |   | X |   |   | B           |
|  6 |   |   |   | X | B           |
+----+---+---+---+---+-------------+

其中 CheckColumn 列指定了我必须用来创建 WHERE 的字段。 换句话说,我想进行这样的查询

SELECT *
FROM Table
WHERE *Column of CheckColumn for that row*='X'

结果集应该如下

+----+---+---+---+---+-------------+
| ID | A | B | C | D | CheckColumn |
+----+---+---+---+---+-------------+
|  1 | X |   |   |   | A           |
|  4 |   |   | X |   | C           |
|  5 |   | X |   |   | B           |
+----+---+---+---+---+-------------+

如何将 CheckColumn 的值用于 SELECT?

一个方法是很多布尔逻辑:

where (checkcolumn = 'A' and a = 'X') or
      (checkcolumn = 'B' and b = 'X') or
      (checkcolumn = 'C' and c = 'X') or
      (checkcolumn = 'D' and d = 'X') 

在我看来,它是关于动态的 SQL。阅读:PL/SQL.

例如:

SQL> select * from test;

        ID A B C D C
---------- - - - - -
         1 X       A
         2   X     A
         3     X   A
         4     X   C
         5   X     B
         6       X B

6 rows selected.

函数:

SQL> create or replace function f_test
  2    return sys_refcursor
  3  is
  4    l_str varchar2(4000);
  5    rc    sys_refcursor;
  6  begin
  7    for cur_r in (select distinct checkcolumn from test) loop
  8      l_str := l_str || 'select * from test where checkcolumn = ' || chr(39) ||
  9               cur_r.checkcolumn || chr(39) ||' and ' || cur_r.checkcolumn || ' = ''X'' union all ';
 10    end loop;
 11
 12    l_str := rtrim(l_str, ' union all ');
 13    open rc for l_str;
 14    return rc;
 15  end;
 16  /

Function created.

测试:

SQL> select f_test from dual;

F_TEST
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

        ID A B C D C
---------- - - - - -
         1 X       A
         4     X   C
         5   X     B


SQL>

您可以使用 DECODECheckColumn 映射到 右侧

select * from tab
where 
decode(checkColumn,'A',A,'B',B,'C',C,'D',D) = 'X';