我有一个没有很好规范化的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表中。
答案 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