这是上一个问题的后续: 使用统计变量立即执行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);
您没有在正确的位置转义引号:
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);
(正则表达式中
.
匹配任何字符,\.
仅匹配小数点,您可以简化表达式。)