检查另一行中是否存在相同ID的子字符串

时间:2015-01-14 17:21:54

标签: sql oracle

如何只检索一个属性中存在子字符串的记录,这些属性存在于同一属性中但位于同一ID的不同记录中?...

详细说明我的意思是一个例子:

包含两个属性的表:
- ID
- 版本

数据如下:

ID版

1'草案1.0' 1'最终'
1'1.0'
2'草案1.2' 2'最终'

在下面的示例中,我们看到对于ID'1',第一行的子字符串中包含“1.0”。对于ID“1”,“1.0”值也出现在第三条记录中。对于ID为'2',版本'1.2'仅作为第四个记录中的子字符串..此ID本身没有版本号的记录..

我的目标是在Oracle中编写一个只返回ID为'1'的SQL,因为它的版本在不同的行中分别重复

对此的任何帮助都将非常感激:)

拉​​米

3 个答案:

答案 0 :(得分:1)

根据您的解释,更好的建议可能是@mason在评论中给出的建议:“您应该规范化您的表格。”

假设此时一个选项,我的第二个选项是添加一些包含版本号的虚拟列。至少,这将允许您轻松索引这些值以进行有效检索。我倾向于认为这也可以轻松过渡到正确的架构:

ALTER TABLE T ADD "versnum"
              GENERATED ALWAYS AS (REGEXP_SUBSTR("version",'\d+(\.\d+)+'))
;

CREATE INDEX t_versnum_idx ON T("versnum")
;

现在,您的查询就是这样的:

select "ID", "versnum" from t group by "ID", "versnum" having count(*) > 1; 

产:

 id | versnum 
----+---------
  1 | 1.0 

如果你根本不能改变架构,那么使用cte可能是你最好的选择:

with cte as (
    select T.*, REGEXP_SUBSTR("version",'\d+(\.\d+)+') "versnum"
    from t
)   
select "ID", "versnum" from cte group by "ID", "versnum" having count(*) > 1;

答案 1 :(得分:0)

这应该有效

with countOfVersion as
(select id, count(id) occurence
    from yourTable
    where regexp_like(version, '^*1.0$*$')
    group by id) select id from countOfVersion where occurence > 0;

如果要检查版本1.2,请不要忘记更改正则表达式中的1.0。

答案 2 :(得分:0)

没有正则表达式的方法:

SELECT
  T1.id
  , T1.version
FROM T T1
JOIN T T2
  ON T1.id = T2.id
AND INSTR(T2.version, T1.version) > 1
;

在行动中看到它:SQL Fiddle
如果需要调整/进一步详细说明,请发表评论。