【问题标题】:How to replace string in Oracle?如何替换Oracle中的字符串?
【发布时间】:2020-03-31 11:07:15
【问题描述】:

从前端用户将输入(多个)员工编号为(123,456,789) 以在应用程序中搜索。用户输入方式 员工编号是像上面一样预定义的。

必须在 PL/SQL 包中的 Oracle 数据库表中搜索此值。

我已经像下面这样编码来格式化输入的值,以便可以在 SQL WHERE 条件中搜索它。

lv_where := REPLACE( REPLACE(  REPLACE( '(123,456,789)', ',', ''',''' ), '(', '(''') , ')', ''')')

输出是:('123','456','789')

有没有更好的办法?

【问题讨论】:

    标签: sql oracle performance plsql replace


    【解决方案1】:

    除非是动态 SQL,否则 lv_where 将不起作用。我建议您将输入的值拆分为行并在查询中使用它们。

    在以下示例中,par_emp 表示用户输入的值。基本上,您需要的内容从第 3 行开始。

    SQL> with test (par_emp) as
      2    (select '(10,20,30)' from dual)
      3  select deptno, ename
      4  from emp
      5  where deptno in (select regexp_substr(replace(replace(par_emp, '(', ''), ')', ''), '[^,]+', 1, level)
      6                   from test
      7                   connect by level <= regexp_count(par_emp, ',') + 1
      8                  )
      9  order by deptno;
    
        DEPTNO ENAME
    ---------- ----------
            10 CLARK
            10 KING
            10 MILLER
            20 JONES
            20 FORD
            20 ADAMS
            20 SMITH
            20 SCOTT
            30 WARD
            30 TURNER
            30 ALLEN
            30 JAMES
            30 BLAKE
            30 MARTIN
    
    14 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      你可以使用regexp_replace

      regexp_replace('(123,456,789)','([[:digit:]]+)','''\1''')
      
      Result:
      ('123','456','789')
      

      【讨论】:

      • 对,但是 - 这对 OP 所说的没有帮助 - 在 WHERE 子句中使用它:)
      • 但他没有说,他如何在 where 子句中使用它。也许他使用动态 sql :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2018-12-04
      • 2014-12-13
      • 2021-12-29
      相关资源
      最近更新 更多