【问题标题】:Using column values from one table within a WHERE clause在 WHERE 子句中使用一个表中的列值
【发布时间】:2016-05-25 01:17:17
【问题描述】:

我有一个名为 col_mapping 的 Oracle 表,其中该表中的列具有另一个表中列的列值。

表格数据示例:col_mapping

    ID    DESCR     COL_VALS
------------------------------
    1     LABEL     COL_1
    2     NAME_ADDR COL_2:COL_3
    3     SALARY    COL4

基于上表,我现在想遍历 col_mapping 中的每条记录,并在另一个名为 other_tab 的表中使用 COL_VALS 作为我的 WHERE 条件的一部分,即:

select 'Y' 
from other_tab
where COL_1 = 'whatever1';

select 'Y' 
from other_tab
where (COL_2 = 'whatever2' or COL_3 = 'whatever2');

and finally:

select 'Y' 
from other_tab
where COL_4 = 'whatever4';

我基本上想将 COL_VALS 拆分为 where 条件,其中有多个值冒号分隔,如上示例将其转换为 OR 条件。

【问题讨论】:

  • 这对 SQL 中的一切都是如此。您应该考虑完全重新设计它。
  • 你试过Dynamic SQL吗?
  • @juergend 非常正确,但我纯粹将其用作我需要处理的映射表的一部分。
  • @Hawk 将对此进行调查,但我如何最好地将冒号分隔的值拆分出来以便在动态 SQL 中使用?

标签: sql plsql oracle11g


【解决方案1】:

这未经测试。但这就是我相信它可以实现的方式。你需要两个循环。一个循环遍历表col_mapping,另一个循环遍历每一行的列COL_VALS 并构造where 条件。

类似这样的:

DECLARE 

a_where_vars APEX_APPLICATION_GLOBAL.VC_ARR2;  --you can replace it with your own associative array here
l_where_string VARCHAR2(4000);

BEGIN

  For i IN (SELECT id, descr, col_vals FROM col_mapping)
  LOOP
  a_where_vars := APEX_UTIL.STRING_TO_TABLE(i.col_vals, ':')  --split values into array

    FOR j IN 1 .. a_where_vars.COUNT LOOP
    l_where_string := l_where_string||a_where_vars(j)||' = '||whatever_variable||' OR ';
    END LOOP;

  --you can remove last OR and clean up l_where_string 
  --then you query:
  EXECUTE IMMEDIATE := '
  select ''Y''
  from other_tab
  where '||l_where_string 
  END LOOP INTO some_binding_variables;
  --other queries.
END;
/

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多