列值的唯一约束

时间:2016-02-26 16:51:14

标签: sql oracle

我有这张桌子:

╔════╦══════╦══════╗
║ 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 ║
╚══════╩═══╝

可能吗?

1 个答案:

答案 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';