如何在Oracle查询中查找传递数组中某些值的索引

时间:2017-07-05 10:34:34

标签: sql oracle

我想在每行的传递数组中找到列值的索引。 查找该值是否在数组中显示是不够的,因为我想将该索引与另一列的值进行比较。

我期待这样的事情。

SELECT * FROM my_table t WHERE :argumentArray.indexOf(t.col1) BETWEEN 0 AND t.col2

如果我将该数组转换为表格或类似的东西,也许这是可能的。

这是我真实例子的结构: 下面是员工树的层次结构。

          1000         
          /  \         
       1001  1002      
       /        \      
     1003       1004   
     /                 
   1005                

我有用于存储文档共享信息的表

document_id | shared_under | level
----------- | ------------ | ---------
123         | 1000         | 2

此记录表示ID为123的文档与ID为1000 且其子级仅为2级的员工共享。 (ID为1000,1001,1002,1003,1004的员工可以访问该文档而 1005不能

期望的结果:

如果员工1005搜索文档,他将其层次结构作为数组参数传递,即(1005,1003,1001,1000)

查询将如下所示:

SELECT `document_id` FROM `shared_documents` WHERE (1005, 1003, 1001, 1000).indexOf(shared_under) BETWEEN 0 AND `level`

此查询必须返回无数据,因为emp.1005在级别3的emp.1000下,但文档仅共享2级深度。

如果emp.1003搜索他传递的共享文档(1003,1001,1000)并且查询必须返回文档123 ,因为它与员工1000共享,而员工1003在他之下2水平深度。

我用正则表达式解决了这个问题,但我想知道Oracle是否支持这种解决方案。

1 个答案:

答案 0 :(得分:0)

在子查询中使用表集合表达式:

SELECT *
FROM   mytable t
WHERE  t.col1 IN ( SELECT COLUMN_VALUE
                   FROM   TABLE( :argumentArray )
                   WHERE  ROWNUM <= t."level" )

使用示例进行更新

Oracle安装程序

CREATE TABLE mytable ( lvl, col1 ) AS
  SELECT 1, 'a' FROM DUAL UNION ALL
  SELECT 2, 'a' FROM DUAL UNION ALL
  SELECT 1, 'b' FROM DUAL UNION ALL
  SELECT 3, 'b' FROM DUAL;

CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(10);
/

<强>查询

使用硬编码集合调用此方法,但您可以pass it in as a bind variable in PL/SQL or from other languages

SELECT *
FROM   mytable t
WHERE  col1 IN ( SELECT COLUMN_VALUE
                 FROM   TABLE( stringlist( 'a', 'b' ) )
                 WHERE  ROWNUM <= t.lvl );

<强>输出

LVL COL1
--- ----
  1 a
  2 a
  3 b