SQL case 语句:如果为空则返回指定的字符串,否则返回选择值

Posted

技术标签:

【中文标题】SQL case 语句:如果为空则返回指定的字符串,否则返回选择值【英文标题】:SQL case statement: Return specified string if null else return select value 【发布时间】:2018-02-06 20:33:55 【问题描述】:

下面是我的 sql 代码的摘录,如果 select 语句的值为 null,我试图返回一个字符串“校外”。如果值不为空,我想返回值本身。但是,我收到一个错误:ORA-00904: "SITE_DESC": invalid identifier 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 (
....   ......     .......
)

【问题讨论】:

你有几个工具可用于你想要的......存在和合并函数是一些例子 【参考方案1】:

试试COALESCE:

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

【讨论】:

我不是预言机专家,但WHERE site_code = (SELECT code FROM... 不会因为返回值中存在多个可能值而出现问题吗?不应该SELECT TOP 1 code... 来保证标量结果或WHERE site_code IN (SELECT code... 来处理多个返回值吗? 当然多行匹配会报错。但这可能无论如何都基于主键,否则您必须决定返回哪一行。或者你改用EXISTS 谢谢,效果很好。我不知道 COALESCE @jimguire 这可能对您不起作用,这取决于您选择的此处的外观(尽管这可能是由于对我们进行了消毒)如果保证 table2 中的 name 是唯一的,您没关系,如果不是,那么您会遇到返回多个代码的问题。看我的回答。【参考方案2】:

你可以使用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_code 是否为 IN 结果,或者仅通过采用 TOP 1 来保证一个结果和测试平等。即使您可以保证在table2 中只有一个name = 'code',这样做也是一种很好的做法。第一个选项可能更有用,因为它将返回 name='code' 的所有代码并测试 site_code 是否在结果中。

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

【讨论】:

【参考方案3】:

你可以用coalesce()写这个:

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

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

【讨论】:

加入可以绕过嵌套的子查询,但这需要更多的实际查询来编写......

以上是关于SQL case 语句:如果为空则返回指定的字符串,否则返回选择值的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句case怎么判断这个字段为空

SQL中isnullifnull和nullif函数用法

SQL语句case怎么判断这个字段为空

php+mysql多字段同时修改,如果传来的值为空则不修改,php该用哪种方法最好?

oracle sql语句 若某字段为空则更新此字段否则更新另一个字段,只用一个sql语句

sql 查询时有空值返回0怎么写