在PL / SQL中转义下划线

时间:2015-12-10 10:32:19

标签: oracle plsql sql-like

我有一个与此类似的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'等值。

如何为给定的例子实现这一目标?

2 个答案:

答案 0 :(得分:7)

您可以使用escape子句:

>>> print[i for i in range(2,input())if all(i%j for j in range(2,i))]
70
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67]
>>> 

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

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

如果if substr(:new.column_a, -2) = '_H' then 的参数为负数,Oracle将从右端提取指定数量的字符。

答案 1 :(得分:1)

  

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 '\' <转义它/ p>