IN子句pl-sql

时间:2015-12-04 11:43:54

标签: oracle plsql

我遇到的情况是我在字符串中构建一个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)

谢谢

3 个答案:

答案 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>