我有这张桌子:
╔════╦══════╦══════╗
║ ID ║ Test ║ DATA ║
╠════╬══════╬══════╣
║ 1 ║ Q ║ I ║
║ 2 ║ Q ║ I ║
║ 3 ║ Q ║ A ║
║ 4 ║ Q ║ A ║
║ 5 ║ Q ║ A ║
║ 6 ║ X ║ A ║
║ 7 ║ X ║ A ║
║ 8 ║ Z ║ I ║
║ 9 ║ Z ║ I ║
╚════╩══════╩══════╝
我想对列值而不是列应用唯一约束。因此,如果数据包含我,那么没有重复,如果它包含A.那么它很好 结果集将是
╔══════╦═══╗
║ Test ║ D ║
╠══════╬═══╣
║ Q ║ I ║
║ Q ║ A ║
║ Q ║ A ║
║ Q ║ A ║
║ X ║ A ║
║ X ║ A ║
║ Z ║ I ║
╚══════╩═══╝
可能吗?
答案 0 :(得分:0)
Oracle不支持过滤索引,但您可以使用表达式进行基本相同的思考:
create unique index idx_t_test_id
on t(test, (case when data = 'I' then 0 else id end));
这假设id
是唯一的而且从不为0.这可以防止重复" I"表中的值。
编辑:
我觉得你只想要一个查询结果。如果是这样的话:
select test, data
from (select t.*,
row_number(*) over (partition by test, data order by id) as cnt
from t
) t
where cnt = 1 or data <> 'I';