【问题标题】:Oracle regex if trimmed string contains solely L or P letters如果修剪后的字符串仅包含 L 或 P 字母,则 Oracle 正则表达式
【发布时间】:2021-12-01 18:29:32
【问题描述】:

我有以下列 (lock_reason),我想获得所需的输出列。 逻辑:如果修剪除字母之外的所有内容,结果字符串仅包含 L 或 P 字符,则 'X' 否则为 NULL。

LOCK_REASON       DESIRED_OUTPUT
--------------------------------
2P, Q                       NULL
R                           NULL
3A, 2B, 7Z                  NULL
L, 9P                          X
P                              X
7A, 2L                      NULL
P, L                           X

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    另一种选择是结合使用

    • regexp_replace(删除所有不是字母的内容)和
    • translate(从剩余的内容中删除 PL)。

    剩下的很简单(case,对吗?)。

    SQL> select lock_reason,
      2    case when translate(regexp_replace(lock_reason, '[^[:alpha:]]', null), '#PL', '#') is null then 'X'
      3         else null
      4    end as result
      5  from test;
    
    LOCK_REASON  RESULT
    ------------ ----------
    2P, Q
    R
    3A, 2B, 7Z
    L, 9P        X
    P            X
    7A, 2L
    P, L         X
    
    7 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      假设您要删除所有非字母字符,然后检查剩余字符串是否只有LP 字符,那么:

      SELECT lock_reason,
             CASE
             WHEN REGEXP_LIKE( REGEXP_REPLACE( lock_reason, '[^A-Z]' ), '^[LP]+$' )
             THEN 'X'
             END AS desired_output
      FROM   table_name;
      

      如果您的字符串由逗号分隔的术语组成,带有一个可选数字,然后是一个字母字符,那么您可以使用:

      SELECT lock_reason,
             CASE
             WHEN REGEXP_LIKE( lock_reason, '^(\d*[LP], )*\d*[LP]$' )
             THEN 'X'
             END AS desired_output
      FROM   table_name;
      

      其中,对于样本数据:

      CREATE TABLE table_name ( LOCK_REASON ) AS
      SELECT '2P, Q'      FROM DUAL UNION ALL
      SELECT 'R'          FROM DUAL UNION ALL
      SELECT '3A, 2B, 7Z' FROM DUAL UNION ALL
      SELECT 'L, 9P'      FROM DUAL UNION ALL
      SELECT 'P'          FROM DUAL UNION ALL
      SELECT '7A, 2L'     FROM DUAL UNION ALL
      SELECT 'P, L'       FROM DUAL;
      

      两个输出:

      LOCK_REASON DESIRED_OUTPUT
      2P, Q
      R
      3A, 2B, 7Z
      L, 9P X
      P X
      7A, 2L
      P, L X

      db小提琴here

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 2020-08-30
        • 2014-03-30
        • 1970-01-01
        • 2011-02-25
        • 2016-02-27
        • 1970-01-01
        • 2011-06-27
        • 2016-12-19
        相关资源
        最近更新 更多