SQL case语句:如果为null,则返回指定字符串,否则返回select值
下面是我的sql代码的摘录,如果select语句中的值为null,我将尝试返回字符串“校外”。如果该值不为null,我希望返回该值本身。但是,我得到一个错误:ORA-00904:“站点描述”:无效标识符 90400000-%s:无效标识符 请告诉我如何处理这件事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
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函数是一些示例