我遇到的情况是我在字符串中构建一个sql并在sql字符串中的某个地方生成WHERE
子句AND
:
ls_sql := ls_sql ||
'and a.name IN( SELECT regexp_substr(''' || ls_activity_config || ''', ''' || lc_form || ''',' || 1 || ',' ||' level) FROM DUAL ';
不要介意regexp_substr
方法。我的问题是ls_activity_config
是一个字符串('a','b','c')
和a.name
列的数组,其值可以是'a'
或'a-#1
'或'a-#2'
等等。我想要做的就是将这些最后的值与' - #no'匹配。在末尾。
我尝试过的事情:
SUBSTR(a.name,1,INSTR(a.name,'-#',1) - 1);
当a.name列中包含'-#no'
的值但在值不包含该值时不起作用时,此方法有效。这是正常的,因为INSTR
函数将返回0。
关于如何使这两个值工作的任何想法(使用'-#no'
或不使用它)?
我能找到一个更简单的解决方案
NVL(SUBSTR(a.name, 1, instr(a.name,' || '''-#''' || ',' || '1)-1), a.name)
谢谢
答案 0 :(得分:1)
以下是示例查询:
select case when a.name like '%-%' then substr(a.name, 1, instr(a.name, '-', 1)-1)
else a.name end from table_name;
我们正在搜索字符串中是否包含“ - ”。如果有' - '查询在' - '之前返回字符串,则它会自动返回实际的字符串。
希望这有帮助。
答案 1 :(得分:1)
log on
答案 2 :(得分:1)
我是否过度简化了这一点,或者您不希望围绕a.name进行REGEXP_REPLACE()
调用,该调用仅保留a.name的第一部分,但不包括可选的“-#<digit>
“?以下各种例子说明了这一点。所有instr / substr东西让我头疼(授予正则表达式也可以给他们分担头痛,呵呵)。
SQL> with a(name) as (
select 'a' from dual union
select 'a-#3' from dual union
select 'b' from dual union
select 'c' from dual union
select 'efs' from dual union
select 'efs-#4' from dual
)
select regexp_replace(name, '^(.*)?(-#\d)', '\1') "a.name"
from a;
a.name
-----------------------------------------------------------------
a
a
b
c
efs
efs
6 rows selected.
SQL>
编辑:我在添加一些测试数据后意识到,如果找不到匹配条件,REGEXP_REPLACE将返回原始字符串,这可能会返回意外结果。所以,我重新设计了一个where子句,它确保a.name在测试值数组之前首先只有预期值(单个小写字母后跟行尾或可选短划线)。因此,在测试中使用它之前,请确保a.name符合您所期望的格式。无论如何,这再次显示,“总是期待意外”并测试它!
SQL> with a(name) as (
select 'a;' from dual union
select 'a-#3' from dual union
select 'a' from dual union
select 'b' from dual union
select 'c' from dual union
select 'efs' from dual union
select 'efs-#4' from dual
)
select regexp_substr(name, '^([a-z])($|?-)', 1, 1, NULL, 1) "a.name"
from a
where regexp_like(name, '^[a-z]($|?-)');
a.name
------
a
a
b
c
SQL>