使用 REGEXP_LIKE 立即执行中的转义问题

问题描述 投票:0回答:1

这是上一个问题的后续: 使用统计变量立即执行sql

我在上面的执行立即sql中添加了一个带有求和运算的新列。它的问题是,字符和数字都可以出现。所以我需要在 REGEXP_LIKE 中包含一个 case when 条件,但现在我遇到了转义特殊字符的问题。引用字符串文字技术也不起作用:

a)

    sql_stmt := q'[
            SELECT
      COUNT(*)                                                      AS count_rows,
      MAX(dbms_assert.enquote_name(v_column_name, false))           AS max_primary_key,
      MIN(dbms_assert.enquote_name(v_column_name, false))           AS min_primary_key,
      SUM(
          CASE
              WHEN REGEXP_LIKE(v_column_name, '^(\+|-)?[0-9]*((.)?[0-9])[0-9]*$') THEN
                  to_number(v_column_name)
              ELSE
                  0
          END
      )                                                             AS sum_primary_key
  FROM
      dbms_assert.enquote_name(v_owner, false).dbms_assert.enquote_name(v_table_name, false)
        ]';

b)

sql_stmt := 'SELECT COUNT(*) as count_rows,max('
                || dbms_assert.enquote_name(v_column_name, false)
                || ') as max_primary_key,min('
                || dbms_assert.enquote_name(v_column_name, false)
                || ') as min_primary_key, SUM( CASE WHEN REGEXP_LIKE('
                || dbms_assert.enquote_name(v_column_name, false)
                || '',^(\+|-)?[0-9]*((.)?[0-9])[0-9]*$'') THEN  to_number('
                || dbms_assert.enquote_name(v_column_name, false)
                || ')  ELSE    0        END    )    as sum_primary_key FROM '
                || DBMS_ASSERT.ENQUOTE_NAME(v_owner, FALSE)
                || '.'
                || DBMS_ASSERT.ENQUOTE_NAME(v_table_name, FALSE);
oracle plsql
1个回答
0
投票

您没有在正确的位置转义引号:

sql_stmt := 'SELECT COUNT(*) as count_rows,'
                || 'max(' || dbms_assert.enquote_name(v_column_name, false) || ') as max_primary_key, '
                || 'min(' || dbms_assert.enquote_name(v_column_name, false) || ') as min_primary_key, '
                || 'SUM( CASE WHEN REGEXP_LIKE('
                         || dbms_assert.enquote_name(v_column_name, false)
                         || ',''^[+-]?\d*\.?\d+$'') '
                         || 'THEN to_number(' || dbms_assert.enquote_name(v_column_name, false) || ') '
                         || 'ELSE 0 '
                         || 'END'
                || ') as sum_primary_key '
           || FROM ' || DBMS_ASSERT.ENQUOTE_NAME(v_owner, FALSE)
                     || '.'
                     || DBMS_ASSERT.ENQUOTE_NAME(v_table_name, FALSE);

(正则表达式中

.
匹配任何字符,
\.
仅匹配小数点,您可以简化表达式。)

© www.soinside.com 2019 - 2024. All rights reserved.