Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果列中的字段值在另一个表中不存在,如何将该值更改为“其他”?_Sql_Oracle - Fatal编程技术网

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

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

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

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的左连接语法。