Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 case语句:如果为null,则返回指定字符串,否则返回select值_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

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

SQL case语句:如果为null,则返回指定字符串,否则返回select值,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,下面是我的sql代码的摘录,如果select语句中的值为null,我将尝试返回字符串“校外”。如果该值不为null,我希望返回该值本身。但是,我得到一个错误:ORA-00904:“站点描述”:无效标识符 90400000-%s:无效标识符 请告诉我如何处理这件事 WHEN 'S' THEN ( case when(SELECT site_desc FROM building

下面是我的sql代码的摘录,如果select语句中的值为null,我将尝试返回字符串“校外”。如果该值不为null,我希望返回该值本身。但是,我得到一个错误:ORA-00904:“站点描述”:无效标识符 90400000-%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 (
....   ......     .......
)

尝试合并:

WHEN 'S'
THEN
        COALESCE(SELECT
            site_desc
        FROM
            building
        WHERE
            site_code = (
                SELECT
                    code
                FROM
                    table2
                WHERE
                        name = 'code'
            ),'Off-Campus')
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
                    code
                FROM
                    table2
                WHERE
                        name = 'code'
            ),'Off-Campus')
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
                    code
                FROM
                    table2
                WHERE
                        name = 'code'
            ),'Off-Campus')
WHEN 'S' THEN (
    COALESCE(SELECT site_desc
        FROM building
        WHERE site_code IN (SELECT code
            FROM table2
            WHERE name = 'code'), 
        'Off-Campus')
或:

这两者之间的区别在于如何处理最里面的子查询,因为在where子句中,您可以测试您的值
site\u code
是否在
结果中
,或者通过只取
TOP 1
并测试是否相等来保证一个结果。即使在
表2
中只能保证一个
name='code'
,也可以这样做。第一个选项可能更有用,因为它将返回name='code'的所有代码,并测试结果中是否包含site_代码


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

您可以使用
COALESCE

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

这两者之间的区别在于如何处理最里面的子查询,因为在where子句中,您可以测试您的值
site\u code
是否在
结果中
,或者通过只取
TOP 1
并测试是否相等来保证一个结果。即使在
表2
中只能保证一个
name='code'
,也可以这样做。第一个选项可能更有用,因为它将返回name='code'的所有代码,并测试结果中是否包含site_代码


COALESCE(expression[,…expressionN])
从左到右遍历传入的表达式,对每个表达式进行求值,直到没有剩余的表达式可求值,或者找到一个返回值不是null的表达式。您可以向它传递任意数量的参数,它将返回第一个非空参数。在您的例子中,第二个表达式是硬编码字符串,第一个表达式是可能返回null的subselect。

您可以使用
coalesce()
编写此表达式:


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

您可以使用
coalesce()
编写此代码:


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

我不是oracle专家,但不会
其中site\u code=(从…
中选择代码由于返回中有多个可能的值而出现问题?它不应该选择前1个代码…
以保证标量结果或
站点代码所在的位置吗(选择code…
来处理多个返回值?当然,多个匹配行将导致错误。但这可能是基于主键的,否则您必须决定返回哪一行。或者您切换到一个
EXISTS
。谢谢,这非常有效。我不知道COALESCE@jimguire这可能如果
表2
中的
名称
保证是唯一的,那么你就没问题了,如果不是,那么你在返回多个代码时会遇到问题。请参阅我的答案。我不是oracle专家,但不会
站点代码=(从…
中选择代码由于返回中有多个可能的值而出现问题?它不应该选择前1个代码…
以保证标量结果或
站点代码所在的位置吗(选择code…
来处理多个返回值?当然,多个匹配行将导致错误。但这可能是基于主键的,否则您必须决定返回哪一行。或者您切换到一个
EXISTS
。谢谢,这非常有效。我不知道COALESCE@jimguire这可能根据您的选择在此处的外观,这对您不起作用(尽管这可能是由于我们进行了消毒)如果
table2
中的
name
被保证是唯一的,那么您就可以了,如果没有,那么您在返回多个代码时就会遇到问题。请参阅我的答案。加入可以绕过嵌套的子查询,但需要编写更多的实际查询…加入可以绕过嵌套的子查询,但这需要更多的操作要编写的ual查询…您有两个工具可以满足您的需要…exists和coalesce函数是一些示例您有两个工具可以满足您的需要…exists和coalesce函数是一些示例