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

Posted

技术标签:

【中文标题】如何在 Oracle 查询中查找传递数组中某个值的索引【英文标题】:How to Find index of some value in passed array in Oracle query 【发布时间】:2017-07-05 10:34:34 【问题描述】:

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

我期待这样的事情。

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是否支持这种解决方案。

【问题讨论】:

请发布您的表结构、一些示例数据、您的确切要求和所需的输出。 请提供minimal reproducible example,包括表的 DDL 语句、示例数据的 DML 语句和预期输出(包括对如何达到解决方案的逻辑的描述)。您似乎在寻求解决方案并希望使用数组来解决问题,但数组在 SQL 中并不典型,可能不是您问题的答案... 【参考方案1】:

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

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

【讨论】:

我收到错误:ORA-01008:当我执行 SELECT * FROM TABLE(:myArray) WHERE ROWNUM 时,并非所有变量都绑定 非常感谢,您的答案很接近,但我想在选择查询中解决它,我不想创建额外的类型、函数或任何东西。

以上是关于如何在 Oracle 查询中查找传递数组中某个值的索引的主要内容,如果未能解决你的问题,请参考以下文章

oracle中已经知道一个具体值,如何根据该值查询出含有该值的表名和列名?

查找数组中某个值的索引

python 数组根据内容查找某个值的位置

oracle 如何查找特定字母开头的某个字段?

Django 1.9 在列表中查找属性等于某个值的对象

如何在查询字符串中传递数组?