以下是我的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 (
.... ...... .......
)
答案 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_code
是IN
结果,或者只保留一个结果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'
)
我不能说我是嵌套子查询的粉丝,因此可能有一种更简单的方式来表达逻辑。