SQL:将 SELECT 输出提供给 LIKE

标签 sql regex database oracle

问题:

select STR1 from T1 where STR2 = 'NAME1'

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

假设我有以下输出

ABC_1
MNO
XYZ

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

ABC
ABC_1
ABC_2

MNO

XYZ
XYZ_1

请注意,对于每个 STR1,STR2 始终是唯一的。

在代码方面,我想像下面这样的事情:

SELECT 
    STR1 
FROM 
    T1 
WHERE
    STR1 
LIKE '% (truncate_underscore_part(select STR1 from T1 where STR2 = 'NAME1')) %'

有什么想法吗?

第一种解决方案:

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 || '%'

最佳答案

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]' )

要在没有正则表达式函数的情况下执行此操作(对于旧的 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 '\'

关于SQL:将 SELECT 输出提供给 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807875/

相关文章:

sql - 在 SQL Server 中将多行与列转换为单行

java - 如何在json字符串java中的数字之间留一个空格?

sql - Oracle insert select max + 1 到同一张表

java - 关闭连接但仍然收到异常 : null. 消息:致命:角色 "me"的连接太多

sql - 无法将数据插入表中

MySQL 截断不正确的 DOUBLE 值错误

php - 使用 PHP 和 mysql 的多个条件 GROUP BY 和 COUNT

java - 正则表达式检测包含权重的括号

regex - Scala 正则表达式(由双引号分隔的字符串)

sql - 按用户获取未读消息