Sql 如果列中的字段值在另一个表中不存在,如何将该值更改为“其他”?
我有一个Oracle数据库没有很好地规范化,因此它允许在几个字段中自由格式输入,如果设计得更好,这些字段应该外键到查找表中。例如,Items表如下所示:Sql 如果列中的字段值在另一个表中不存在,如何将该值更改为“其他”?,sql,oracle,Sql,Oracle,我有一个Oracle数据库没有很好地规范化,因此它允许在几个字段中自由格式输入,如果设计得更好,这些字段应该外键到查找表中。例如,Items表如下所示: TABLE: Items ID | NAME | CATEGORY 1 foo cat1 2 bar cat2 3 baz weirdCat ... SELECT id, name, CASE category
TABLE: Items
ID | NAME | CATEGORY
1 foo cat1
2 bar cat2
3 baz weirdCat
...
SELECT
id,
name,
CASE category
WHEN 'cat1' THEN category
WHEN 'cat2' THEN category
ELSE 'Other'
END AS category
FROM
Items;
业务部门现在已经决定,在如下所示的表中存储有已批准的类别,并且在使用类别的任何查询中,如果值不在已批准的类别表中,则应显示为“其他”
TABLE: ApprovedCategories
ID | CATEGORY
1 cat1
2 cat2
我已经知道了如何使用CASE替换值,但前提是我在select中硬编码类别值,如下所示:
TABLE: Items
ID | NAME | CATEGORY
1 foo cat1
2 bar cat2
3 baz weirdCat
...
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;
注意:这些要求不允许我只更新items表中的值。我现在必须保留该表中的原始类别条目,即使它们不在ApprovedCategory表中。如何:
CASE
WHEN EXISTS (
SELECT 1 FROM ApprovedCategories
WHERE ApprovedCategories.category = Items.category
)
THEN category
ELSE 'Other'
END AS category
那么:
CASE
WHEN EXISTS (
SELECT 1 FROM ApprovedCategories
WHERE ApprovedCategories.category = Items.category
)
THEN category
ELSE 'Other'
END AS category
使用左连接到approved category表将是一种很好的实现方法。如果某个类别不存在,则a.category将为空,并随后替换为其他类别
select coalesce(a.category, 'Other')
from Items i
left join ApprovedCategories a on(a.category = i.category);
使用左连接到approved category表将是一种很好的实现方法。如果某个类别不存在,则a.category将为空,并随后替换为其他类别
select coalesce(a.category, 'Other')
from Items i
left join ApprovedCategories a on(a.category = i.category);
我希望我能把两者都标为被接受,因为这个答案也很有效。我所在的团队稍微喜欢Ronnis的左连接语法。我希望我能将这两种语法都标记为已接受,因为这个答案也很有效。我所在的团队稍微喜欢Ronnis的左连接语法。