如何只检索一个属性中存在子字符串的记录,这些属性存在于同一属性中但位于同一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,因为它的版本在不同的行中分别重复
对此的任何帮助都将非常感激:)
拉米
答案 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
如果需要调整/进一步详细说明,请发表评论。