【问题标题】:PL/SQL Stored proc that uses a comma separated parameter to drive a dynamic LIKE clause?使用逗号分隔参数驱动动态 LIKE 子句的 PL/SQL 存储过程?
【发布时间】:2017-02-14 02:05:46
【问题描述】:

是否有一种相当简单的方法来获取包含逗号分隔的前缀列表的输入参数并根据使用这些前缀的 select 语句返回游标?

即(伪代码)

PROCEDURE get_by_prefix(p_list_of_prefixes IN varchar2, r_csr OUT SYS_REFCURSOR)
IS
BEGIN
OPEN r_csr FOR
SELECT * FROM my_table where some_column LIKE (the_individual_fields_from p_list_of_prefixes ||'%')
END

我尝试了各种组合,现在有两个问题 - 将输入强制转换为合适的表(我认为它需要进入表类型而不是 VARCHAR2_TABLE),其次让 like 子句有效地成为从内部“伪表”中选择...

编辑:似乎人们正在建议将“IN”与一组潜在值一起使用的方法——而我正在考虑使用 LIKE。我可以使用类似的技术 - 构建动态 SQL,但想知道是否没有更优雅的方法...

【问题讨论】:

  • 这不适用于 LIKE,除非我弄错了......
  • 您正在尝试将like 用作In,两者都用于某些目的。如果两者相同,则不需要 2 个不同的运算符。
  • 不,我不是。我试图准确地使用 LIKE 它的用途。复杂性是表示列表的动态输入。
  • 将输入字符串分解为单独的标记并使用 IN 条件是最好的解决方案;使用LIKE 可以(轻松地)以您想要的方式完成,但效率会低得多。您是否有特定原因必须使用LIKE

标签: oracle plsql


【解决方案1】:

PL/SQL 没有逗号分隔列表的概念,也没有 Perl 等中的内置拆分器,因此您必须使用以下手动方法之一:

https://stewashton.wordpress.com/2016/08/01/splitting-strings-surprise

Other methods 可用。)然后只需在一个步骤中填充集合并在下一步中使用它,或者将两者结合起来,如下所示:

declare
    p_list_of_prefixes varchar2(100) := 'John,Jim,Jules,Janice,Jenny';
begin
    open :refcur for
        with params as
             ( select x.firstname
               from   xmltable(
                          'ora:tokenize($X, "\,")'
                          passing p_list_of_prefixes as x
                          columns firstname varchar2(4000) path '.'
                      ) x
             )
           , people as
             ( select 'Dave Clark' as fullname from dual union all
               select 'Jim Potter' from dual union all
               select 'Jenny Jones' from dual
             )
        select x.firstname, p.fullname
        from   params x
               left join people p on p.fullname like x.firstname || '%';
end;

输出:

FIRSTNAME      FULLNAME
-------------- -----------
John           
Jim            Jim Potter
Jules          
Janice         
Jenny          Jenny Jones

【讨论】:

    【解决方案2】:

    以您想要的方式使用LIKE 很容易,但这是错误的解决方案。 (见我在原帖下的评论)。

    无论如何 - 如果您的上级命令或其他一些半合法的原因,您必须使用LIKE 条件,它应该看起来像这样:

    ... where ',' || p_list_of_whatever || ',' like '%,' || some_column || ',%
    

    需要在比较的两端连接逗号,因为您不希望列中的Jo 与输入列表中的John 匹配。从那里开始,您会在右侧看到为什么需要逗号,然后从那里开始,您也会在左侧看到为什么需要逗号。

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      相关资源
      最近更新 更多