我想在每行的传递数组中找到列值的索引。 查找该值是否在数组中显示是不够的,因为我想将该索引与另一列的值进行比较。
我期待这样的事情。
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是否支持这种解决方案。
答案 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