【问题标题】:Can the expressionList of the SELECT ...WHERE IN (expressionList) statement be a variable?SELECT ...WHERE IN (expressionList) 语句的 expressionList 可以是变量吗?
【发布时间】:2019-10-22 23:00:32
【问题描述】:

以下代码创建了一个过滤器,我成功地将它附加到现有的 sql 语句中。

DECLARE V_FILTER VARCHAR2(255);
begin
SELECT DISTINCT 'reserve reporting_unit_code' ||' IN (' || 
                listagg ( chr(39) ||  uic || chr(39) , ',') within group (order by uic) || ')'  
into v_FILTER               
from ( select distinct uicf.uic           
        FROM OWSADHOC.ADHOC_UIC_FILTER UICF
                 INNER JOIN OWSADHOC.ADHOC_USER_ROLE  UROLE
                    ON UICF.ROLE_NAME = UROLE.ROLE_NAME
                 inner join OWSADHOC.ADHOC_USER_DATA uname
                    on uname.USER_ID = UROLE.USER_ID
        WHERE UROLE.ROLE_NAME in (:P_LoggedInUserRoles)  
         and  uname.JASPER_ACCOUNT = :P_LoggedInUserName
         )
      ;   
      DBMS_OUTPUT.PUT_LINE ('GENERATED FILTER: ' || V_FILTER); 
      end;

v_FILTERreserve reporting_unit_code IN ('86749')

P_LoggedInUserRoles 只有一个值时,这可以正常工作。但是,如果我在变量中有一个逗号分隔的列表,它就不起作用。我尝试将 expressionList 定义为一个数组。 PL/SQL 不使用该方法进行编译。

如果一个有多个值,expressionList 是否仅限于使用文字值?我在任何手册中都找不到该显式语句,但我无法将 expressionList 定义为作为值集合的变量。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    不,你不能,但你已经很接近了

    逗号分隔的列表将使条件如下所示:

    WHERE UROLE.ROLE_NAME in ('Jane, Andrew, Jill')

    并返回一个空的结果集。虽然你正在寻找的是

    WHERE UROLE.ROLE_NAME in ('Jane', 'Andrew', 'Jill')

    很明显,绑定变量的数量在一次调用到另一次调用时必须不同,因为列表的长度不同。对不起,这不是我们可以轻易做到的。你需要一个叫做Dynamic SQL method 4的东西,这似乎有点矫枉过正。


    不过还有一种更简单的方法。我们要将逗号分隔值的输入字符串解析为结果集。我们将在子查询中执行此操作,并且我们可以IN 中使用子查询。

    我们是这样做的

    WHERE UROLE.ROLE_NAME in (
      SELECT NAME
      FROM (
        SELECT regexp_substr(:P_LoggedInUserRoles, '(.*?)(,|$)', 1, LEVEL, null, 1) NAME, LEVEL LVL
        FROM   DUAL
        CONNECT BY LEVEL <= regexp_count(:P_LoggedInUserRoles, ',') + 1)
      ORDER BY LVL)
    

    我无耻地从这个问题中窃取了正则表达式:Oracle- Split string comma delimited (string contains spaces and consecutive commas),所以你可能想继续并在那里为答案投票。

    当然,缺点是即使我们收到一个名字,我们也会一直使用CONNECT BY 技巧,但这是另一个话题。

    【讨论】:

    • 哇!谢谢。我已经转了两天了。
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2010-12-07
    • 2016-12-29
    • 2021-12-23
    • 2014-07-29
    • 2018-07-31
    • 2012-04-28
    • 2018-03-08
    相关资源
    最近更新 更多