问题:
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 || '%'
答案 0 :(得分: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]' )
要在没有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 '\'
答案 1 :(得分:0)
执行此操作的一种方法是使用自联接。
这是MySQL的一个例子:
SELECT t2.str1
FROM t1
INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE CONCAT(t1.str1,'\_%'))
WHERE t1.STR2 = 'NAME1'
这是尝试将其转换为Oracle语法:
SELECT t2.str1
FROM t1
INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE t1.str1 || '\_%')
WHERE t1.STR2 = 'NAME1'
答案 2 :(得分:0)
在Oracle中,我会使用
where regexp_like(str1, '[A-Z]{3}(_[0-9]+)?')