SQL:将SELECT输出提供给LIKE

Lov*_*rus 7 regex sql database oracle

问题:

select STR1 from T1 where STR2 = 'NAME1'
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,STR1可以是{ABC,ABC_1,ABC_2,...,MNO,XYZ,XYZ_1 ......}的形式.

所以让我假设我有以下输出

ABC_1
MNO
XYZ
Run Code Online (Sandbox Code Playgroud)

现在我想提取所有匹配的STR1,包括_#之前的部分.例如,上面示例数据集的预期输出是:

ABC
ABC_1
ABC_2

MNO

XYZ
XYZ_1
Run Code Online (Sandbox Code Playgroud)

请注意,STR2始终是每个STR1唯一的.

代码明智我想象一些事情如下:

SELECT 
    STR1 
FROM 
    T1 
WHERE
    STR1 
LIKE '% (truncate_underscore_part(select STR1 from T1 where STR2 = 'NAME1')) %'
Run Code Online (Sandbox Code Playgroud)

任何的想法?

第一解决方案

select t1.str1
  from (
  select case when instr( str1, '_' ) > 0
                then substr( str1, 1, instr( str1, '_' ) - 1 )
              else str1
         end prefix
    from t1 where str2 = 'NAME1'
) prefix_list,
  t1
  where t1.str1 like prefix || '%'
Run Code Online (Sandbox Code Playgroud)

Dav*_*sta 1

with prefix_list as (
  select regexp_substr( str1, '^[A-Z]*' ) prefix from t1 where str2 = 'NAME1'
)
select t1.str1 from t1 join prefix_list
        on t1.str1 = prefix_list.prefix
           or regexp_like( t1.str1, prefix_list.prefix||'_[0-9]' )
Run Code Online (Sandbox Code Playgroud)

要在没有 regexp 函数的情况下完成此操作(对于较旧的 Oracle 版本),这在一定程度上取决于您想要验证字符串格式的程度。

select t1.str1
  from (
  select case when instr( str1, '_' ) > 0
                then substr( str1, 1, instr( str1, '_' ) - 1 )
              else str1
         end prefix
    from t1 where str2 = 'NAME1'
) prefix_list,
  t1
where t1.str1 = prefix
   or t2.str1 like prefix || '\__' escape '\'
Run Code Online (Sandbox Code Playgroud)