如何将列中的字段值更改为“其他”字样?如果该值在另一个表中不存在?

时间:2018-04-05 21:26:42

标签: sql oracle

我有一个没有很好规范化的Oracle数据库,所以它允许在一些字段中进行自由格式输入,如果设计得更好,这些字段应该是外键到查找表。例如,Items表如下所示:

TABLE: Items
ID  |   NAME    |   CATEGORY
1       foo         cat1
2       bar         cat2
3       baz         weirdCat
...

现在,企业已经决定将批准的类别存储在如下所示的表格中,并且在使用类别的任何查询中,如果值不在批准的类别表中,则应显示为“其他”。

TABLE: ApprovedCategories
ID  |   CATEGORY
1       cat1
2       cat2

我已经想出了如何使用CASE替换值,但前提是我在我的选择中硬编码类别值,如下所示:

SELECT
    id,
    name,    
    CASE category
        WHEN 'cat1' THEN category
        WHEN 'cat2' THEN category
        ELSE 'Other'
    END AS category 
FROM
    Items;

为了尝试将其与ApprovedCategories中的值相关联,我尝试过以下代码之类的几件事,但却找不到任何有用的内容:

SELECT
    id,
    name,    
    CASE category
        WHEN IN (SELECT category FROM ApprovedCategories) THEN category 
        ELSE 'Other'
    END AS category 
FROM
    Items;

注意:要求不允许我只更新项目表中的值。我现在必须保留该表中的原始类别条目,即使它们不在ApprovedCategory表中。

2 个答案:

答案 0 :(得分:2)

使用左连接到已批准的类别表将是实现此目的的好方法。如果某个类别不存在,则a.category将为空,然后替换为"其他"。

select coalesce(a.category, 'Other')
  from Items i
  left join ApprovedCategories a on(a.category = i.category);

答案 1 :(得分:1)

怎么样:

CASE
    WHEN EXISTS (
        SELECT 1 FROM ApprovedCategories
        WHERE ApprovedCategories.category = Items.category 
    )
    THEN category
    ELSE 'Other'
END AS category