SQL case语句:返回指定的字符串,如果null,则返回select值

时间:2018-02-06 20:33:55

标签: sql oracle oracle-sqldeveloper

以下是我的sql代码的摘录,我正在尝试返回一个字符串' Off-Campus'如果select语句中的值为null。如果该值不为null,我想返回值本身。但是,我收到一个错误:ORA-00904:" SITE_DESC":无效的标识符 00904. 00000 - "%s:无效的标识符"

请告知我如何解决这个问题。

WHEN 'S'   THEN (
            case when(SELECT
                site_desc
            FROM
                building
            WHERE
                site_code = (
                    SELECT
                        code
                    FROM
                        table2
                    WHERE
                            name = 'code'
                )
        ) is null then 'Off-Campus' else site_desc end
        )
WHEN 'F'   THEN (
....   ......     .......
)

3 个答案:

答案 0 :(得分:2)

尝试COALESCE

WHEN 'S'
THEN
        COALESCE(SELECT
            site_desc
        FROM
            building
        WHERE
            site_code = (
                SELECT
                    code
                FROM
                    table2
                WHERE
                        name = 'code'
            ),'Off-Campus')

答案 1 :(得分:0)

您可以使用COALESCE

WHEN 'S' THEN (
    COALESCE(SELECT site_desc
        FROM building
        WHERE site_code IN (SELECT code
            FROM table2
            WHERE name = 'code'), 
        'Off-Campus')

或者:

WHEN 'S' THEN (
    COALESCE(SELECT site_desc
        FROM building
        WHERE site_code = (SELECT TOP 1 code
            FROM table2
            WHERE name = 'code'), 
        'Off-Campus')

这两者之间的区别在于你如何处理最里面的子查询,因为它在你的where子句中你可以测试你的值site_codeIN结果,或者只保留一个结果TOP 1和测试平等。即使您只能在name = 'code'中保证一个table2,也可以采取其中任何一种做法。第一个选项可能更有用,因为它将返回name ='code'的所有代码,并测试site_code是否在结果中。

COALESCE(expression [,... expressionN])遍历从左到右传递的表达式,对每个表达式进行评估,直到它没有剩下要评估或找到一个返回null以外的值的表达式。您可以向它传递任意数量的参数,它将返回第一个非null的参数。在您的情况下,第二个表达式是硬编码字符串,第一个是可以返回null的子选择。

答案 2 :(得分:0)

您可以使用coalesce()

来撰写此内容
WHEN 'S' 
THEN coalesce( (SELECT site_desc
                FROM building
                WHERE site_code = (SELECT code FROM table2 WHERE name = 'code')
               ), 'Off-Campus'
             )

我不能说我是嵌套子查询的粉丝,因此可能有一种更简单的方式来表达逻辑。