【问题标题】:Escape underscore in PL/SQLPL/SQL 中的转义下划线
【发布时间】:2015-12-10 10:32:19
【问题描述】:

我有一个类似这样的 oracle 触发器:

AFTER INSERT OR UPDATE ON TABLE_ABC FOR EACH ROW
BEGIN
  IF (:new.COLUMN_A LIKE '%_H') THEN
    INSERT INTO TABLE_DEF (ID, COLUMN_B) VALUES (SEQ_DEF.NEXTVAL, :new.COLUMN_B);  
  END IF;
END;

现在我想转义 like 子句中的下划线,以便此触发器仅处理 COLUMN_A 中的“ABCD_H”或“1234_H”等值,而不处理“1234H”等值。

对于给定的示例,我怎样才能做到这一点?

【问题讨论】:

    标签: oracle plsql sql-like


    【解决方案1】:

    你可以使用转义子句:

    if :new.column_a LIKE '%\_H' escape '\' then
    

    另一种选择是只提取最后两个字符:

    if substr(:new.column_a, -2) = '_H' then
    

    如果substr()的参数为负数,Oracle将从右端提取指定数量的字符。

    【讨论】:

      【解决方案2】:

      IF (:new.COLUMN_A LIKE '%_H')

      您可以使用 ESCAPE 关键字。

      例如。

      SQL> SET serveroutput ON
      SQL> DECLARE
        2    str VARCHAR2(10) := '_ ';
        3  BEGIN
        4    IF str LIKE '%\_ %' THEN
        5      dbms_output.put_line('did not escape');
        6    ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
        7      dbms_output.put_line('escaped');
        8    END IF;
        9  END;
       10  /
      escaped
      
      PL/SQL procedure successfully completed.
      

      SQL*Plus 中更简单,您可以这样做:

      SET ESCAPE '\'
      

      例如,

      SQL> SET ESCAPE '\'
      SQL> SET serveroutput ON
      SQL> DECLARE
        2    str VARCHAR2(10) := '_ ';
        3  BEGIN
        4    IF str LIKE '%\_ %' THEN
        5      dbms_output.put_line('did not escape');
        6    ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
        7      dbms_output.put_line('escaped');
        8    END IF;
        9  END;
       10  /
      did not escape
      
      PL/SQL procedure successfully completed.
      

      看,在 SQL*Plus 中它没有转到 ELSIF 部分,因为它可以在 IF 条件本身中使用 SET ESCAPE '\' 转义它

      【讨论】:

        猜你喜欢
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        相关资源
        最近更新 更多